diff --git a/src/main/java/info/sigterm/deob/attributes/code/Instruction.java b/src/main/java/info/sigterm/deob/attributes/code/Instruction.java index 571935705c..ba7b399bd1 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instruction.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instruction.java @@ -1,11 +1,17 @@ package info.sigterm.deob.attributes.code; +import java.util.ArrayList; + public class Instruction { private Instructions instructions; private InstructionType type; - private int pc; - protected int length = 1; + + private int pc; // offset into method this instructions resides at + protected int length = 1; // length of this instruction + + private ArrayList jump = new ArrayList(); // instructions which this instruction jumps to + private ArrayList from = new ArrayList(); // instructions which jump to this instruction public Instruction(Instructions instructions, InstructionType type, int pc) { @@ -14,8 +20,27 @@ public class Instruction this.pc = pc; } + public int getPc() + { + return pc; + } + public int getLength() { return length; } + + protected void addJump(int offset) + { + Instruction other = instructions.findInstruction(pc + offset); + assert other != null; + assert other != this; + + this.jump.add(other); + other.from.add(this); + } + + public void buildJumpGraph() + { + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/Instructions.java b/src/main/java/info/sigterm/deob/attributes/code/Instructions.java index e1d5983383..29f4510e32 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instructions.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instructions.java @@ -43,10 +43,26 @@ public class Instructions } assert pc == length; + + buildJumpGraph(); + } + + private void buildJumpGraph() + { + for (Instruction i : instructions) + i.buildJumpGraph(); } public Code getCode() { return code; } + + public Instruction findInstruction(int pc) + { + for (Instruction i : instructions) + if (i.getPc() == pc) + return i; + return null; + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Branch.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Branch.java index e85d291ee3..2f72f85202 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Branch.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Branch.java @@ -20,4 +20,9 @@ public class Branch extends Instruction length += 2; } + @Override + public void buildJumpGraph() + { + this.addJump(offset); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/GotoW.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/GotoW.java index f7a81722e3..4d5d980782 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/GotoW.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/GotoW.java @@ -20,4 +20,9 @@ public class GotoW extends Instruction length += 4; } + @Override + public void buildJumpGraph() + { + this.addJump(offset); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/JSR_W.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/JSR_W.java index ddcbc8748b..4210ac44de 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/JSR_W.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/JSR_W.java @@ -20,4 +20,9 @@ public class JSR_W extends Instruction length += 4; } + @Override + public void buildJumpGraph() + { + this.addJump(offset); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LookupSwitch.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LookupSwitch.java index 0706be36f7..1847e06d5c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LookupSwitch.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LookupSwitch.java @@ -37,4 +37,12 @@ public class LookupSwitch extends Instruction length += tableSkip + 8 + (count * 8); } + + @Override + public void buildJumpGraph() + { + for (int i : branch) + this.addJump(i); + this.addJump(def); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/TableSwitch.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/TableSwitch.java index 04fafd3b28..d85be78b3a 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/TableSwitch.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/TableSwitch.java @@ -35,4 +35,12 @@ public class TableSwitch extends Instruction length += tableSkip + 12 + (count * 4); } + + @Override + public void buildJumpGraph() + { + for (int i : jumps) + this.addJump(i); + this.addJump(def); + } }