Inline static void methods with no arguments

This commit is contained in:
Adam
2015-08-08 11:06:41 -04:00
parent d09eb21a0d
commit 2e7e2d31d4
2 changed files with 17 additions and 3 deletions

View File

@@ -40,6 +40,8 @@ public class If0 extends Instruction implements JumpingInstruction, ComparisonIn
public void write(DataOutputStream out) throws IOException public void write(DataOutputStream out) throws IOException
{ {
super.write(out); super.write(out);
assert to.getInstructions() == this.getInstructions();
assert to.getInstructions().getInstructions().contains(to);
out.writeShort(to.getPc() - this.getPc()); out.writeShort(to.getPc() - this.getPc());
} }

View File

@@ -77,7 +77,6 @@ public class MethodInliner implements Deobfuscator
continue; // only inline methods called once continue; // only inline methods called once
// XXX do this later // XXX do this later
System.out.println(invokedMethod.getDescriptor().getReturnValue().getType() + " " + invokedMethod.getDescriptor().size());
if (!invokedMethod.getDescriptor().getReturnValue().getType().equals("V") if (!invokedMethod.getDescriptor().getReturnValue().getType().equals("V")
|| invokedMethod.getDescriptor().size() != 0) || invokedMethod.getDescriptor().size() != 0)
continue; continue;
@@ -116,6 +115,9 @@ public class MethodInliner implements Deobfuscator
fromI.jump.remove(invokeIns); fromI.jump.remove(invokeIns);
fromI.replace(invokeIns, nop); fromI.replace(invokeIns, nop);
fromI.jump.add(nop);
nop.from.add(fromI);
} }
invokeIns.from.clear(); invokeIns.from.clear();
@@ -132,7 +134,16 @@ public class MethodInliner implements Deobfuscator
// XXX I am assuming that this function leaves the stack in a clean state? // XXX I am assuming that this function leaves the stack in a clean state?
// instead of return, jump to next instruction after the invoke // instead of return, jump to next instruction after the invoke
Instruction oldI = i;
i = new Goto(methodInstructions, nextInstruction); i = new Goto(methodInstructions, nextInstruction);
i.jump.addAll(oldI.jump);
i.from.addAll(oldI.from);
for (Instruction i2 : oldI.from)
i2.replace(oldI, i);
oldI.from.clear();
} }
if (i instanceof LVTInstruction) if (i instanceof LVTInstruction)
@@ -144,10 +155,11 @@ public class MethodInliner implements Deobfuscator
} }
methodInstructions.getInstructions().add(idx++, i); methodInstructions.getInstructions().add(idx++, i);
i.setInstructions(methodInstructions);
} }
// old instructions go away // old method goes away
invokeMethodInstructions.getInstructions().clear(); invokeMethod.getMethods().removeMethod(invokeMethod);
} }
@Override @Override