Begin per-method executions in rename to use less memory. Runs still with 336.

This commit is contained in:
Adam
2015-11-15 13:55:25 -05:00
parent 44767a9735
commit 9a68e863bd
5 changed files with 63 additions and 8 deletions

View File

@@ -9,7 +9,6 @@ import net.runelite.deob.execution.Execution;
import net.runelite.deob.util.JarUtil; import net.runelite.deob.util.JarUtil;
// XXX something to detect final fields and evaluate them // XXX something to detect final fields and evaluate them
// XXX ORDER IN WHICH FIELDS ARE ACCESSED
public class Deob public class Deob
{ {

View File

@@ -67,7 +67,7 @@ public class IInc extends Instruction implements LVTInstruction, WideInstruction
assert vctx.getType().equals(new Type(int.class.getCanonicalName())); assert vctx.getType().equals(new Type(int.class.getCanonicalName()));
ins.read(vctx); ins.read(vctx);
vctx = new VariableContext(ins, vctx.getStackContext()); // XXX this is probably not right. vctx = new VariableContext(ins, vctx);
var.set(index, vctx); var.set(index, vctx);
frame.addInstructionContext(ins); frame.addInstructionContext(ins);

View File

@@ -22,8 +22,10 @@ import net.runelite.deob.execution.Frame;
public class Rename public class Rename
{ {
private ClassGroup groupOne, groupTwo;
// respective executions // respective executions
private Execution eone, etwo; //private Execution eone, etwo;
// old -> new object mapping // old -> new object mapping
private Map<Object, Object> objMap = new HashMap<>(); private Map<Object, Object> objMap = new HashMap<>();
@@ -78,9 +80,22 @@ public class Rename
private void process(Method one, Method two) private void process(Method one, Method two)
{ {
Execution eone = new Execution(groupOne);
eone.setBuildGraph(true);
eone.setFollowInvokes(false);
eone.addMethod(one);
eone.run();
Execution etwo = new Execution(groupTwo);
etwo.setBuildGraph(true);
etwo.setFollowInvokes(false);
etwo.addMethod(two);
etwo.run();
// get frames for respective methods // get frames for respective methods
List<Frame> f1 = eone.processedFrames.stream().filter(f -> f.getMethod() == one).collect(Collectors.toList()); List<Frame> f1 = eone.processedFrames, f2 = etwo.processedFrames;
List<Frame> f2 = etwo.processedFrames.stream().filter(f -> f.getMethod() == two).collect(Collectors.toList()); //List<Frame> f1 = eone.processedFrames.stream().filter(f -> f.getMethod() == one).collect(Collectors.toList());
//List<Frame> f2 = etwo.processedFrames.stream().filter(f -> f.getMethod() == two).collect(Collectors.toList());
Frame p1 = null, p2 = null; Frame p1 = null, p2 = null;
outer: outer:
@@ -110,12 +125,19 @@ public class Rename
} }
public void run(ClassGroup one, ClassGroup two) public void run(ClassGroup one, ClassGroup two)
{ {
eone = new Execution(one); groupOne = one;
groupTwo = two;
Execution eone = new Execution(one);
eone.setBuildGraph(true);
eone.setFollowInvokes(false);
eone.populateInitialMethods(); eone.populateInitialMethods();
List<Method> initial1 = eone.getInitialMethods().stream().sorted((m1, m2) -> m1.getName().compareTo(m2.getName())).collect(Collectors.toList()); List<Method> initial1 = eone.getInitialMethods().stream().sorted((m1, m2) -> m1.getName().compareTo(m2.getName())).collect(Collectors.toList());
eone.run(); eone.run();
etwo = new Execution(two); Execution etwo = new Execution(two);
etwo.setBuildGraph(true);
etwo.setFollowInvokes(false);
etwo.populateInitialMethods(); etwo.populateInitialMethods();
List<Method> initial2 = etwo.getInitialMethods().stream().sorted((m1, m2) -> m1.getName().compareTo(m2.getName())).collect(Collectors.toList()); List<Method> initial2 = etwo.getInitialMethods().stream().sorted((m1, m2) -> m1.getName().compareTo(m2.getName())).collect(Collectors.toList());
etwo.run(); etwo.run();
@@ -153,6 +175,12 @@ public class Rename
Method m = (Method) next.get(); Method m = (Method) next.get();
Method m2 = (Method) objMap.get(m); Method m2 = (Method) objMap.get(m);
if (m.getCode() == null || m2.getCode() == null)
{
processed.add(m);
continue;
}
System.out.println("Scanning " + m.getMethods().getClassFile().getName() + "." + m.getName() + " -> " + m2.getMethods().getClassFile().getName() + "." + m2.getName()); System.out.println("Scanning " + m.getMethods().getClassFile().getName() + "." + m.getName() + " -> " + m2.getMethods().getClassFile().getName() + "." + m2.getName());
process(m, m2); process(m, m2);
processed.add(m); processed.add(m);

View File

@@ -27,7 +27,8 @@ public class Execution
private Encryption encryption; private Encryption encryption;
public MultiValueMap<Instruction, InstructionContext> contexts = new MultiValueMap<>(); public MultiValueMap<Instruction, InstructionContext> contexts = new MultiValueMap<>();
private Map<Method, MethodContext> methodContexts = new HashMap<>(); private Map<Method, MethodContext> methodContexts = new HashMap<>();
private boolean buildGraph; private boolean buildGraph; // if true the frame graph is built and execution hasJumped also compares previous instructions
private boolean followInvokes = true;
public Execution(ClassGroup group) public Execution(ClassGroup group)
{ {
@@ -43,6 +44,16 @@ public class Execution
{ {
this.encryption = encryption; this.encryption = encryption;
} }
public boolean isFollowInvokes()
{
return followInvokes;
}
public void setFollowInvokes(boolean followInvokes)
{
this.followInvokes = followInvokes;
}
public List<Method> getInitialMethods() public List<Method> getInitialMethods()
{ {
@@ -104,6 +115,9 @@ public class Execution
public void invoke(InstructionContext from, Method to) public void invoke(InstructionContext from, Method to)
{ {
if (!this.isFollowInvokes())
return;
if (hasInvoked(from, to)) if (hasInvoked(from, to))
return; return;
@@ -112,6 +126,13 @@ public class Execution
this.addFrame(f); this.addFrame(f);
} }
public void addMethod(Method to)
{
Frame f = new Frame(this, to);
f.initialize();
this.addFrame(f);
}
public void run() public void run()
{ {
int fcount = 0; int fcount = 0;

View File

@@ -22,6 +22,13 @@ public class VariableContext
this.type = type; this.type = type;
} }
public VariableContext(InstructionContext i, VariableContext other)
{
ic = i;
ctx = other.ctx;
type = other.type;
}
public StackContext getStackContext() public StackContext getStackContext()
{ {
return ctx; return ctx;