Rewrite field inliner

This commit is contained in:
Adam
2016-03-25 22:10:26 -04:00
parent c22a9e43da
commit 35628b4497
2 changed files with 53 additions and 12 deletions

View File

@@ -1,5 +1,7 @@
package net.runelite.deob.deobfuscators;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import net.runelite.asm.ClassFile;
import net.runelite.asm.ClassGroup;
import net.runelite.deob.Deobfuscator;
@@ -18,13 +20,16 @@ import net.runelite.asm.attributes.code.instructions.LDC_W;
import net.runelite.asm.attributes.code.instructions.NOP;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import net.runelite.asm.attributes.code.instruction.types.GetFieldInstruction;
public class FieldInliner implements Deobfuscator
{
private ClassGroup group;
private Multimap<Field, FieldInstruction> fieldInstructions = HashMultimap.create();
private List<Field> fields = new ArrayList<>();
private List<FieldInstruction> findFieldIns(Field field, boolean set)
private void findFieldIns()
{
List<FieldInstruction> ins = new ArrayList<>();
@@ -44,18 +49,13 @@ public class FieldInliner implements Deobfuscator
FieldInstruction sf = (FieldInstruction) i;
if (sf.getMyField() != field)
if (sf.getMyField() == null)
continue;
if (sf instanceof SetFieldInstruction != set)
continue;
ins.add(sf);
fieldInstructions.put(sf.getMyField(), sf);
}
}
}
return ins;
}
private void makeConstantValues()
@@ -71,8 +71,8 @@ public class FieldInliner implements Deobfuscator
ConstantValue constantValue = (ConstantValue) attributes.findType(AttributeType.CONSTANT_VALUE);
if (constantValue != null)
continue;
List<FieldInstruction> sfis = findFieldIns(f, true);
List<FieldInstruction> sfis = fieldInstructions.get(f).stream().filter(f2 -> f2 instanceof SetFieldInstruction).collect(Collectors.toList());
if (sfis.size() != 1)
continue;
@@ -126,7 +126,7 @@ public class FieldInliner implements Deobfuscator
for (Field f : fields)
{
// replace getfield with constant push
List<FieldInstruction> fins = findFieldIns(f, false);
List<FieldInstruction> fins = fieldInstructions.get(f).stream().filter(f2 -> f2 instanceof GetFieldInstruction).collect(Collectors.toList());
ConstantValue value = (ConstantValue) f.getAttributes().findType(AttributeType.CONSTANT_VALUE);
for (FieldInstruction fin : fins)
@@ -161,6 +161,7 @@ public class FieldInliner implements Deobfuscator
public void run(ClassGroup group)
{
this.group = group;
findFieldIns();
makeConstantValues();
int count = inlineUse();

View File

@@ -0,0 +1,40 @@
package net.runelite.deob.deobfuscators;
import java.io.File;
import java.io.IOException;
import net.runelite.asm.ClassGroup;
import net.runelite.deob.util.JarUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
public class FieldInlinerTest
{
private static final File GAMEPACK = new File(RenameUniqueTest.class.getResource("/gamepack_v16.jar").getFile());
@Rule
public TemporaryFolder folder = new TemporaryFolder();
private ClassGroup group;
@Before
public void before() throws IOException
{
group = JarUtil.loadJar(GAMEPACK);
}
@After
public void after() throws IOException
{
JarUtil.saveJar(group, folder.newFile());
}
@Test
public void testRun()
{
FieldInliner fi = new FieldInliner();
fi.run(group);
}
}