Merge branch 'master+rename5' into HEAD

This commit is contained in:
Adam
2016-01-25 16:22:03 -05:00
4 changed files with 82 additions and 42 deletions

View File

@@ -17,7 +17,7 @@ import net.runelite.deob.execution.ParallellMappingExecutor;
public class MappingExecutorUtil public class MappingExecutorUtil
{ {
// won't work with static funcs etc // won't work with static funcs etc. this is all wrong. XXX
public static boolean isMappable(Method m1, Method m2) public static boolean isMappable(Method m1, Method m2)
{ {
assert (m1.getCode() == null) == (m2.getCode() == null); assert (m1.getCode() == null) == (m2.getCode() == null);
@@ -101,7 +101,10 @@ public class MappingExecutorUtil
MappableInstruction mi1 = (MappableInstruction) p1.getInstruction(), MappableInstruction mi1 = (MappableInstruction) p1.getInstruction(),
mi2 = (MappableInstruction) p2.getInstruction(); mi2 = (MappableInstruction) p2.getInstruction();
assert mi1.isSame(p1, p2); if (!mi1.isSame(p1, p2))
{
assert mi1.isSame(p1, p2);
}
//assert p1.getInstruction().getClass().equals(p2.getInstruction().getClass()); //assert p1.getInstruction().getClass().equals(p2.getInstruction().getClass());
mi1.map(mappings, p1, p2); mi1.map(mappings, p1, p2);

View File

@@ -150,15 +150,6 @@ public class Execution
System.out.println("Processed " + fcount + " frames"); System.out.println("Processed " + fcount + " frames");
} }
// public InstructionContext getPaused()
// {
// if (frames.isEmpty())
// return null;
//
// Frame f = frames.get(0);
// return f.getInstructions().get(f.getInstructions().size() - 1);
// }
public Collection<InstructionContext> getInstructonContexts(Instruction i) public Collection<InstructionContext> getInstructonContexts(Instruction i)
{ {
return contexts.getCollection(i); return contexts.getCollection(i);

View File

@@ -3,6 +3,7 @@ package net.runelite.deob.execution;
import java.util.List; import java.util.List;
import net.runelite.deob.Method; import net.runelite.deob.Method;
import net.runelite.deob.attributes.code.instruction.types.ReturnInstruction; import net.runelite.deob.attributes.code.instruction.types.ReturnInstruction;
import net.runelite.deob.attributes.code.instructions.InvokeSpecial;
import net.runelite.deob.attributes.code.instructions.InvokeStatic; import net.runelite.deob.attributes.code.instructions.InvokeStatic;
import net.runelite.deob.deobfuscators.rename.MappingExecutorUtil; import net.runelite.deob.deobfuscators.rename.MappingExecutorUtil;
@@ -17,6 +18,7 @@ public class ParallellMappingExecutor
this.e2 = two; this.e2 = two;
} }
boolean step1 = true, step2 = true;
public boolean step() public boolean step()
{ {
assert e.frames.size() == e2.frames.size(); assert e.frames.size() == e2.frames.size();
@@ -48,8 +50,10 @@ public class ParallellMappingExecutor
} }
// step frame // step frame
f1.execute(); if (step1)
f2.execute(); f1.execute();
if (step2)
f2.execute();
f1 = popStack(f1); f1 = popStack(f1);
f2 = popStack(f2); f2 = popStack(f2);
@@ -83,17 +87,57 @@ public class ParallellMappingExecutor
return step(); return step();
} }
Frame oldf1 = f1, oldf2 = f2;
if (MappingExecutorUtil.isInlineable(p1.getInstruction()) && !MappingExecutorUtil.isInlineable(p2.getInstruction())) if (MappingExecutorUtil.isInlineable(p1.getInstruction()) && !MappingExecutorUtil.isInlineable(p2.getInstruction()))
{ {
f1 = stepInto(f1); f1 = stepInto(f1);
f1 = popStack(f1); try
p1 = f1.getInstructions().get(f1.getInstructions().size() - 1); {
step2 = false;
return step();
}
finally
{
step2 = true;
}
//f1 = popStack(f1);
//p1 = f1.getInstructions().get(f1.getInstructions().size() - 1);
} }
else if (MappingExecutorUtil.isInlineable(p2.getInstruction()) && !MappingExecutorUtil.isInlineable(p1.getInstruction())) else if (MappingExecutorUtil.isInlineable(p2.getInstruction()) && !MappingExecutorUtil.isInlineable(p1.getInstruction()))
{ {
f2 = stepInto(f2); f2 = stepInto(f2);
f2 = popStack(f2); //f2 = popStack(f2);
p2 = f2.getInstructions().get(f2.getInstructions().size() - 1); //p2 = f2.getInstructions().get(f2.getInstructions().size() - 1);
try
{
step1 = false;
return step();
}
finally
{
step1 = true;
}
}
else if (MappingExecutorUtil.isInlineable(p1.getInstruction()) && MappingExecutorUtil.isInlineable(p2.getInstruction()))
{
// p1s func might equal p2s func
// step into both at once, and insert to beginning of e.frames
// when two funcs exit at once, map them then (if static?)
// f1 = stepInto(f1);
// f1 = popStack(f1);
// p1 = f1.getInstructions().get(f1.getInstructions().size() - 1);
//
// f2 = stepInto(f2);
// f2 = popStack(f2);
// p2 = f2.getInstructions().get(f2.getInstructions().size() - 1);
}
if (p1.getInstruction() instanceof InvokeSpecial && p2.getInstruction() instanceof InvokeStatic)
{
int i = 5;
} }
assert e.paused; assert e.paused;
@@ -124,8 +168,10 @@ public class ParallellMappingExecutor
InvokeStatic is = (InvokeStatic) i.getInstruction(); InvokeStatic is = (InvokeStatic) i.getInstruction();
List<Method> methods = is.getMethods(); List<Method> methods = is.getMethods();
if (methods.isEmpty()) // not my method
return null; assert methods.size() == 1;
//if (methods.isEmpty()) // not my method
// return null;
Method to = is.getMethods().get(0); Method to = is.getMethods().get(0);
@@ -145,7 +191,7 @@ public class ParallellMappingExecutor
f2.returnTo = new Frame(f); // where to go when we're done f2.returnTo = new Frame(f); // where to go when we're done
// step new frame // step new frame
f2.execute(); //f2.execute();
return f2; return f2;
} }

View File

@@ -34,7 +34,7 @@ public class MapStaticTest
{ "client.init", "client.init" }, { "client.init", "client.init" },
{ "class162.method3270", "class86.method2020" }, { "class162.method3270", "class86.method2020" },
{ "class29.method711", "class36.method742" }, { "class29.method711", "class36.method742" },
{ "class72.run", "class72.run" }, //{ "class72.run", "class72.run" },
}; };
// @Test // @Test
@@ -57,30 +57,30 @@ public class MapStaticTest
// } // }
//@Test //@Test
// public void testAll() throws IOException public void testAll() throws IOException
// {
// ClassGroup group1 = JarUtil.loadJar(new File("d:/rs/07/adamin1.jar"));
// ClassGroup group2 = JarUtil.loadJar(new File("d:/rs/07/adamin2.jar"));
//
// for (String[] s : methods)
// {
// String[] one = s[0].split("\\."), two = s[1].split("\\.");
//
// Method m1 = group1.findClass(one[0]).findMethod(one[1]);
// Method m2 = group2.findClass(two[0]).findMethod(two[1]);
//
// ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2);
// }
// }
//@Test
public void test() throws IOException
{ {
ClassGroup group1 = JarUtil.loadJar(new File("d:/rs/07/adamin1.jar")); ClassGroup group1 = JarUtil.loadJar(new File("d:/rs/07/adamin1.jar"));
ClassGroup group2 = JarUtil.loadJar(new File("d:/rs/07/adamin2.jar")); ClassGroup group2 = JarUtil.loadJar(new File("d:/rs/07/adamin2.jar"));
Method m1 = group1.findClass("class72").findMethod("run"); for (String[] s : methods)
Method m2 = group2.findClass("class72").findMethod("run"); {
String[] one = s[0].split("\\."), two = s[1].split("\\.");
Method m1 = group1.findClass(one[0]).findMethod(one[1]);
Method m2 = group2.findClass(two[0]).findMethod(two[1]);
ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2);
}
}
@Test
public void test() throws IOException
{
ClassGroup group1 = JarUtil.loadJar(new File("d:/rs/07/adamin1.jar"));
ClassGroup group2 = JarUtil.loadJar(new File("d:/rs/07/adamin2.jar"));
Method m1 = group1.findClass("client").findMethod("vmethod3054");
Method m2 = group2.findClass("client").findMethod("vmethod2973");
ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2); ParallelExecutorMapping mappings = MappingExecutorUtil.map(m1, m2);
@@ -91,7 +91,7 @@ public class MapStaticTest
} }
} }
@Test //@Test
public void testDeep() throws IOException public void testDeep() throws IOException
{ {
ClassGroup group1 = JarUtil.loadJar(new File("d:/rs/07/adamin1.jar")); ClassGroup group1 = JarUtil.loadJar(new File("d:/rs/07/adamin1.jar"));