diff --git a/src/main/java/net/runelite/deob/attributes/code/Instruction.java b/src/main/java/net/runelite/deob/attributes/code/Instruction.java index 88299f60f2..9db98de703 100644 --- a/src/main/java/net/runelite/deob/attributes/code/Instruction.java +++ b/src/main/java/net/runelite/deob/attributes/code/Instruction.java @@ -228,4 +228,14 @@ public abstract class Instruction public void renameMethod(Method oldMethod, net.runelite.deob.pool.Method newMethod) { } + + public Instruction makeGeneric() + { + return this; + } + + public Instruction makeSpecific() + { + return this; + } } diff --git a/src/main/java/net/runelite/deob/attributes/code/Instructions.java b/src/main/java/net/runelite/deob/attributes/code/Instructions.java index 096bd8d791..54df6cf832 100644 --- a/src/main/java/net/runelite/deob/attributes/code/Instructions.java +++ b/src/main/java/net/runelite/deob/attributes/code/Instructions.java @@ -43,8 +43,14 @@ public class Instructions { Constructor con = type.getInstructionClass().getConstructor(Instructions.class, InstructionType.class, int.class); Instruction ins = con.newInstance(this, type, pc); + Instruction genericIns = ins.makeGeneric(); + + if (genericIns != ins) + { + genericIns.setPc(ins.getPc()); + } - instructions.add(ins); + instructions.add(genericIns); int len = ins.getLength(); pc += len; @@ -168,6 +174,16 @@ public class Instructions public void write(DataOutputStream out) throws IOException { + // trnaslate instructions to specific + for (Instruction i : new ArrayList<>(instructions)) + { + Instruction specific = i.makeSpecific(); + if (i != specific) + { + replace(i, specific); + } + } + // generate pool indexes for (Instruction i : new ArrayList<>(instructions)) i.prime(); diff --git a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_0.java b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_0.java index 94f5817898..5a2e50663b 100644 --- a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_0.java +++ b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_0.java @@ -18,6 +18,11 @@ public class IConst_0 extends Instruction implements PushConstantInstruction { super(instructions, type, pc); } + + public IConst_0(Instructions instructions) + { + super(instructions, InstructionType.ICONST_0, 0); + } @Override public void execute(Frame frame) @@ -44,4 +49,10 @@ public class IConst_0 extends Instruction implements PushConstantInstruction { return new LDC_W(this.getInstructions(), entry); } + + @Override + public Instruction makeGeneric() + { + return new LDC_W(this.getInstructions(), getConstant()); + } } diff --git a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_1.java b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_1.java index 4d8e47a43b..57ee54e0ec 100644 --- a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_1.java +++ b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_1.java @@ -18,6 +18,11 @@ public class IConst_1 extends Instruction implements PushConstantInstruction { super(instructions, type, pc); } + + public IConst_1(Instructions instructions) + { + super(instructions, InstructionType.ICONST_1, 0); + } @Override public void execute(Frame frame) @@ -44,4 +49,10 @@ public class IConst_1 extends Instruction implements PushConstantInstruction { return new LDC_W(this.getInstructions(), entry); } + + @Override + public Instruction makeGeneric() + { + return new LDC_W(this.getInstructions(), getConstant()); + } } diff --git a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_2.java b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_2.java index 35db6fa314..a51e1cc3ca 100644 --- a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_2.java +++ b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_2.java @@ -18,6 +18,11 @@ public class IConst_2 extends Instruction implements PushConstantInstruction { super(instructions, type, pc); } + + public IConst_2(Instructions instructions) + { + super(instructions, InstructionType.ICONST_2, 0); + } @Override public void execute(Frame frame) @@ -44,4 +49,10 @@ public class IConst_2 extends Instruction implements PushConstantInstruction { return new LDC_W(this.getInstructions(), entry); } + + @Override + public Instruction makeGeneric() + { + return new LDC_W(this.getInstructions(), getConstant()); + } } diff --git a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_3.java b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_3.java index aefb49894a..02af0586c6 100644 --- a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_3.java +++ b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_3.java @@ -18,6 +18,11 @@ public class IConst_3 extends Instruction implements PushConstantInstruction { super(instructions, type, pc); } + + public IConst_3(Instructions instructions) + { + super(instructions, InstructionType.ICONST_3, 0); + } @Override public void execute(Frame frame) @@ -44,4 +49,10 @@ public class IConst_3 extends Instruction implements PushConstantInstruction { return new LDC_W(this.getInstructions(), entry); } + + @Override + public Instruction makeGeneric() + { + return new LDC_W(this.getInstructions(), getConstant()); + } } diff --git a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_4.java b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_4.java index e672610cb9..815c0736e4 100644 --- a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_4.java +++ b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_4.java @@ -18,6 +18,11 @@ public class IConst_4 extends Instruction implements PushConstantInstruction { super(instructions, type, pc); } + + public IConst_4(Instructions instructions) + { + super(instructions, InstructionType.ICONST_4, 0); + } @Override public void execute(Frame frame) @@ -44,4 +49,10 @@ public class IConst_4 extends Instruction implements PushConstantInstruction { return new LDC_W(this.getInstructions(), entry); } + + @Override + public Instruction makeGeneric() + { + return new LDC_W(this.getInstructions(), getConstant()); + } } diff --git a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_5.java b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_5.java index f071b901cf..416473bd8f 100644 --- a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_5.java +++ b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_5.java @@ -18,6 +18,11 @@ public class IConst_5 extends Instruction implements PushConstantInstruction { super(instructions, type, pc); } + + public IConst_5(Instructions instructions) + { + super(instructions, InstructionType.ICONST_5, 0); + } @Override public void execute(Frame frame) @@ -44,4 +49,10 @@ public class IConst_5 extends Instruction implements PushConstantInstruction { return new LDC_W(this.getInstructions(), entry); } + + @Override + public Instruction makeGeneric() + { + return new LDC_W(this.getInstructions(), getConstant()); + } } diff --git a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_M1.java b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_M1.java index e0eda969ce..7e41464342 100644 --- a/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_M1.java +++ b/src/main/java/net/runelite/deob/attributes/code/instructions/IConst_M1.java @@ -18,6 +18,11 @@ public class IConst_M1 extends Instruction implements PushConstantInstruction { super(instructions, type, pc); } + + public IConst_M1(Instructions instructions) + { + super(instructions, InstructionType.ICONST_M1, 0); + } @Override public void execute(Frame frame) diff --git a/src/main/java/net/runelite/deob/attributes/code/instructions/LDC_W.java b/src/main/java/net/runelite/deob/attributes/code/instructions/LDC_W.java index 2b2e0d993a..a358f84ae1 100644 --- a/src/main/java/net/runelite/deob/attributes/code/instructions/LDC_W.java +++ b/src/main/java/net/runelite/deob/attributes/code/instructions/LDC_W.java @@ -110,4 +110,35 @@ public class LDC_W extends Instruction implements PushConstantInstruction value = entry; return this; } + + @Override + public Instruction makeSpecific() + { + switch (value.getType()) + { + case INTEGER: + { + int i = (int) value.getObject(); + switch (i) + { + case -1: + return new IConst_M1(this.getInstructions()); + case 0: + return new IConst_0(this.getInstructions()); + case 1: + return new IConst_1(this.getInstructions()); + case 2: + return new IConst_2(this.getInstructions()); + case 3: + return new IConst_3(this.getInstructions()); + case 4: + return new IConst_4(this.getInstructions()); + case 5: + return new IConst_5(this.getInstructions()); + } + } + } + + return super.makeSpecific(); + } }