diff --git a/src/main/java/info/sigterm/deob/ConstantPool.java b/src/main/java/info/sigterm/deob/ConstantPool.java index 0131a635a8..b4ea412b84 100644 --- a/src/main/java/info/sigterm/deob/ConstantPool.java +++ b/src/main/java/info/sigterm/deob/ConstantPool.java @@ -136,12 +136,6 @@ public class ConstantPool return (NameAndType) getEntry(index); } - public Object get(int index) - { - PoolEntry entry = getEntry(index); - return entry.getObject(); - } - public int make(PoolEntry entry) { int i = 1; diff --git a/src/main/java/info/sigterm/deob/Deob.java b/src/main/java/info/sigterm/deob/Deob.java index 66d9d44218..8c0c19ce51 100644 --- a/src/main/java/info/sigterm/deob/Deob.java +++ b/src/main/java/info/sigterm/deob/Deob.java @@ -1,6 +1,9 @@ package info.sigterm.deob; import info.sigterm.deob.execution.Execution; +import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; import info.sigterm.deob.pool.NameAndType; import info.sigterm.deob.attributes.Code; import info.sigterm.deob.attributes.code.Block; @@ -50,7 +53,7 @@ public class Deob checkBlockGraph(group); //checkParameters(group); - //execute(group); + execute(group); JarOutputStream jout = new JarOutputStream(new FileOutputStream(args[1]), new Manifest()); @@ -71,11 +74,21 @@ public class Deob private static void execute(ClassGroup group) throws IOException { - ClassFile cf = group.findClass("client"); - Method method = cf.findMethod("init"); - Execution e = new Execution(group); - e.run(cf, method); + + int count = 0, fcount = 0; + for (ClassFile cf : group.getClasses()) + for (Method method : cf.getMethods().getMethods()) + { + if (method.getCode() == null) + continue; + Frame f = new Frame(e, method); + e.frames.add(f); + fcount += e.run(); + ++count; + } + + System.out.println("Processed " + count + " methods and " + fcount + " paths"); } private static void checkCallGraph(ClassGroup group) 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 80fb5ddd25..fffe6d34c7 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instruction.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instruction.java @@ -50,6 +50,11 @@ public abstract class Instruction return instructions; } + public InstructionType getType() + { + return type; + } + public ConstantPool getPool() { return instructions.getCode().getAttributes().getClassFile().getPool(); diff --git a/src/main/java/info/sigterm/deob/attributes/code/instruction/types/WideInstruction.java b/src/main/java/info/sigterm/deob/attributes/code/instruction/types/WideInstruction.java new file mode 100644 index 0000000000..1cfa1daa96 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/instruction/types/WideInstruction.java @@ -0,0 +1,9 @@ +package info.sigterm.deob.attributes.code.instruction.types; + +import java.io.DataOutputStream; +import java.io.IOException; + +public interface WideInstruction +{ + public void writeWide(DataOutputStream out, int pc) throws IOException; +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AALoad.java index ef28876614..25e79f1725 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AALoad.java @@ -3,9 +3,10 @@ package info.sigterm.deob.attributes.code.instructions; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; -import info.sigterm.deob.execution.ArrayInstance; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class AALoad extends Instruction { @@ -17,14 +18,17 @@ public class AALoad extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - int index = (int) stack.pop(); - ArrayInstance array = (ArrayInstance) stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - if (index >= 0 && index < array.getLength()) - stack.push(this, array.get(index)); - else - frame.getPath().throwException(this, null); + ins.pop(index, array); + + StackContext ctx = new StackContext(ins, array.getType().getSubtype()); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AAStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AAStore.java index 93848db640..f385aeae0e 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AAStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AAStore.java @@ -3,9 +3,10 @@ package info.sigterm.deob.attributes.code.instructions; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; -import info.sigterm.deob.execution.ArrayInstance; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class AAStore extends Instruction { @@ -17,15 +18,17 @@ public class AAStore extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Object value = stack.pop(); - int index = (int) stack.pop(); - ArrayInstance array = (ArrayInstance) stack.pop(); + StackContext value = stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - if (array == null) - return; + ins.pop(value); + ins.pop(index); + ins.pop(array); - array.put(value, index); + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AConstNull.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AConstNull.java index 980bafe1b6..733be14ecb 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AConstNull.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AConstNull.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class AConstNull extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, null); + + StackContext ctx = new StackContext(ins, Object.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad.java index 33eda525f6..b38809d8d7 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad.java @@ -4,13 +4,19 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; +import info.sigterm.deob.attributes.code.instruction.types.WideInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class ALoad extends Instruction implements LVTInstruction +public class ALoad extends Instruction implements LVTInstruction, WideInstruction { private int index; @@ -23,6 +29,15 @@ public class ALoad extends Instruction implements LVTInstruction length += 1; } + public ALoad(Instructions instructions, InstructionType type, Instruction instruction, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readShort(); + length += 2; + } + @Override public void write(DataOutputStream out, int pc) throws IOException { @@ -33,8 +48,17 @@ public class ALoad extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(index); - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables var = frame.getVariables(); + + VariableContext vctx = var.get(index); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override @@ -48,4 +72,11 @@ public class ALoad extends Instruction implements LVTInstruction { return false; } + + @Override + public void writeWide(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_0.java index 64333e96e1..07f9da9c84 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_0.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,8 +23,17 @@ public class ALoad_0 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(0); - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables var = frame.getVariables(); + + VariableContext vctx = var.get(0); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_1.java index e1b3f93b0b..c139668572 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_1.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,8 +23,17 @@ public class ALoad_1 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(1); - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables var = frame.getVariables(); + + VariableContext vctx = var.get(1); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_2.java index 79028efe52..51e31397c7 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_2.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,8 +23,17 @@ public class ALoad_2 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(2); - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables var = frame.getVariables(); + + VariableContext vctx = var.get(2); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_3.java index 0cacbc1005..7d381c6130 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_3.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,8 +23,17 @@ public class ALoad_3 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(3); - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables var = frame.getVariables(); + + VariableContext vctx = var.get(3); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ANewArray.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ANewArray.java index 1139e5e7ac..b710f29e3f 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ANewArray.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ANewArray.java @@ -1,12 +1,13 @@ package info.sigterm.deob.attributes.code.instructions; -import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; -import info.sigterm.deob.execution.ArrayInstance; -import info.sigterm.deob.execution.ClassInstance; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import info.sigterm.deob.pool.Class; import java.io.DataInputStream; @@ -37,20 +38,17 @@ public class ANewArray extends Instruction @Override public void execute(Frame frame) { - ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); - int count = (int) frame.getStack().pop(); + StackContext count = stack.pop(); - ClassFile cf = thisClass.getGroup().findClass(clazz.getName()); - if (cf == null) - { - frame.getStack().push(this, null); - return; - } + ins.pop(count); - ClassInstance type = frame.getPath().getClassInstance(cf); - ArrayInstance array = frame.getPath().createArray(type, count); + Type t = new Type(new info.sigterm.deob.signature.Type("[" + clazz.getName())); + StackContext ctx = new StackContext(ins, t); + stack.push(ctx); - frame.getStack().push(this, array); + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore.java index eb23324756..99fca89183 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore.java @@ -4,13 +4,19 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; +import info.sigterm.deob.attributes.code.instruction.types.WideInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class AStore extends Instruction implements LVTInstruction +public class AStore extends Instruction implements LVTInstruction, WideInstruction { private int index; @@ -23,6 +29,15 @@ public class AStore extends Instruction implements LVTInstruction length += 1; } + public AStore(Instructions instructions, InstructionType type, Instruction instruction, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readShort(); + length += 2; + } + @Override public void write(DataOutputStream out, int pc) throws IOException { @@ -33,8 +48,16 @@ public class AStore extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - frame.getVariables().set(index, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext object = stack.pop(); + ins.pop(object); + + variables.set(index, new VariableContext(ins, object.getType())); + + frame.addInstructionContext(ins); } @Override @@ -48,4 +71,11 @@ public class AStore extends Instruction implements LVTInstruction { return true; } + + @Override + public void writeWide(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_0.java index 9b02a5f42a..462a9d2900 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_0.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,8 +23,16 @@ public class AStore_0 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - frame.getVariables().set(0, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext object = stack.pop(); + ins.pop(object); + + variables.set(0, new VariableContext(ins, object.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_1.java index 30ef8a7c14..0f6a54d2bf 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_1.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,8 +23,16 @@ public class AStore_1 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - frame.getVariables().set(1, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext object = stack.pop(); + ins.pop(object); + + variables.set(1, new VariableContext(ins, object.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_2.java index 4dfb48041b..0ad866c3ed 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_2.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,8 +23,16 @@ public class AStore_2 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - frame.getVariables().set(2, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext object = stack.pop(); + ins.pop(object); + + variables.set(2, new VariableContext(ins, object.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_3.java index 2940295816..a3d441dfc8 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_3.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,8 +23,16 @@ public class AStore_3 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - frame.getVariables().set(3, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext object = stack.pop(); + ins.pop(object); + + variables.set(3, new VariableContext(ins, object.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AThrow.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AThrow.java index 16a4595f36..e05eeb1791 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AThrow.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AThrow.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.ObjectInstance; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -16,10 +18,18 @@ public class AThrow extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - ObjectInstance exception = (ObjectInstance) e.getStack().pop(); - e.getPath().throwException(this, exception); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + // XXX this actually clears the stack and puts only the value on, after jumping to the handler + //StackContext value = stack.pop(); + //ins.pop(value); + + frame.addInstructionContext(ins); + + frame.throwException(null);//value.getType()); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ArrayLength.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ArrayLength.java index 6f73a0073c..381a80dad0 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ArrayLength.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ArrayLength.java @@ -3,8 +3,10 @@ package info.sigterm.deob.attributes.code.instructions; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; -import info.sigterm.deob.execution.ArrayInstance; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,16 @@ public class ArrayLength extends Instruction @Override public void execute(Frame frame) { - ArrayInstance array = (ArrayInstance) frame.getStack().pop(); - frame.getStack().push(this, array.getLength()); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext array = stack.pop(); + + ins.pop(array); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/BALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/BALoad.java index 0f93468bb3..1dde417217 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/BALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/BALoad.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class BALoad extends Instruction { @@ -16,11 +18,17 @@ public class BALoad extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - int index = (int) stack.pop(); - boolean[] array = (boolean[]) stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - stack.push(this, array[index]); + ins.pop(index, array); + + StackContext ctx = new StackContext(ins, int.class); // sign extend + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/BAStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/BAStore.java index 25bbce3269..41af93be6e 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/BAStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/BAStore.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class BAStore extends Instruction { @@ -16,12 +18,15 @@ public class BAStore extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - boolean value = (boolean) stack.pop(); - int index = (int) stack.pop(); - boolean[] array = (boolean[]) stack.pop(); + StackContext value = stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - array[index] = value; + ins.pop(value, index, array); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/BiPush.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/BiPush.java index 23abf5e537..4129794ee7 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/BiPush.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/BiPush.java @@ -4,6 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -32,6 +35,12 @@ public class BiPush extends Instruction @Override public void execute(Frame frame) { - frame.getStack().push(this, (int) b); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext ctx = new StackContext(ins, int.class); // bipush sign extends the value to an int + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/CALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/CALoad.java index d1aa988d37..818b96ca32 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/CALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/CALoad.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class CALoad extends Instruction { @@ -16,11 +18,17 @@ public class CALoad extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - int index = (int) stack.pop(); - char[] array = (char[]) stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - stack.push(this, array[index]); + ins.pop(index, array); + + StackContext ctx = new StackContext(ins, int.class); // zero extended to int + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/CAStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/CAStore.java index d58b5eaf3f..ec37104843 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/CAStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/CAStore.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class CAStore extends Instruction { @@ -16,12 +18,15 @@ public class CAStore extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - char value = (char) stack.pop(); - int index = (int) stack.pop(); - char[] array = (char[]) stack.pop(); + StackContext value = stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - array[index] = value; + ins.pop(value, index, array); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/CheckCast.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/CheckCast.java index 7326f178e0..7251e4b8cf 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/CheckCast.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/CheckCast.java @@ -6,7 +6,10 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.ObjectInstance; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import info.sigterm.deob.pool.Class; import java.io.DataInputStream; @@ -34,28 +37,18 @@ public class CheckCast extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); - - ConstantPool pool = thisClass.getPool(); + Frame other = frame.dup(); + Stack stack = other.getStack(); - ObjectInstance obj = (ObjectInstance) e.getStack().pop(); - if (obj == null) - { - e.getStack().push(this, null); - return; - } + InstructionContext ins = new InstructionContext(this, other); - ClassFile otherClass = thisClass.getGroup().findClass(clazz.getName()); - boolean instanceOf = obj.getType().getClassFile().instanceOf(otherClass); + StackContext what = stack.pop(); - if (!instanceOf) - { - // XXX throw - } + ins.pop(what); - e.getStack().push(this, obj); + other.throwException(new Type("java.lang.ClassCastException")); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/D2F.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/D2F.java index 44c5f7b7bf..acadb007fd 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/D2F.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/D2F.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,16 @@ public class D2F extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Double; - - Double d = (Double) obj; - stack.push(this, d.floatValue()); + + StackContext value = stack.pop(); + + ins.pop(value); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/D2I.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/D2I.java index 21e83b59b5..d02222f5e1 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/D2I.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/D2I.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,16 @@ public class D2I extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Double; - - Double d = (Double) obj; - stack.push(this, d.intValue()); + + StackContext value = stack.pop(); + + ins.pop(value); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/D2L.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/D2L.java index a812b09a2e..8f7828c62b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/D2L.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/D2L.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,16 @@ public class D2L extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Double; - - Double d = (Double) obj; - stack.push(this, d.longValue()); + + StackContext value = stack.pop(); + + ins.pop(value); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DALoad.java index 8a46a15f08..1ef544d6cb 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DALoad.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class DALoad extends Instruction { @@ -16,11 +18,17 @@ public class DALoad extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - int index = (int) stack.pop(); - double[] array = (double[]) stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - stack.push(this, array[index]); + ins.pop(index, array); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DAStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DAStore.java index 82c9587f2e..bd787ac8bc 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DAStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DAStore.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class DAStore extends Instruction { @@ -16,12 +18,15 @@ public class DAStore extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - double value = (double) stack.pop(); - int index = (int) stack.pop(); - double[] array = (double[]) stack.pop(); + StackContext value = stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - array[index] = value; + ins.pop(value, index, array); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DAdd.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DAdd.java index c4d9b2b8df..62a7d1df9c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DAdd.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DAdd.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class DAdd extends Instruction { @@ -16,11 +18,17 @@ public class DAdd extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Double two = (Double) stack.pop(); - Double one = (Double) stack.pop(); + StackContext two = stack.pop(); + StackContext one = stack.pop(); - stack.push(this, one + two); + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpG.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpG.java index e41ef4ff31..d724502ccd 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpG.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpG.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,18 +20,17 @@ public class DCmpG extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Double one = (Double) stack.pop(); - Double two = (Double) stack.pop(); - - if (one.isNaN() || two.isNaN()) - stack.push(this, 1); - else if (one > two) - stack.push(this, 1); - else if (one < two) - stack.push(this, -1); - else - stack.push(this, 0); + + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpL.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpL.java index 7fe8e03929..ab8e3b000f 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpL.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpL.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,18 +20,17 @@ public class DCmpL extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Double one = (Double) stack.pop(); - Double two = (Double) stack.pop(); - - if (one.isNaN() || two.isNaN()) - stack.push(this, -1); - else if (one > two) - stack.push(this, 1); - else if (one < two) - stack.push(this, -1); - else - stack.push(this, 0); + + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_0.java index 5a786d38c8..af5c19faa4 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_0.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class DConst_0 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 0d); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_1.java index f3400c58d3..9ea40359a6 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_1.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class DConst_1 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 1d); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DDiv.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DDiv.java index 9c5bd1aacf..6408645320 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DDiv.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DDiv.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class DDiv extends Instruction { @@ -16,11 +18,17 @@ public class DDiv extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Double two = (Double) stack.pop(); - Double one = (Double) stack.pop(); + StackContext one = stack.pop(); + StackContext two = stack.pop(); - stack.push(this, one / two); + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad.java index 2710811c5f..419ee80754 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad.java @@ -4,13 +4,20 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; +import info.sigterm.deob.attributes.code.instruction.types.WideInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class DLoad extends Instruction implements LVTInstruction +public class DLoad extends Instruction implements LVTInstruction, WideInstruction { private int index; @@ -23,6 +30,15 @@ public class DLoad extends Instruction implements LVTInstruction length += 1; } + public DLoad(Instructions instructions, InstructionType type, Instruction instruction, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readShort(); + length += 2; + } + @Override public void write(DataOutputStream out, int pc) throws IOException { @@ -33,8 +49,18 @@ public class DLoad extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - double d = (double) frame.getVariables().get(index); - frame.getStack().push(this, d); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(index); + assert vctx.getType().equals(new Type(double.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override @@ -48,4 +74,11 @@ public class DLoad extends Instruction implements LVTInstruction { return false; } + + @Override + public void writeWide(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_0.java index c2e672efd4..33593a0d59 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_0.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class DLoad_0 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(0); - assert obj instanceof Double; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(0); + assert vctx.getType().equals(new Type(double.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_1.java index d4f5bb13b7..42ca7097e1 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_1.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class DLoad_1 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(1); - assert obj instanceof Double; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(1); + assert vctx.getType().equals(new Type(double.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_2.java index 9f37a5fbef..9efc403d08 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_2.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class DLoad_2 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(2); - assert obj instanceof Double; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(2); + assert vctx.getType().equals(new Type(double.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_3.java index 3de39ea475..5b39f1216a 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_3.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class DLoad_3 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(3); - assert obj instanceof Double; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(3); + assert vctx.getType().equals(new Type(double.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DMul.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DMul.java index 12368bbb1c..0e8326d724 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DMul.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DMul.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class DMul extends Instruction { @@ -16,11 +18,17 @@ public class DMul extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Double two = (Double) stack.pop(); - Double one = (Double) stack.pop(); + StackContext one = stack.pop(); + StackContext two = stack.pop(); - stack.push(this, one * two); + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DNeg.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DNeg.java index 712e127878..07f36188be 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DNeg.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DNeg.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class DNeg extends Instruction { @@ -16,9 +18,15 @@ public class DNeg extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Double value = (Double) stack.pop(); - stack.push(this, -value); + StackContext value = stack.pop(); + ins.pop(value); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DRem.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DRem.java index 215dc088f1..770496cbf8 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DRem.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DRem.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class DRem extends Instruction { @@ -16,11 +18,17 @@ public class DRem extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Double two = (Double) stack.pop(); - Double one = (Double) stack.pop(); + StackContext one = stack.pop(); + StackContext two = stack.pop(); - stack.push(this, one % two); + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore.java index b945ab11b6..2df87f27e9 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore.java @@ -4,13 +4,19 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; +import info.sigterm.deob.attributes.code.instruction.types.WideInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class DStore extends Instruction implements LVTInstruction +public class DStore extends Instruction implements LVTInstruction, WideInstruction { private int index; @@ -23,6 +29,15 @@ public class DStore extends Instruction implements LVTInstruction length += 1; } + public DStore(Instructions instructions, InstructionType type, Instruction instruction, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readShort(); + length += 2; + } + @Override public void write(DataOutputStream out, int pc) throws IOException { @@ -33,8 +48,16 @@ public class DStore extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - double d = (double) frame.getStack().pop(); - frame.getVariables().set(index, d); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + ins.pop(value); + + variables.set(index, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override @@ -48,4 +71,11 @@ public class DStore extends Instruction implements LVTInstruction { return true; } + + @Override + public void writeWide(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_0.java index 79f47d28ab..cc60085a63 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_0.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +23,16 @@ public class DStore_0 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Double; - frame.getVariables().set(0, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + ins.pop(value); + + variables.set(0, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_1.java index f979e891a3..8d1df5db8d 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_1.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +23,16 @@ public class DStore_1 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Double; - frame.getVariables().set(1, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + ins.pop(value); + + variables.set(1, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_2.java index 8022189ffb..20017aa674 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_2.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +23,16 @@ public class DStore_2 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Double; - frame.getVariables().set(2, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + ins.pop(value); + + variables.set(2, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_3.java index f8a9201e71..bb65131a01 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore_3.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +23,16 @@ public class DStore_3 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Double; - frame.getVariables().set(3, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + ins.pop(value); + + variables.set(3, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DSub.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DSub.java index 491e0b7858..3e8b770c37 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DSub.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DSub.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class DSub extends Instruction { @@ -16,11 +18,17 @@ public class DSub extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Double two = (Double) stack.pop(); - Double one = (Double) stack.pop(); + StackContext two = stack.pop(); + StackContext one = stack.pop(); - stack.push(this, one - two); + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup.java index 499e91df73..f70a5dc688 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup.java @@ -4,6 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -17,8 +20,18 @@ public class Dup extends Instruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - frame.getStack().push(this, obj); - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext obj = stack.pop(); + ins.pop(obj); + + StackContext ctx = new StackContext(ins, obj.getType()); + stack.push(ctx); + + ctx = new StackContext(ins, obj.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2.java index b81fb5f9b9..b382735b27 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2.java @@ -4,7 +4,10 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import java.io.IOException; @@ -18,19 +21,36 @@ public class Dup2 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object one = stack.pop(); - Object two = null; - if (!(one instanceof Double) && !(one instanceof Long)) + + StackContext one = stack.pop(); + StackContext two = null; + if (!one.getType().equals(new Type(double.class.getCanonicalName())) && !one.getType().equals(new Type(long.class.getCanonicalName()))) two = stack.pop(); + + ins.pop(one); + if (two != null) + ins.pop(two); + + if (two != null) + { + StackContext ctx = new StackContext(ins, two.getType()); + stack.push(ctx); + } + + StackContext ctx = new StackContext(ins, one.getType()); + stack.push(one); - if (!(one instanceof Double) && !(one instanceof Long)) - stack.push(this, two); - stack.push(this, one); - - if (!(one instanceof Double) && !(one instanceof Long)) - stack.push(this, two); - stack.push(this, one); + if (two != null) + { + ctx = new StackContext(ins, two.getType()); + stack.push(ctx); + } + + ctx = new StackContext(ins, one.getType()); + stack.push(one); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X1.java index 8aa0ce15c1..b58e5146fa 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X1.java @@ -4,7 +4,10 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import java.io.IOException; @@ -18,22 +21,41 @@ public class Dup2_X1 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object one = stack.pop(); - Object two = null; - if (!(one instanceof Double) && !(one instanceof Long)) + + StackContext one = stack.pop(); + StackContext two = null; + if (!one.getType().equals(new Type(double.class.getCanonicalName())) && !one.getType().equals(new Type(long.class.getCanonicalName()))) two = stack.pop(); - Object three = stack.pop(); - - if (!(one instanceof Double) && !(one instanceof Long)) - stack.push(this, two); - stack.push(this, one); - - stack.push(this, three); - - if (!(one instanceof Double) && !(one instanceof Long)) - stack.push(this, two); - stack.push(this, one); + StackContext three = stack.pop(); + + ins.pop(one); + if (two != null) + ins.pop(two); + ins.pop(three); + + if (two != null) + { + StackContext ctx = new StackContext(ins, two.getType()); + stack.push(ctx); + } + + StackContext ctx = new StackContext(ins, one.getType()); + stack.push(ctx); + + ctx = new StackContext(ins, three.getType()); + stack.push(ctx); + + if (two != null) + { + ctx = new StackContext(ins, two.getType()); + stack.push(ctx); + } + + ctx = new StackContext(ins, one.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X2.java index 68f99b608b..993f3e4534 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X2.java @@ -4,7 +4,10 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import java.io.IOException; @@ -18,27 +21,52 @@ public class Dup2_X2 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object one = stack.pop(); - Object two = null; - if (!(one instanceof Double) && !(one instanceof Long)) + + StackContext one = stack.pop(); + StackContext two = null; + if (!one.getType().equals(new Type(double.class.getCanonicalName())) && !one.getType().equals(new Type(long.class.getCanonicalName()))) two = stack.pop(); - Object three = stack.pop(); - Object four = null; - if (!(three instanceof Double) && !(three instanceof Long)) + StackContext three = stack.pop(); + StackContext four = null; + if (!three.getType().equals(new Type(double.class.getCanonicalName())) && !three.getType().equals(new Type(long.class.getCanonicalName()))) four = stack.pop(); - - if (!(one instanceof Double) && !(one instanceof Long)) - stack.push(this, two); - stack.push(this, one); - - if (!(three instanceof Double) && !(three instanceof Long)) - stack.push(this, four); - stack.push(this, three); - - if (!(one instanceof Double) && !(one instanceof Long)) - stack.push(this, two); - stack.push(this, one); + + ins.pop(one); + if (two != null) + ins.pop(two); + ins.pop(three); + if (four != null) + ins.pop(four); + + if (two != null) + { + StackContext ctx = new StackContext(ins, two.getType()); + stack.push(ctx); + } + + StackContext ctx = new StackContext(ins, one.getType()); + stack.push(one); + + if (four != null) + { + ctx = new StackContext(ins, four.getType()); + stack.push(ctx); + } + + ctx = new StackContext(ins, three.getType()); + stack.push(one); + + if (two != null) + { + ctx = new StackContext(ins, two.getType()); + stack.push(ctx); + } + + ctx = new StackContext(ins, one.getType()); + stack.push(one); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X1.java index 19f44834f8..5301fa6199 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X1.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,13 +20,23 @@ public class Dup_X1 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object one = stack.pop(); - Object two = stack.pop(); - - stack.push(this, one); - stack.push(this, two); - stack.push(this, one); + + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, one.getType()); + stack.push(ctx); + + ctx = new StackContext(ins, two.getType()); + stack.push(ctx); + + ctx = new StackContext(ins, one.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X2.java index 4a8b89b136..daa35dde8c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X2.java @@ -4,7 +4,10 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import java.io.IOException; @@ -18,18 +21,34 @@ public class Dup_X2 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object one = stack.pop(); - Object two = stack.pop(); - Object three = null; - if (!(two instanceof Double) && !(two instanceof Long)) + + StackContext one = stack.pop(); + StackContext two = stack.pop(); + StackContext three = null; + if (!two.getType().equals(new Type(double.class.getCanonicalName())) && !two.getType().equals(new Type(long.class.getCanonicalName()))) three = stack.pop(); - - stack.push(this, one); - if (!(two instanceof Double) && !(two instanceof Long)) - stack.push(this, three); - stack.push(this, two); - stack.push(this, one); + + ins.pop(one, two); + if (three != null) + ins.pop(three); + + StackContext ctx = new StackContext(ins, one.getType()); + stack.push(ctx); + + if (three != null) + { + ctx = new StackContext(ins, three.getType()); + stack.push(ctx); + } + + ctx = new StackContext(ins, two.getType()); + stack.push(ctx); + + ctx = new StackContext(ins, one.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/F2D.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/F2D.java index 70db4e93a7..a6c0b46ccf 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/F2D.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/F2D.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,15 @@ public class F2D extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Float; - - Float f = (Float) obj; - stack.push(this, f.doubleValue()); + + StackContext object = stack.pop(); + ins.pop(object); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/F2I.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/F2I.java index 2c72a1e15f..8ec4291e0c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/F2I.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/F2I.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,15 @@ public class F2I extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Float; - - Float f = (Float) obj; - stack.push(this, f.intValue()); + + StackContext object = stack.pop(); + ins.pop(object); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/F2L.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/F2L.java index b2b02450dd..7872bdbabc 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/F2L.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/F2L.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,15 @@ public class F2L extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Float; - - Float f = (Float) obj; - stack.push(this, f.longValue()); + + StackContext object = stack.pop(); + ins.pop(object); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FALoad.java index 8e6d875052..05e050c124 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FALoad.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class FALoad extends Instruction { @@ -16,11 +18,17 @@ public class FALoad extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - int index = (int) stack.pop(); - float[] array = (float[]) stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - stack.push(this, array[index]); + ins.pop(index, array); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FAStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FAStore.java index 7b964dfa40..bc2ea085db 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FAStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FAStore.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class FAStore extends Instruction { @@ -16,12 +18,15 @@ public class FAStore extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - float value = (float) stack.pop(); - int index = (int) stack.pop(); - float[] array = (float[]) stack.pop(); + StackContext value = stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - array[index] = value; + ins.pop(value, index, array); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FAdd.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FAdd.java index 385b9007ea..4f864582d3 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FAdd.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FAdd.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class FAdd extends Instruction { @@ -16,11 +18,17 @@ public class FAdd extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Float one = (Float) stack.pop(); - Float two = (Float) stack.pop(); + StackContext two = stack.pop(); + StackContext one = stack.pop(); - stack.push(this, one + two); + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpG.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpG.java index 8c5671633f..0e4b9f14cf 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpG.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpG.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,18 +20,17 @@ public class FCmpG extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Float one = (Float) stack.pop(); - Float two = (Float) stack.pop(); - - if (one.isNaN() || two.isNaN()) - stack.push(this, 1); - else if (one > two) - stack.push(this, 1); - else if (one < two) - stack.push(this, -1); - else - stack.push(this, 0); + + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpL.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpL.java index 8d3f90c067..260d7e97f9 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpL.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpL.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,18 +20,17 @@ public class FCmpL extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Float one = (Float) stack.pop(); - Float two = (Float) stack.pop(); - - if (one.isNaN() || two.isNaN()) - stack.push(this, -1); - else if (one > two) - stack.push(this, 1); - else if (one < two) - stack.push(this, -1); - else - stack.push(this, 0); + + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_0.java index 00f00a7b19..b58139342b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_0.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class FConst_0 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 0f); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_1.java index 0d31ca5b47..417ef5f3fd 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_1.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class FConst_1 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 1f); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_2.java index b291d1e65c..b9a4ae0d60 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_2.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class FConst_2 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 2f); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FDiv.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FDiv.java index 04bfe5cba7..356362dded 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FDiv.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FDiv.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class FDiv extends Instruction { @@ -16,11 +18,17 @@ public class FDiv extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Float two = (Float) stack.pop(); - Float one = (Float) stack.pop(); + StackContext one = stack.pop(); + StackContext two = stack.pop(); - stack.push(this, one / two); + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad.java index 3df7123a34..5161adcaa9 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad.java @@ -4,13 +4,20 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; +import info.sigterm.deob.attributes.code.instruction.types.WideInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class FLoad extends Instruction implements LVTInstruction +public class FLoad extends Instruction implements LVTInstruction, WideInstruction { private int index; @@ -23,6 +30,15 @@ public class FLoad extends Instruction implements LVTInstruction length += 1; } + public FLoad(Instructions instructions, InstructionType type, Instruction instruction, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readShort(); + length += 2; + } + @Override public void write(DataOutputStream out, int pc) throws IOException { @@ -33,8 +49,18 @@ public class FLoad extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - float f = (float) frame.getVariables().get(index); - frame.getStack().push(this, f); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(index); + assert vctx.getType().equals(new Type(float.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override @@ -48,4 +74,11 @@ public class FLoad extends Instruction implements LVTInstruction { return false; } + + @Override + public void writeWide(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_0.java index 4efd804b80..c22edac57b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_0.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class FLoad_0 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(0); - assert obj instanceof Float; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(0); + assert vctx.getType().equals(new Type(float.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_1.java index 8ea09c7cf1..b0c1aa12c4 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_1.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class FLoad_1 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(1); - assert obj instanceof Float; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(1); + assert vctx.getType().equals(new Type(float.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_2.java index e0228dfa14..792b2a8a0b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_2.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class FLoad_2 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(2); - assert obj instanceof Float; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(2); + assert vctx.getType().equals(new Type(float.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_3.java index 3ae1971bed..2707fc5cfb 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_3.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class FLoad_3 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(3); - assert obj instanceof Float; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(3); + assert vctx.getType().equals(new Type(float.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FMul.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FMul.java index 3a517325a0..266f195327 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FMul.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FMul.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class FMul extends Instruction { @@ -16,11 +18,17 @@ public class FMul extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Float two = (Float) stack.pop(); - Float one = (Float) stack.pop(); + StackContext one = stack.pop(); + StackContext two = stack.pop(); - stack.push(this, one * two); + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FNeg.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FNeg.java index a219631f17..46c9baa59e 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FNeg.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FNeg.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class FNeg extends Instruction { @@ -16,9 +18,15 @@ public class FNeg extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Float value = (Float) stack.pop(); - stack.push(this, -value); + StackContext value = stack.pop(); + ins.pop(value); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FRem.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FRem.java index 4cbf30d7ee..2e3bbadf55 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FRem.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FRem.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class FRem extends Instruction { @@ -16,11 +18,17 @@ public class FRem extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Float two = (Float) stack.pop(); - Float one = (Float) stack.pop(); + StackContext one = stack.pop(); + StackContext two = stack.pop(); - stack.push(this, one % two); + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore.java index 5553732d7a..ae4b8f530e 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore.java @@ -4,13 +4,19 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; +import info.sigterm.deob.attributes.code.instruction.types.WideInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class FStore extends Instruction implements LVTInstruction +public class FStore extends Instruction implements LVTInstruction, WideInstruction { private int index; @@ -23,6 +29,15 @@ public class FStore extends Instruction implements LVTInstruction length += 1; } + public FStore(Instructions instructions, InstructionType type, Instruction instruction, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readShort(); + length += 2; + } + @Override public void write(DataOutputStream out, int pc) throws IOException { @@ -33,8 +48,16 @@ public class FStore extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - float f = (float) frame.getStack().pop(); - frame.getVariables().set(index, f); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + ins.pop(value); + + variables.set(index, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override @@ -48,4 +71,11 @@ public class FStore extends Instruction implements LVTInstruction { return true; } + + @Override + public void writeWide(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_0.java index b977086db9..1dbbe94577 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_0.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +23,16 @@ public class FStore_0 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Float; - frame.getVariables().set(0, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + ins.pop(value); + + variables.set(0, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_1.java index 4a68634e8f..8d234b2dcf 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_1.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +23,16 @@ public class FStore_1 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Float; - frame.getVariables().set(1, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + ins.pop(value); + + variables.set(1, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_2.java index ac5e42d922..1205a8b29c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_2.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +23,16 @@ public class FStore_2 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Float; - frame.getVariables().set(2, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + ins.pop(value); + + variables.set(2, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_3.java index bcf3ab6e3f..60a0a3a5a5 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore_3.java @@ -5,6 +5,11 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +23,16 @@ public class FStore_3 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Float; - frame.getVariables().set(3, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + ins.pop(value); + + variables.set(3, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FSub.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FSub.java index c0147e004a..077175b819 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FSub.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FSub.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class FSub extends Instruction { @@ -16,11 +18,17 @@ public class FSub extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Float two = (Float) stack.pop(); - Float one = (Float) stack.pop(); + StackContext two = stack.pop(); + StackContext one = stack.pop(); - stack.push(this, one - two); + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/GetField.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/GetField.java index ec0447db80..f4dce9108b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/GetField.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/GetField.java @@ -5,9 +5,11 @@ import info.sigterm.deob.ConstantPool; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; -import info.sigterm.deob.execution.FieldInstance; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.ObjectInstance; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import info.sigterm.deob.pool.Field; import info.sigterm.deob.pool.NameAndType; @@ -38,21 +40,15 @@ public class GetField extends Instruction @Override public void execute(Frame frame) { - ObjectInstance object = (ObjectInstance) frame.getStack().pop(); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); - ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); - - ConstantPool pool = thisClass.getPool(); - - NameAndType nat = field.getNameAndType(); + StackContext object = stack.pop(); + ins.pop(object); - if (object == null) - { - frame.getStack().push(this, null); - return; - } + StackContext ctx = new StackContext(ins, new Type(field.getNameAndType().getDescriptorType()).toStackType()); + stack.push(ctx); - FieldInstance field = object.getField(nat); - frame.getStack().push(this, field.getValue()); + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/GetStatic.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/GetStatic.java index 6a4b32b3ba..0227d33a3c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/GetStatic.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/GetStatic.java @@ -5,9 +5,11 @@ import info.sigterm.deob.ConstantPool; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; -import info.sigterm.deob.execution.ClassInstance; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.StaticFieldInstance; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import info.sigterm.deob.pool.Class; import info.sigterm.deob.pool.Field; import info.sigterm.deob.pool.NameAndType; @@ -39,24 +41,13 @@ public class GetStatic extends Instruction @Override public void execute(Frame frame) { - ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); - - Class clazz = field.getClassEntry(); - NameAndType nat = field.getNameAndType(); - - ClassFile cf = thisClass.getGroup().findClass(clazz.getName()); - if (cf == null) - { - Object ovalue = nat.getStackObject(); - frame.getStack().push(this, ovalue); - return; - } - - ClassInstance ci = frame.getPath().getClassInstance(cf); - StaticFieldInstance fi = ci.findStaticField(nat); - Object ovalue = fi.getValue(); - - frame.getStack().push(this, ovalue); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext ctx = new StackContext(ins, new Type(field.getNameAndType().getDescriptorType()).toStackType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2B.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2B.java index 75d59d7d96..7f8f795cd4 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2B.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2B.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,15 @@ public class I2B extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Integer; - - Integer i = (Integer) obj; - stack.push(this, i.byteValue()); + + StackContext object = stack.pop(); + ins.pop(object); + + StackContext ctx = new StackContext(ins, int.class); // sign extneded + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2C.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2C.java index a404730501..bb09368b44 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2C.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2C.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,15 @@ public class I2C extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Integer; - - Integer i = (Integer) obj; - stack.push(this, (char) i.intValue()); + + StackContext object = stack.pop(); + ins.pop(object); + + StackContext ctx = new StackContext(ins, int.class); // sign extended + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2D.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2D.java index eac4d08899..68ad226c9c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2D.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2D.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,15 @@ public class I2D extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Integer; - - Integer i = (Integer) obj; - stack.push(this, i.doubleValue()); + + StackContext object = stack.pop(); + ins.pop(object); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2F.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2F.java index b6f6aef43d..fb8918d2e4 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2F.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2F.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,15 @@ public class I2F extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Integer; - - Integer i = (Integer) obj; - stack.push(this, i.floatValue()); + + StackContext object = stack.pop(); + ins.pop(object); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2L.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2L.java index 13d6e0dce6..f2b9925660 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2L.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2L.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,15 @@ public class I2L extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Integer; - - Integer i = (Integer) obj; - stack.push(this, i.longValue()); + + StackContext object = stack.pop(); + ins.pop(object); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2S.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2S.java index cc9ac80c41..b7a62fd02b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2S.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2S.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,15 @@ public class I2S extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Integer; - - Integer i = (Integer) obj; - stack.push(this, i.shortValue()); + + StackContext object = stack.pop(); + ins.pop(object); + + StackContext ctx = new StackContext(ins, int.class); // sign extended + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IALoad.java index bdba713969..1305ca4fc9 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IALoad.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class IALoad extends Instruction { @@ -16,11 +18,17 @@ public class IALoad extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - int index = (int) stack.pop(); - int[] array = (int[]) stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - stack.push(this, array[index]); + ins.pop(index, array); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IAStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IAStore.java index 85e43fced9..2def7fcd95 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IAStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IAStore.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class IAStore extends Instruction { @@ -16,12 +18,15 @@ public class IAStore extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - int value = (int) stack.pop(); - int index = (int) stack.pop(); - int[] array = (int[]) stack.pop(); + StackContext value = stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - array[index] = value; + ins.pop(value, index, array); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IAdd.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IAdd.java index 8d82fc389e..d51505d854 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IAdd.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IAdd.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class IAdd extends Instruction { @@ -16,11 +18,17 @@ public class IAdd extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Integer two = (Integer) stack.pop(); - Integer one = (Integer) stack.pop(); + StackContext two = stack.pop(); + StackContext one = stack.pop(); - stack.push(this, one + two); + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IAnd.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IAnd.java index bdaef725b4..e94eadff11 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IAnd.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IAnd.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class IAnd extends Instruction { @@ -16,10 +18,17 @@ public class IAnd extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Integer two = (Integer) stack.pop(); - Integer one = (Integer) stack.pop(); - stack.push(this, one & two); + StackContext two = stack.pop(); + StackContext one = stack.pop(); + + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_0.java index f690dee01d..2f7ceaf162 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_0.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class IConst_0 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 0); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_1.java index 0eb5ae94d8..ccd61f10de 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_1.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class IConst_1 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 1); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_2.java index 6747f44871..d01fa4cd53 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_2.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class IConst_2 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 2); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_3.java index 221e0157b7..e1668fbf58 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_3.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class IConst_3 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 3); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_4.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_4.java index 6a633f3df5..5efa37c2b5 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_4.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_4.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class IConst_4 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 4); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_5.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_5.java index df593db939..d5526100a9 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_5.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_5.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class IConst_5 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 5); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_M1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_M1.java index 4d9726624f..50859f1389 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_M1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_M1.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class IConst_M1 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, -1); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IDiv.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IDiv.java index 0db9872cb6..cc638beae2 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IDiv.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IDiv.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class IDiv extends Instruction { @@ -16,11 +18,17 @@ public class IDiv extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Double two = (Double) stack.pop(); - Double one = (Double) stack.pop(); + StackContext one = stack.pop(); + StackContext two = stack.pop(); - stack.push(this, one / two); + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IInc.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IInc.java index 4abea45b48..983449ced4 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IInc.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IInc.java @@ -4,16 +4,21 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; +import info.sigterm.deob.attributes.code.instruction.types.WideInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class IInc extends Instruction implements LVTInstruction +public class IInc extends Instruction implements LVTInstruction, WideInstruction { - private byte index; - private byte inc; + private short index; + private short inc; public IInc(Instructions instructions, InstructionType type, int pc) throws IOException { @@ -25,6 +30,16 @@ public class IInc extends Instruction implements LVTInstruction length += 2; } + public IInc(Instructions instructions, InstructionType type, Instruction instruction, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readShort(); + inc = is.readShort(); + length += 4; + } + @Override public void write(DataOutputStream out, int pc) throws IOException { @@ -36,9 +51,17 @@ public class IInc extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - int i = (int) frame.getVariables().get(index); - i += inc; - frame.getVariables().set(index, i); + InstructionContext ins = new InstructionContext(this, frame); + Variables var = frame.getVariables(); + + VariableContext vctx = var.get(index); + assert vctx.getType().equals(new Type(int.class.getCanonicalName())); + ins.read(vctx); + + vctx = new VariableContext(ins, vctx.getType()); + var.set(index, vctx); + + frame.addInstructionContext(ins); } @Override @@ -52,4 +75,12 @@ public class IInc extends Instruction implements LVTInstruction { return false; // This is a get first } + + @Override + public void writeWide(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + out.writeShort(inc); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad.java index 0738c1b82c..2c1c6226bc 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad.java @@ -4,13 +4,20 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; +import info.sigterm.deob.attributes.code.instruction.types.WideInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class ILoad extends Instruction implements LVTInstruction +public class ILoad extends Instruction implements LVTInstruction, WideInstruction { private int index; @@ -23,6 +30,15 @@ public class ILoad extends Instruction implements LVTInstruction length += 1; } + public ILoad(Instructions instructions, InstructionType type, Instruction instruction, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readShort(); + length += 2; + } + @Override public void write(DataOutputStream out, int pc) throws IOException { @@ -33,8 +49,18 @@ public class ILoad extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object i = frame.getVariables().get(index); - frame.getStack().push(this, i); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(index); + assert vctx.getType().equals(new Type(int.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override @@ -48,4 +74,11 @@ public class ILoad extends Instruction implements LVTInstruction { return false; } + + @Override + public void writeWide(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_0.java index d077177ded..b6c2b6f2a3 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_0.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class ILoad_0 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(0); - assert obj instanceof Integer; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(0); + assert vctx.getType().equals(new Type(int.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_1.java index 4a92ec5b46..4e8559e372 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_1.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,8 +24,18 @@ public class ILoad_1 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(1); - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(1); + assert vctx.getType().equals(new Type(int.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_2.java index 50cea129af..b378259eda 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_2.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class ILoad_2 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(2); - assert obj instanceof Integer; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(2); + assert vctx.getType().equals(new Type(int.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_3.java index 7525a1463b..979119d666 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_3.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class ILoad_3 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(3); - assert obj instanceof Integer; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(3); + assert vctx.getType().equals(new Type(int.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IMul.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IMul.java index 0d0d084027..fd7fe54294 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IMul.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IMul.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class IMul extends Instruction { @@ -16,14 +18,17 @@ public class IMul extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Integer two = (Integer) stack.pop(); - Integer one = (Integer) stack.pop(); + StackContext one = stack.pop(); + StackContext two = stack.pop(); - if (one == null || two == null) - stack.push(this, 0); - else - stack.push(this, one * two); + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/INeg.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/INeg.java index 073b30cf91..57e1777e88 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/INeg.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/INeg.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class INeg extends Instruction { @@ -16,9 +18,15 @@ public class INeg extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Integer value = (Integer) stack.pop(); - stack.push(this, -value); + StackContext value = stack.pop(); + ins.pop(value); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IOr.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IOr.java index 63313c2ea9..7a03370894 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IOr.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IOr.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class IOr extends Instruction { @@ -16,10 +18,17 @@ public class IOr extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Integer two = (Integer) stack.pop(); - Integer one = (Integer) stack.pop(); - stack.push(this, one | two); + StackContext two = stack.pop(); + StackContext one = stack.pop(); + + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IRem.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IRem.java index 0f2e970e16..44b44e5422 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IRem.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IRem.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class IRem extends Instruction { @@ -16,11 +18,17 @@ public class IRem extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Integer two = (Integer) stack.pop(); - Integer one = (Integer) stack.pop(); + StackContext one = stack.pop(); + StackContext two = stack.pop(); - stack.push(this, one % two); + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IShL.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IShL.java index ff6ae96e68..26aa4ff5a9 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IShL.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IShL.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class IShL extends Instruction { @@ -16,10 +18,17 @@ public class IShL extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Integer two = (Integer) stack.pop(); - Integer one = (Integer) stack.pop(); - stack.push(this, one << (two & 0x1F)); + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IShR.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IShR.java index 7671e2563c..910484cb48 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IShR.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IShR.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class IShR extends Instruction { @@ -16,10 +18,17 @@ public class IShR extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Integer two = (Integer) stack.pop(); - Integer one = (Integer) stack.pop(); - stack.push(this, one >> (two & 0x1F)); + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore.java index 557753c761..be448835cb 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore.java @@ -4,13 +4,20 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; +import info.sigterm.deob.attributes.code.instruction.types.WideInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class IStore extends Instruction implements LVTInstruction +public class IStore extends Instruction implements LVTInstruction, WideInstruction { private int index; @@ -23,6 +30,15 @@ public class IStore extends Instruction implements LVTInstruction length += 1; } + public IStore(Instructions instructions, InstructionType type, Instruction instruction, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readShort(); + length += 2; + } + @Override public void write(DataOutputStream out, int pc) throws IOException { @@ -33,8 +49,17 @@ public class IStore extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - frame.getVariables().set(index, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + assert value.getType().equals(new Type(int.class.getName())); + ins.pop(value); + + variables.set(index, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override @@ -48,4 +73,11 @@ public class IStore extends Instruction implements LVTInstruction { return true; } + + @Override + public void writeWide(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_0.java index 7a307a7938..22067b7351 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_0.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,17 @@ public class IStore_0 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Integer; - frame.getVariables().set(0, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + assert value.getType().equals(new Type(int.class.getName())); + ins.pop(value); + + variables.set(0, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_1.java index 3dfab0b575..16e24cf225 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_1.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,17 @@ public class IStore_1 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Integer; - frame.getVariables().set(1, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + assert value.getType().equals(new Type(int.class.getName())); + ins.pop(value); + + variables.set(1, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_2.java index 60595de817..b4ddb8b434 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_2.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,17 @@ public class IStore_2 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Integer; - frame.getVariables().set(2, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + assert value.getType().equals(new Type(int.class.getName())); + ins.pop(value); + + variables.set(2, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_3.java index 5d5fc4e5eb..f8556c4a05 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore_3.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,17 @@ public class IStore_3 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Integer; - frame.getVariables().set(3, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + assert value.getType().equals(new Type(int.class.getName())); + ins.pop(value); + + variables.set(3, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ISub.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ISub.java index b9b2feb6ed..be2f1cb562 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ISub.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ISub.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class ISub extends Instruction { @@ -16,11 +18,17 @@ public class ISub extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Integer two = (Integer) stack.pop(); - Integer one = (Integer) stack.pop(); + StackContext two = stack.pop(); + StackContext one = stack.pop(); - stack.push(this, one - two); + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IUShR.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IUShR.java index 4988219352..84ea684efa 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IUShR.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IUShR.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class IUShR extends Instruction { @@ -16,10 +18,17 @@ public class IUShR extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Integer two = (Integer) stack.pop(); - Integer one = (Integer) stack.pop(); - stack.push(this, one >>> (two & 0x1F)); + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IXor.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IXor.java index e29e7553cb..bf67cfb85e 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IXor.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IXor.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class IXor extends Instruction { @@ -16,10 +18,17 @@ public class IXor extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Integer two = (Integer) stack.pop(); - Integer one = (Integer) stack.pop(); - stack.push(this, one ^ two); + StackContext two = stack.pop(); + StackContext one = stack.pop(); + + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/If.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/If.java index 72129e48f1..21227ad1fe 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/If.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/If.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.Path; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -37,13 +39,17 @@ public class If extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - e.getStack().pop(); - e.getStack().pop(); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); - Path other = e.getPath().dup(); - Frame frame = other.getCurrentFrame(); - frame.jump(offset); + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + Frame other = frame.dup(); + other.jump(offset); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/If0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/If0.java index a5ce57e2b8..5573c07229 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/If0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/If0.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.Path; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -37,12 +39,16 @@ public class If0 extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - e.getStack().pop(); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); - Path other = e.getPath().dup(); - Frame frame = other.getCurrentFrame(); - frame.jump(offset); + StackContext one = stack.pop(); + + ins.pop(one); + + Frame other = frame.dup(); + other.jump(offset); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/InstanceOf.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/InstanceOf.java index 758065547b..fd33e17625 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/InstanceOf.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/InstanceOf.java @@ -6,7 +6,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.ObjectInstanceBase; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.pool.Class; import java.io.DataInputStream; @@ -34,20 +36,17 @@ public class InstanceOf extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); - ObjectInstanceBase obj = (ObjectInstanceBase) e.getStack().pop(); - if (obj == null) - { - e.getStack().push(this, 0); - return; - - } + StackContext obj = stack.pop(); + ins.pop(obj); - ClassFile otherClass = thisClass.getGroup().findClass(clazz.getName()); - boolean instanceOf = obj.getType().getClassFile().instanceOf(otherClass); - e.getStack().push(this, instanceOf ? 1 : 0); + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeInterface.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeInterface.java index 9c2d6242eb..dc6a339d45 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeInterface.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeInterface.java @@ -6,9 +6,11 @@ import info.sigterm.deob.Method; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; -import info.sigterm.deob.execution.ClassInstance; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.ObjectInstance; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import info.sigterm.deob.pool.InterfaceMethod; import info.sigterm.deob.pool.NameAndType; @@ -58,18 +60,29 @@ public class InvokeInterface extends Instruction } @Override - public void execute(Frame e) - { - ObjectInstance object = (ObjectInstance) e.getStack().pop(); - ClassInstance objectType = object.getType(); + public void execute(Frame frame) + { + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); - Object[] args = new Object[count + 1]; - args[0] = object; - for (int i = 1; i < count + 1; ++i) - args[i] = e.getStack().pop(); + int count = method.getNameAndType().getNumberOfArgs(); - Method meth = objectType.getClassFile().findMethod(method.getNameAndType()); - e.getPath().invoke(meth, args); + for (int i = 0; i < count; ++i) + { + StackContext arg = stack.pop(); + ins.pop(arg); + } + + StackContext object = stack.pop(); + ins.pop(object); + + if (!method.getNameAndType().isVoid()) + { + StackContext ctx = new StackContext(ins, new Type(method.getNameAndType().getDescriptor().getReturnValue()).toStackType()); + stack.push(ctx); + } + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeSpecial.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeSpecial.java index fc780527b5..4439b70ec6 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeSpecial.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeSpecial.java @@ -5,9 +5,11 @@ import info.sigterm.deob.ConstantPool; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; -import info.sigterm.deob.execution.ClassInstance; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.ObjectInstance; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import info.sigterm.deob.pool.Method; import info.sigterm.deob.pool.NameAndType; @@ -53,28 +55,29 @@ public class InvokeSpecial extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + int count = method.getNameAndType().getNumberOfArgs(); - ObjectInstance object = (ObjectInstance) e.getStack().pop(); - - Object[] args = new Object[count + 1]; - args[0] = object; - for (int i = 1; i < count + 1; ++i) - args[i] = e.getStack().pop(); - - if (object == null) + for (int i = 0; i < count; ++i) { - //System.out.println("invokespecial for nonexistant function " + method.getNameAndType().getName() + " " + method.getNameAndType().getDescriptor() + " on " + method.getClassEntry().getName() + " (void: " + !method.getNameAndType().isNonVoid() + ")"); - if (method.getNameAndType().isNonVoid()) - e.getStack().push(this, null); - return; + StackContext arg = stack.pop(); + ins.pop(arg); } - ClassInstance objectType = object.getType(); - info.sigterm.deob.Method meth = objectType.getClassFile().findMethod(method.getNameAndType()); - e.getPath().invoke(meth, args); + StackContext object = stack.pop(); + ins.pop(object); + + if (!method.getNameAndType().isVoid()) + { + StackContext ctx = new StackContext(ins, new Type(method.getNameAndType().getDescriptor().getReturnValue()).toStackType()); + stack.push(ctx); + } + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeStatic.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeStatic.java index 729cf410d4..f6d1d8341c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeStatic.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeStatic.java @@ -6,6 +6,10 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import info.sigterm.deob.pool.Method; import info.sigterm.deob.pool.NameAndType; @@ -51,28 +55,31 @@ public class InvokeStatic extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); - - info.sigterm.deob.pool.Class clazz = method.getClassEntry(); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); - ClassFile otherClass = thisClass.getGroup().findClass(clazz.getName()); int count = method.getNameAndType().getNumberOfArgs(); - Object[] args = new Object[count]; - for (int i = count - 1; i >= 0; --i) - args[i] = e.getStack().pop(); - - if (otherClass == null) + for (int i = 0; i < count; ++i) { - //System.out.println("invokestatic for nonexistant class " + clazz.getName()); - if (method.getNameAndType().isNonVoid()) - e.getStack().push(this, null); - return; + StackContext arg = stack.pop(); + ins.pop(arg); } - info.sigterm.deob.Method meth = otherClass.findMethod(method.getNameAndType()); - e.getPath().invoke(meth, args); + if (!method.getNameAndType().isVoid()) + { + StackContext ctx = new StackContext(ins, new Type(method.getNameAndType().getDescriptor().getReturnValue()).toStackType()); + stack.push(ctx); + } + + frame.addInstructionContext(ins); + } + + @Override + public String getDesc(Frame frame) + { + return "invokestatic " + method.getNameAndType().getDescriptor() + " on " + method.getClassEntry().getName() + " return value " + method.getNameAndType().getDescriptor().getReturnValue(); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeVirtual.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeVirtual.java index 114d9e0e1a..431a9e8e93 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeVirtual.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeVirtual.java @@ -1,13 +1,16 @@ package info.sigterm.deob.attributes.code.instructions; import info.sigterm.deob.ClassFile; +import info.sigterm.deob.ClassGroup; import info.sigterm.deob.ConstantPool; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; -import info.sigterm.deob.execution.ClassInstance; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.ObjectInstance; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import info.sigterm.deob.pool.Method; import info.sigterm.deob.pool.NameAndType; @@ -54,35 +57,29 @@ public class InvokeVirtual extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + int count = method.getNameAndType().getNumberOfArgs(); - Object[] args = new Object[count + 1]; - for (int i = count; i > 0; --i) - args[i] = e.getStack().pop(); - - ObjectInstance object = (ObjectInstance) e.getStack().pop(); - if (object == null) + for (int i = 0; i < count; ++i) { - //System.out.println("invokevirtual on null object for method " + method.getNameAndType().getName() + " " + method.getNameAndType().getDescriptor() + " on " + method.getClassEntry().getName()); - e.getStack().push(this, null); - return; + StackContext arg = stack.pop(); + ins.pop(arg); } - ClassInstance objectType = object.getType(); + StackContext object = stack.pop(); + ins.pop(object); - args[0] = object; - - info.sigterm.deob.Method meth = objectType.getClassFile().findMethod(method.getNameAndType()); - if (meth == null) + if (!method.getNameAndType().isVoid()) { - //System.out.println("Unknown method " + method.getNameAndType().getName() + " " + method.getNameAndType().getDescriptor() + " in " + objectType.getClassFile().getName()); - if (method.getNameAndType().isNonVoid()) - e.getStack().push(this, null); - return; + StackContext ctx = new StackContext(ins, new Type(method.getNameAndType().getDescriptor().getReturnValue()).toStackType()); + stack.push(ctx); } - e.getPath().invoke(meth, args); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/L2D.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/L2D.java index 5af98b43f6..a9a0253cef 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/L2D.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/L2D.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,15 @@ public class L2D extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Long; - - Long l = (Long) obj; - stack.push(this, l.doubleValue()); + + StackContext object = stack.pop(); + ins.pop(object); + + StackContext ctx = new StackContext(ins, double.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/L2F.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/L2F.java index a4f6fa7944..f20c3c5af8 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/L2F.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/L2F.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,15 @@ public class L2F extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Long; - - Long l = (Long) obj; - stack.push(this, l.floatValue()); + + StackContext object = stack.pop(); + ins.pop(object); + + StackContext ctx = new StackContext(ins, float.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/L2I.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/L2I.java index 7b8d55c42c..63886a48a8 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/L2I.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/L2I.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,12 +20,15 @@ public class L2I extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Object obj = stack.pop(); - assert obj instanceof Long; - - Long l = (Long) obj; - stack.push(this, l.intValue()); + + StackContext object = stack.pop(); + ins.pop(object); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LALoad.java index eb0d000878..74faf97e96 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LALoad.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LALoad extends Instruction { @@ -16,11 +18,17 @@ public class LALoad extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - int index = (int) stack.pop(); - long[] array = (long[]) stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - stack.push(this, array[index]); + ins.pop(index, array); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LAStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LAStore.java index bfe7e376bb..6737d4b89d 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LAStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LAStore.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LAStore extends Instruction { @@ -16,12 +18,15 @@ public class LAStore extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - long value = (long) stack.pop(); - int index = (int) stack.pop(); - long[] array = (long[]) stack.pop(); + StackContext value = stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - array[index] = value; + ins.pop(value, index, array); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LAdd.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LAdd.java index 1953f5fadd..26a5b04f7b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LAdd.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LAdd.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LAdd extends Instruction { @@ -16,11 +18,17 @@ public class LAdd extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Long two = (Long) stack.pop(); - Long one = (Long) stack.pop(); + StackContext two = stack.pop(); + StackContext one = stack.pop(); - stack.push(this, one + two); + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LAnd.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LAnd.java index 48f0cc6f13..7a8ae8e8c2 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LAnd.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LAnd.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LAnd extends Instruction { @@ -16,10 +18,17 @@ public class LAnd extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Long two = (Long) stack.pop(); - Long one = (Long) stack.pop(); - stack.push(this, one & two); + StackContext two = stack.pop(); + StackContext one = stack.pop(); + + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LCmp.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LCmp.java index a751bde523..f181cae12e 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LCmp.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LCmp.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,16 +20,17 @@ public class LCmp extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - - Long one = (Long) stack.pop(); - Long two = (Long) stack.pop(); - - if (one > two) - stack.push(this, 1); - else if (one < two) - stack.push(this, -1); - else - stack.push(this, 0); + + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, int.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_0.java index e1e7d71fff..08db66503f 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_0.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class LConst_0 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 0L); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_1.java index e40bdd7cfb..48a5ef1962 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_1.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -18,7 +20,12 @@ public class LConst_1 extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - stack.push(this, 1L); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC.java index 4068e3f843..49e2fede45 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC.java @@ -5,6 +5,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.pool.PoolEntry; import java.io.DataInputStream; @@ -13,14 +16,14 @@ import java.io.IOException; public class LDC extends Instruction { - private Object value; + private PoolEntry value; public LDC(Instructions instructions, InstructionType type, int pc) throws IOException { super(instructions, type, pc); DataInputStream is = instructions.getCode().getAttributes().getStream(); - value = this.getPool().get(is.readUnsignedByte()); + value = this.getPool().getEntry(is.readUnsignedByte()); length += 1; } @@ -34,6 +37,12 @@ public class LDC extends Instruction @Override public void execute(Frame frame) { - frame.getStack().push(this, value); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext ctx = new StackContext(ins, value.getTypeClass()); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC2_W.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC2_W.java index 0a8334622c..70f36c22a1 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC2_W.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC2_W.java @@ -5,6 +5,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.pool.PoolEntry; import java.io.DataInputStream; @@ -13,14 +16,14 @@ import java.io.IOException; public class LDC2_W extends Instruction { - private Object value; + private PoolEntry value; public LDC2_W(Instructions instructions, InstructionType type, int pc) throws IOException { super(instructions, type, pc); DataInputStream is = instructions.getCode().getAttributes().getStream(); - value = this.getPool().get(is.readUnsignedShort()); + value = this.getPool().getEntry(is.readUnsignedShort()); length += 2; } @@ -34,6 +37,12 @@ public class LDC2_W extends Instruction @Override public void execute(Frame frame) { - frame.getStack().push(this, value); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext ctx = new StackContext(ins, value.getTypeClass()); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC_W.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC_W.java index 574a9d75ba..a4d2e3cd6d 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC_W.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC_W.java @@ -5,6 +5,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.pool.PoolEntry; import java.io.DataInputStream; @@ -13,14 +16,14 @@ import java.io.IOException; public class LDC_W extends Instruction { - private Object value; + private PoolEntry value; public LDC_W(Instructions instructions, InstructionType type, int pc) throws IOException { super(instructions, type, pc); DataInputStream is = instructions.getCode().getAttributes().getStream(); - value = this.getPool().get(is.readUnsignedShort()); + value = this.getPool().getEntry(is.readUnsignedShort()); length += 2; } @@ -34,7 +37,13 @@ public class LDC_W extends Instruction @Override public void execute(Frame frame) { - frame.getStack().push(this, value); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext ctx = new StackContext(ins, value.getTypeClass()); + stack.push(ctx); + + frame.addInstructionContext(ins); } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDiv.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDiv.java index c462a0dfd6..08274a4602 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDiv.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDiv.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LDiv extends Instruction { @@ -16,11 +18,17 @@ public class LDiv extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Long two = (Long) stack.pop(); - Long one = (Long) stack.pop(); + StackContext one = stack.pop(); + StackContext two = stack.pop(); - stack.push(this, one / two); + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad.java index 92d78f9eb0..a995228aff 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad.java @@ -4,13 +4,20 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; +import info.sigterm.deob.attributes.code.instruction.types.WideInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class LLoad extends Instruction implements LVTInstruction +public class LLoad extends Instruction implements LVTInstruction, WideInstruction { private int index; @@ -23,6 +30,15 @@ public class LLoad extends Instruction implements LVTInstruction length += 1; } + public LLoad(Instructions instructions, InstructionType type, Instruction instruction, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readShort(); + length += 2; + } + @Override public void write(DataOutputStream out, int pc) throws IOException { @@ -33,8 +49,18 @@ public class LLoad extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - long l = (long) frame.getVariables().get(index); - frame.getStack().push(this, l); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(index); + assert vctx.getType().equals(new Type(long.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override @@ -48,4 +74,11 @@ public class LLoad extends Instruction implements LVTInstruction { return false; } + + @Override + public void writeWide(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_0.java index 9db13ec982..69b0fcb4dd 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_0.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class LLoad_0 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(1); - assert obj instanceof Long; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(0); + assert vctx.getType().equals(new Type(long.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_1.java index 7fcd8cc23b..2b69904839 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_1.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class LLoad_1 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(1); - assert obj instanceof Long; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(1); + assert vctx.getType().equals(new Type(long.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_2.java index 61e2fc237d..0916dd9c65 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_2.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class LLoad_2 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(2); - assert obj instanceof Long; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(2); + assert vctx.getType().equals(new Type(long.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_3.java index 9791c8477b..329275c529 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_3.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,18 @@ public class LLoad_3 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getVariables().get(3); - assert obj instanceof Long; - frame.getStack().push(this, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + VariableContext vctx = variables.get(3); + assert vctx.getType().equals(new Type(long.class.getName())); + ins.read(vctx); + + StackContext ctx = new StackContext(ins, vctx.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LMul.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LMul.java index dcc9415857..b62aac79a6 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LMul.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LMul.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LMul extends Instruction { @@ -16,11 +18,17 @@ public class LMul extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Long two = (Long) stack.pop(); - Long one = (Long) stack.pop(); + StackContext one = stack.pop(); + StackContext two = stack.pop(); - stack.push(this, one * two); + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LNeg.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LNeg.java index aad3cf2b8e..1655e90c71 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LNeg.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LNeg.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LNeg extends Instruction { @@ -16,9 +18,15 @@ public class LNeg extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Long value = (Long) stack.pop(); - stack.push(this, -value); + StackContext value = stack.pop(); + ins.pop(value); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LOr.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LOr.java index 53c53235eb..8917902375 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LOr.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LOr.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LOr extends Instruction { @@ -16,10 +18,17 @@ public class LOr extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Long two = (Long) stack.pop(); - Long one = (Long) stack.pop(); - stack.push(this, one | two); + StackContext two = stack.pop(); + StackContext one = stack.pop(); + + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LRem.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LRem.java index ea0f5e3c23..18e294a0c6 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LRem.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LRem.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LRem extends Instruction { @@ -16,11 +18,17 @@ public class LRem extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Long two = (Long) stack.pop(); - Long one = (Long) stack.pop(); + StackContext two = stack.pop(); + StackContext one = stack.pop(); - stack.push(this, one % two); + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LShL.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LShL.java index 9b31b44598..fceff1d2d5 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LShL.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LShL.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LShL extends Instruction { @@ -16,10 +18,17 @@ public class LShL extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Long two = (Long) stack.pop(); - Long one = (Long) stack.pop(); - stack.push(this, one << (two & 0x3F)); + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LShR.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LShR.java index 0aa6d76599..aaf008bef1 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LShR.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LShR.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LShR extends Instruction { @@ -16,10 +18,17 @@ public class LShR extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Long two = (Long) stack.pop(); - Long one = (Long) stack.pop(); - stack.push(this, one >> (two & 0x3F)); + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore.java index 4f0cf4ab36..b27fb0d844 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore.java @@ -4,13 +4,20 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; +import info.sigterm.deob.attributes.code.instruction.types.WideInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class LStore extends Instruction implements LVTInstruction +public class LStore extends Instruction implements LVTInstruction, WideInstruction { private int index; @@ -23,6 +30,15 @@ public class LStore extends Instruction implements LVTInstruction length += 1; } + public LStore(Instructions instructions, InstructionType type, Instruction instruction, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readShort(); + length += 2; + } + @Override public void write(DataOutputStream out, int pc) throws IOException { @@ -33,8 +49,17 @@ public class LStore extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - long l = (long) frame.getStack().pop(); - frame.getVariables().set(index, l); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + assert value.getType().equals(new Type(long.class.getName())); + ins.pop(value); + + variables.set(index, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override @@ -48,4 +73,11 @@ public class LStore extends Instruction implements LVTInstruction { return true; } + + @Override + public void writeWide(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_0.java index 1931f12a9d..ae7195a602 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_0.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,17 @@ public class LStore_0 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Long; - frame.getVariables().set(0, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + assert value.getType().equals(new Type(long.class.getName())); + ins.pop(value); + + variables.set(0, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_1.java index 6fe9e715d5..b9e18c24c7 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_1.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,17 @@ public class LStore_1 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Long; - frame.getVariables().set(1, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + assert value.getType().equals(new Type(long.class.getName())); + ins.pop(value); + + variables.set(1, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_2.java index 0a8b7e1060..98ea09416d 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_2.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,17 @@ public class LStore_2 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Long; - frame.getVariables().set(2, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + assert value.getType().equals(new Type(long.class.getName())); + ins.pop(value); + + variables.set(2, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_3.java index d900e7b899..69e108a980 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore_3.java @@ -5,6 +5,12 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; +import info.sigterm.deob.execution.VariableContext; +import info.sigterm.deob.execution.Variables; import java.io.IOException; @@ -18,9 +24,17 @@ public class LStore_3 extends Instruction implements LVTInstruction @Override public void execute(Frame frame) { - Object obj = frame.getStack().pop(); - assert obj instanceof Long; - frame.getVariables().set(3, obj); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + Variables variables = frame.getVariables(); + + StackContext value = stack.pop(); + assert value.getType().equals(new Type(long.class.getName())); + ins.pop(value); + + variables.set(3, new VariableContext(ins, value.getType())); + + frame.addInstructionContext(ins); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LSub.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LSub.java index b57f4c7863..0908746b88 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LSub.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LSub.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LSub extends Instruction { @@ -16,11 +18,17 @@ public class LSub extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Long two = (Long) stack.pop(); - Long one = (Long) stack.pop(); + StackContext two = stack.pop(); + StackContext one = stack.pop(); - stack.push(this, one - two); + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LUShR.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LUShR.java index 53c3022864..2130c88beb 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LUShR.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LUShR.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LUShR extends Instruction { @@ -16,10 +18,17 @@ public class LUShR extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Long two = (Long) stack.pop(); - Long one = (Long) stack.pop(); - stack.push(this, one >>> (two & 0x3F)); + StackContext one = stack.pop(); + StackContext two = stack.pop(); + + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LXor.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LXor.java index d14eb42f22..2017113c6a 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LXor.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LXor.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class LXor extends Instruction { @@ -16,10 +18,17 @@ public class LXor extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Long two = (Long) stack.pop(); - Long one = (Long) stack.pop(); - stack.push(this, one ^ two); + StackContext two = stack.pop(); + StackContext one = stack.pop(); + + ins.pop(two, one); + + StackContext ctx = new StackContext(ins, long.class); + stack.push(ctx); + + frame.addInstructionContext(ins); } } 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 a9c7daa1dc..8c773cf25d 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 @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.Path; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -70,18 +72,23 @@ public class LookupSwitch extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - e.getStack().pop(); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext value = stack.pop(); + ins.pop(value); + + frame.addInstructionContext(ins); for (int i : branch) { - Path p = e.getPath().dup(); - p.getCurrentFrame().jump(i); + Frame other = frame.dup(); + other.jump(i); } - Path p = e.getPath().dup(); - p.getCurrentFrame().jump(def); + frame.jump(def); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/MonitorEnter.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/MonitorEnter.java index 78b885cce9..250baccee0 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/MonitorEnter.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/MonitorEnter.java @@ -4,6 +4,10 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; public class MonitorEnter extends Instruction { @@ -15,5 +19,12 @@ public class MonitorEnter extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext object = stack.pop(); + ins.pop(object); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/MonitorExit.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/MonitorExit.java index 36cbaec18f..aef455cf98 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/MonitorExit.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/MonitorExit.java @@ -4,6 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class MonitorExit extends Instruction { @@ -15,5 +18,12 @@ public class MonitorExit extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext object = stack.pop(); + ins.pop(object); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/MultiANewArray.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/MultiANewArray.java index 5409fe0139..e82baff1af 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/MultiANewArray.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/MultiANewArray.java @@ -5,7 +5,10 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import info.sigterm.deob.pool.Class; import java.io.DataInputStream; @@ -36,17 +39,21 @@ public class MultiANewArray extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - Stack stack = e.getStack(); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); - ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); - - // XXX primive type/array type ? [[I [[Lmyclass; etc - ClassFile cf = thisClass.getGroup().findClass(clazz.getName()); - - int[] dims = new int[dimensions]; for (int i = 0; i < dimensions; ++i) - dims[i] = (int) stack.pop(); + { + StackContext ctx = stack.pop(); + ins.pop(ctx); + } + + Type t = new Type(new info.sigterm.deob.signature.Type(clazz.getName())); + StackContext ctx = new StackContext(ins, t); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/New.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/New.java index b011d6d703..511e385e77 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/New.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/New.java @@ -4,9 +4,11 @@ import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; -import info.sigterm.deob.execution.ClassInstance; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.ObjectInstance; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import info.sigterm.deob.pool.Class; import java.io.DataInputStream; @@ -34,18 +36,14 @@ public class New extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); - ClassFile cf = thisClass.getGroup().findClass(clazz.getName()); - if (cf == null) - { - e.getStack().push(this, null); - return; - } + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); - ClassInstance type = e.getPath().getClassInstance(cf); - ObjectInstance obj = e.getPath().createObject(type); - e.getStack().push(this, obj); + StackContext ctx = new StackContext(ins, new Type(clazz.getName())); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/NewArray.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/NewArray.java index db9defee96..1c1612a016 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/NewArray.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/NewArray.java @@ -4,6 +4,10 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.execution.Type; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -30,37 +34,47 @@ public class NewArray extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - int count = (int) e.getStack().pop(); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + StackContext count = stack.pop(); + ins.pop(count); + + Class t = null; switch (type) { case 4: - e.getStack().push(this, new boolean[count]); + t = boolean.class; break; case 5: - e.getStack().push(this, new char[count]); + t = char.class; break; case 6: - e.getStack().push(this, new float[count]); + t = float.class; break; case 7: - e.getStack().push(this, new double[count]); + t = double.class; break; case 8: - e.getStack().push(this, new byte[count]); + t = byte.class; break; case 9: - e.getStack().push(this, new short[count]); + t = short.class; break; case 10: - e.getStack().push(this, new int[count]); + t = int.class; break; case 11: - e.getStack().push(this, new long[count]); + t = long.class; break; } + + StackContext ctx = new StackContext(ins, new Type(t.getName())); + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/PutField.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/PutField.java index 1b09417cf3..90dae2302a 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/PutField.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/PutField.java @@ -5,9 +5,10 @@ import info.sigterm.deob.ConstantPool; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; -import info.sigterm.deob.execution.FieldInstance; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.ObjectInstance; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.pool.Field; import info.sigterm.deob.pool.NameAndType; @@ -36,20 +37,16 @@ public class PutField extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - NameAndType nat = field.getNameAndType(); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); - ObjectInstance object = (ObjectInstance) e.getStack().pop(); - Object value = e.getStack().pop(); + StackContext object = stack.pop(); + StackContext value = stack.pop(); + ins.pop(object, value); - if (object == null) - { - return; - } - - FieldInstance field = object.getField(nat); - field.setValue(value); + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/PutStatic.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/PutStatic.java index 00bded78ee..b6a029d89b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/PutStatic.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/PutStatic.java @@ -5,9 +5,10 @@ import info.sigterm.deob.ConstantPool; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; -import info.sigterm.deob.execution.ClassInstance; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.StaticFieldInstance; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.pool.Class; import info.sigterm.deob.pool.Field; import info.sigterm.deob.pool.NameAndType; @@ -37,22 +38,15 @@ public class PutStatic extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); - - Class clazz = field.getClassEntry(); - NameAndType nat = field.getNameAndType(); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); - Object value = e.getStack().pop(); - - ClassFile cf = thisClass.getGroup().findClass(clazz.getName()); - if (cf == null) - return; - - ClassInstance ci = e.getPath().getClassInstance(cf); - StaticFieldInstance fi = ci.findStaticField(nat); - fi.setField(value); + StackContext object = stack.pop(); + ins.pop(object); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Return.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Return.java index ba1a4e4e64..8164a8f890 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Return.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Return.java @@ -4,6 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.IOException; @@ -15,10 +18,17 @@ public class Return extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - Object ret = e.getStack().pop(); - e.getPath().returnFrame(this, ret); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext object = stack.pop(); + ins.pop(object); + + frame.addInstructionContext(ins); + + frame.stop(); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/SALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/SALoad.java index 97ec3b6929..ae5f3d0f22 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/SALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/SALoad.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class SALoad extends Instruction { @@ -16,11 +18,17 @@ public class SALoad extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - int index = (int) stack.pop(); - short[] array = (short[]) stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - stack.push(this, array[index]); + ins.pop(index, array); + + StackContext ctx = new StackContext(ins, int.class); // sign extend + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/SAStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/SAStore.java index 826f54bd86..d684f8e85b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/SAStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/SAStore.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class SAStore extends Instruction { @@ -16,12 +18,15 @@ public class SAStore extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - short value = (short) stack.pop(); - int index = (int) stack.pop(); - short[] array = (short[]) stack.pop(); + StackContext value = stack.pop(); + StackContext index = stack.pop(); + StackContext array = stack.pop(); - array[index] = value; + ins.pop(value, index, array); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/SiPush.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/SiPush.java index c58dad7b7c..a61d975d5c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/SiPush.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/SiPush.java @@ -4,6 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -32,6 +35,12 @@ public class SiPush extends Instruction @Override public void execute(Frame frame) { - frame.getStack().push(this, s); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext ctx = new StackContext(ins, int.class); // sign extend + stack.push(ctx); + + frame.addInstructionContext(ins); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Swap.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Swap.java index 600e507c7e..c88e9ae22f 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Swap.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Swap.java @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; public class Swap extends Instruction { @@ -16,12 +18,20 @@ public class Swap extends Instruction @Override public void execute(Frame frame) { + InstructionContext ins = new InstructionContext(this, frame); Stack stack = frame.getStack(); - Object one = stack.pop(); - Object two = stack.pop(); + StackContext one = stack.pop(); + StackContext two = stack.pop(); - stack.push(this, one); - stack.push(this, two); + ins.pop(one, two); + + StackContext ctx = new StackContext(ins, one.getType()); + stack.push(ctx); + + ctx = new StackContext(ins, two.getType()); + stack.push(ctx); + + frame.addInstructionContext(ins); } } 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 29d1c3f9b1..86b64ad6ed 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 @@ -4,7 +4,9 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.Path; +import info.sigterm.deob.execution.InstructionContext; +import info.sigterm.deob.execution.Stack; +import info.sigterm.deob.execution.StackContext; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -66,18 +68,23 @@ public class TableSwitch extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - e.getStack().pop(); + InstructionContext ins = new InstructionContext(this, frame); + Stack stack = frame.getStack(); + + StackContext value = stack.pop(); + ins.pop(value); + + frame.addInstructionContext(ins); for (int i : jumps) { - Path p = e.getPath().dup(); - p.getCurrentFrame().jump(i); + Frame other = frame.dup(); + other.jump(i); } - Path p = e.getPath().dup(); - p.getCurrentFrame().jump(def); + frame.jump(def); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/VReturn.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/VReturn.java index a407496ff2..11784ed681 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/VReturn.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/VReturn.java @@ -15,10 +15,9 @@ public class VReturn extends Instruction } @Override - public void execute(Frame e) + public void execute(Frame frame) { - // XXX exceptions? - e.getPath().returnFrame(); + frame.stop(); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Wide.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Wide.java index d3f96ffd41..8b18fc393c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Wide.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Wide.java @@ -3,17 +3,17 @@ package info.sigterm.deob.attributes.code.instructions; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; +import info.sigterm.deob.attributes.code.instruction.types.WideInstruction; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.lang.reflect.Constructor; public class Wide extends Instruction { - private byte opcode; - private int index; - private int value; + private Instruction ins; public Wide(Instructions instructions, InstructionType type, int pc) throws IOException { @@ -21,17 +21,18 @@ public class Wide extends Instruction DataInputStream is = instructions.getCode().getAttributes().getStream(); - opcode = is.readByte(); - index = is.readUnsignedShort(); - length += 3; - - // XXX - InstructionType optype = InstructionType.findInstructionFromCode(opcode); - assert optype != null; - if (optype == InstructionType.IINC) + byte opcode = is.readByte(); // this byte is already in the length of the new instruction (length is initialized to 1) + InstructionType op = InstructionType.findInstructionFromCode(opcode); + + try { - value = is.readUnsignedShort(); - length += 2; + Constructor con = op.getInstructionClass().getConstructor(Instructions.class, InstructionType.class, Instruction.class, int.class); + ins = con.newInstance(instructions, type, this, pc); + length += ins.getLength(); + } + catch (Exception ex) + { + throw new IOException(ex); } } @@ -40,21 +41,14 @@ public class Wide extends Instruction { super.write(out, pc); - out.writeByte(opcode); - out.writeShort(index); - - InstructionType optype = InstructionType.findInstructionFromCode(opcode); - assert optype != null; - if (optype == InstructionType.IINC) - { - out.writeShort(value); - } + WideInstruction w = (WideInstruction) ins; + w.writeWide(out, pc); } @Override public void execute(Frame e) { - throw new UnsupportedOperationException("wide not supported"); + ins.execute(e); } } diff --git a/src/main/java/info/sigterm/deob/execution/ArrayInstance.java b/src/main/java/info/sigterm/deob/execution/ArrayInstance.java deleted file mode 100644 index e61c4e73a0..0000000000 --- a/src/main/java/info/sigterm/deob/execution/ArrayInstance.java +++ /dev/null @@ -1,42 +0,0 @@ -package info.sigterm.deob.execution; - -import java.util.Arrays; - - -public class ArrayInstance extends ObjectInstanceBase -{ - private Object[] array; - - public ArrayInstance(Path path, ClassInstance type, int len) - { - super(path, type); - this.array = new Object[len]; - } - - private ArrayInstance(ArrayInstance other, Path path, ClassInstance type) - { - super(path, type); - this.array = Arrays.copyOf(other.array, other.array.length); - } - - public void put(Object obj, int idx) - { - array[idx] = obj; - } - - public Object get(int idx) - { - return array[idx]; - } - - public int getLength() - { - return array.length; - } - - @Override - public ObjectInstanceBase dup(Path path, ClassInstance type) - { - return new ArrayInstance(this, path, type); - } -} diff --git a/src/main/java/info/sigterm/deob/execution/ClassInstance.java b/src/main/java/info/sigterm/deob/execution/ClassInstance.java deleted file mode 100644 index d5156b08f1..0000000000 --- a/src/main/java/info/sigterm/deob/execution/ClassInstance.java +++ /dev/null @@ -1,62 +0,0 @@ -package info.sigterm.deob.execution; - -import info.sigterm.deob.ClassFile; -import info.sigterm.deob.Field; -import info.sigterm.deob.Fields; -import info.sigterm.deob.attributes.AttributeType; -import info.sigterm.deob.attributes.Attributes; -import info.sigterm.deob.attributes.ConstantValue; -import info.sigterm.deob.pool.NameAndType; - -import java.util.ArrayList; - -public class ClassInstance -{ - private Path path; - private ClassFile clazz; - private ArrayList fields = new ArrayList(); - - public ClassInstance(Path path, ClassFile clazz) - { - this.path = path; - this.clazz = clazz; - - /* initialize static fields */ - Fields fields = clazz.getFields(); - for (Field field : fields.getFields()) - if ((field.getAccessFlags() & Field.ACC_STATIC) != 0) - { - Attributes attributes = field.getAttributes(); - ConstantValue cv = (ConstantValue) attributes.findType(AttributeType.CONSTANT_VALUE); - - StaticFieldInstance fi = new StaticFieldInstance(this, field, cv); - this.fields.add(fi); - } - } - - protected ClassInstance(Path path, ClassInstance other) - { - this.path = path; - this.clazz = other.clazz; - for (StaticFieldInstance f : other.fields) - this.fields.add(new StaticFieldInstance(other, f)); - } - - public Path getPath() - { - return path; - } - - public ClassFile getClassFile() - { - return clazz; - } - - public StaticFieldInstance findStaticField(NameAndType nat) - { - for (StaticFieldInstance f : fields) - if (f.getField().getName().equals(nat.getName()) && f.getField().getType().equals(nat.getDescriptorType())) - return f; - return null; - } -} diff --git a/src/main/java/info/sigterm/deob/execution/Execution.java b/src/main/java/info/sigterm/deob/execution/Execution.java index 82b749de88..10392c6244 100644 --- a/src/main/java/info/sigterm/deob/execution/Execution.java +++ b/src/main/java/info/sigterm/deob/execution/Execution.java @@ -7,69 +7,30 @@ import info.sigterm.deob.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; public class Execution { private ClassGroup group; - private ArrayList paths = new ArrayList(); // paths of execution - private HashMap> visited = new HashMap>(); - //protected HashSet methods = new HashSet(); + public List frames = new ArrayList<>(); public Execution(ClassGroup group) { this.group = group; } - - public void run(ClassFile cf, Method method, Object... args) + + public int run() { - Path p = new Path(this); - ClassInstance instance = p.getClassInstance(cf); - ObjectInstance object = p.createObject(instance); + int fcount = 0; - int count = 1; - p.invoke(method, object); - - while (!paths.isEmpty()) + while (!frames.isEmpty()) { - p = paths.remove(0); - ++count; - try - { - System.out.println("Resuming path with " + paths.size() + " remaining"); - p.resume(); - } - catch (Exception ex) - { - ex.printStackTrace(); - } + Frame frame = frames.remove(0); + System.out.println("Executing frame " + frame); + ++fcount; + frame.execute(); } - System.out.println("Done " + count + " paths"); - } - - public void addPath(Path p) - { - paths.add(p); - } - - public boolean visit(Method m) - { - if (visited.containsKey(m)) - return false; - - visited.put(m, new HashSet()); - return true; - } - - public boolean visit(Method m, int pc) - { - HashSet map = visited.get(m); - if (map == null || !map.contains(pc)) - { - map.add(pc); - return true; - } - - return false; + return fcount; } } diff --git a/src/main/java/info/sigterm/deob/execution/FieldInstance.java b/src/main/java/info/sigterm/deob/execution/FieldInstance.java deleted file mode 100644 index 2f1235ec78..0000000000 --- a/src/main/java/info/sigterm/deob/execution/FieldInstance.java +++ /dev/null @@ -1,39 +0,0 @@ -package info.sigterm.deob.execution; - -import info.sigterm.deob.Field; - -public class FieldInstance -{ - private ObjectInstance object; - private Field field; - private Object value; - - public FieldInstance(ObjectInstance object, Field field, Object value) - { - this.object = object; - this.field = field; - this.value = value; - } - - protected FieldInstance(ObjectInstance object, FieldInstance other) - { - this.object = object; - this.field = other.field; - this.value = other.value; - } - - public Field getField() - { - return field; - } - - public Object getValue() - { - return value; - } - - public void setValue(Object obj) - { - value = obj; - } -} diff --git a/src/main/java/info/sigterm/deob/execution/Frame.java b/src/main/java/info/sigterm/deob/execution/Frame.java index c1737edb90..172cc1ada1 100644 --- a/src/main/java/info/sigterm/deob/execution/Frame.java +++ b/src/main/java/info/sigterm/deob/execution/Frame.java @@ -1,47 +1,84 @@ package info.sigterm.deob.execution; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import info.sigterm.deob.Method; import info.sigterm.deob.attributes.Code; import info.sigterm.deob.attributes.code.Exception; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.Instructions; +import info.sigterm.deob.attributes.code.instructions.LookupSwitch; +import info.sigterm.deob.attributes.code.instructions.TableSwitch; +import info.sigterm.deob.pool.NameAndType; public class Frame { - private Path path; + private Execution execution; private Method method; - boolean executing = true; + private boolean executing = true; private int pc; private Stack stack; private Variables variables; + private List instructions = new ArrayList<>(); // instructions executed in this frame + private Map visited; // shared - public Frame(Path path, Method method) + public Frame(Execution execution, Method method) { - Code code = method.getCode(); - - this.path = path; + this.execution = execution; this.method = method; + + Code code = method.getCode(); stack = new Stack(code.getMaxStack()); variables = new Variables(code.getMaxLocals()); + + visited = new HashMap<>(); + + // initialize LVT + int pos = 0; + if (!method.isStatic()) + variables.set(pos++, new VariableContext(null, new Type(method.getMethods().getClassFile().getName()))); + + NameAndType nat = method.getNameAndType(); + for (int i = 0; i < nat.getNumberOfArgs(); ++i) + { + variables.set(pos, new VariableContext(null, new Type(nat.getDescriptor().getTypeOfArg(i)).toStackType())); + pos += nat.getDescriptor().getTypeOfArg(i).getSlots(); + } } - protected Frame(Path path, Frame other) + protected Frame(Frame other) { - this.path = path; + this.execution = other.execution; this.method = other.method; this.executing = other.executing; this.pc = other.pc; this.stack = new Stack(other.stack); this.variables = new Variables(other.variables); + this.visited = other.visited; } - - public Path getPath() + + public Frame dup() { - return path; + Frame other = new Frame(this); + execution.frames.add(other); + return other; + } + + public void stop() + { + executing = false; + } + + public void throwException(Type type) + { + executing = false; // XXX } public Method getMethod() @@ -58,12 +95,17 @@ public class Frame { return stack; } - + public Variables getVariables() { return variables; } + public void addInstructionContext(InstructionContext i) + { + instructions.add(i); + } + public void execute() { Instructions ins = method.getCode().getInstructions(); @@ -90,16 +132,11 @@ public class Frame System.err.println("Frame stack (grows downward):"); while (stack.getSize() > 0) { - Instruction stacki = stack.getIns(); - Object obj = stack.pop(); - if (obj != null) - System.err.println(" " + obj + " (class " + obj.getClass().getName() + ") pushed by instruction " + stacki + " at pc " + stacki.getPc()); - else - System.err.println(" " + obj + " pushed by instruction " + stacki + " at pc " + stacki.getPc()); + StackContext stacki = stack.pop(); + System.err.println(stacki); } System.err.println("end of stack"); ex.printStackTrace(); - //System.exit(-1); throw ex; } @@ -114,39 +151,42 @@ public class Frame } } - public void resume() + private void doJump(Instruction from, Instruction to) { - execute(); + visited.put(from, to); } - public void skip() + private boolean hasJumped(Instruction from, Instruction to) { - /* for resume, skip current ins? */ - Instructions ins = method.getCode().getInstructions(); - Instruction i = ins.findInstruction(pc); - pc += i.getLength(); - } - - private void checkLoop() - { - if (!this.getPath().getExecution().visit(method, pc)) - { - System.out.println("Ending frame " + this); - executing = false; - } + Instruction i = visited.get(from); + if (from instanceof TableSwitch || from instanceof LookupSwitch) // XXX magic instructions which jump to multiple different places + if (i != null) + return true; + assert i == null || i == to; + return i == to; } public void jump(int offset) { - assert offset != 0; - pc += offset; - checkLoop(); + jumpAbsolute(pc + offset); } public void jumpAbsolute(int pc) { + Instruction from = method.getCode().getInstructions().findInstruction(this.pc); + Instruction to = method.getCode().getInstructions().findInstruction(pc); + + assert from != null; + assert to != null; + + if (hasJumped(from, to)) + { + executing = false; + return; + } + + doJump(from, to); this.pc = pc; - checkLoop(); } public Collection getExceptionHandlers() diff --git a/src/main/java/info/sigterm/deob/execution/InstructionContext.java b/src/main/java/info/sigterm/deob/execution/InstructionContext.java new file mode 100644 index 0000000000..e2b22effd7 --- /dev/null +++ b/src/main/java/info/sigterm/deob/execution/InstructionContext.java @@ -0,0 +1,42 @@ +package info.sigterm.deob.execution; + +import java.util.ArrayList; +import java.util.List; + +import info.sigterm.deob.attributes.code.Instruction; + +public class InstructionContext +{ + private Instruction ins; + private Frame frame; + private List pops = new ArrayList<>(); + private List reads = new ArrayList<>(); // lvt reads + + public InstructionContext(Instruction i, Frame f) + { + ins = i; + frame = f; + } + + public void pop(StackContext... ctx) + { + for (StackContext c : ctx) + pops.add(c); + } + + public void read(VariableContext... ctx) + { + for (VariableContext c : ctx) + reads.add(c); + } + + public Instruction getInstruction() + { + return ins; + } + + public List getPops() + { + return pops; + } +} diff --git a/src/main/java/info/sigterm/deob/execution/ObjectInstance.java b/src/main/java/info/sigterm/deob/execution/ObjectInstance.java deleted file mode 100644 index bb9b224964..0000000000 --- a/src/main/java/info/sigterm/deob/execution/ObjectInstance.java +++ /dev/null @@ -1,57 +0,0 @@ -package info.sigterm.deob.execution; - -import info.sigterm.deob.Field; -import info.sigterm.deob.Fields; -import info.sigterm.deob.attributes.AttributeType; -import info.sigterm.deob.attributes.Attributes; -import info.sigterm.deob.attributes.ConstantValue; -import info.sigterm.deob.pool.NameAndType; - -import java.util.ArrayList; - -public class ObjectInstance extends ObjectInstanceBase -{ - private ArrayList fields = new ArrayList(); - - public ObjectInstance(Path path, ClassInstance type) - { - super(path, type); - - /* create fields */ - Fields fields = type.getClassFile().getFields(); - for (Field field : fields.getFields()) - { - if ((field.getAccessFlags() & Field.ACC_STATIC) != 0) - continue; - - Attributes attributes = field.getAttributes(); - ConstantValue cv = (ConstantValue) attributes.findType(AttributeType.CONSTANT_VALUE); - - FieldInstance fi = new FieldInstance(this, field, cv != null ? cv.getValue().getObject() : null); - this.fields.add(fi); - } - } - - private ObjectInstance(ObjectInstance other, Path path, ClassInstance type) - { - super(path, type); - - /* copy fields */ - for (FieldInstance field : other.fields) - this.fields.add(new FieldInstance(this, field)); - } - - public FieldInstance getField(NameAndType nat) - { - for (FieldInstance f : fields) - if (f.getField().getName().equals(nat.getName()) && f.getField().getType().equals(nat.getDescriptorType())) - return f; - return null; - } - - @Override - public ObjectInstanceBase dup(Path path, ClassInstance type) - { - return new ObjectInstance(this, path, type); - } -} diff --git a/src/main/java/info/sigterm/deob/execution/ObjectInstanceBase.java b/src/main/java/info/sigterm/deob/execution/ObjectInstanceBase.java deleted file mode 100644 index 5f93402ac7..0000000000 --- a/src/main/java/info/sigterm/deob/execution/ObjectInstanceBase.java +++ /dev/null @@ -1,21 +0,0 @@ -package info.sigterm.deob.execution; - - -public abstract class ObjectInstanceBase -{ - private Path path; - private ClassInstance type; - - public ObjectInstanceBase(Path path, ClassInstance type) - { - this.path = path; - this.type = type; - } - - public ClassInstance getType() - { - return type; - } - - public abstract ObjectInstanceBase dup(Path path, ClassInstance type); -} diff --git a/src/main/java/info/sigterm/deob/execution/Path.java b/src/main/java/info/sigterm/deob/execution/Path.java deleted file mode 100644 index 532fd1ef54..0000000000 --- a/src/main/java/info/sigterm/deob/execution/Path.java +++ /dev/null @@ -1,174 +0,0 @@ -package info.sigterm.deob.execution; - -import info.sigterm.deob.ClassFile; -import info.sigterm.deob.Method; -import info.sigterm.deob.attributes.code.Exception; -import info.sigterm.deob.attributes.code.Instruction; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; - -public class Path -{ - private Execution execution; - private ArrayList classes = new ArrayList(); - private ArrayList objects = new ArrayList(); - private java.util.Stack frames = new java.util.Stack(); // current execution frames - - public Path(Execution execution) - { - this.execution = execution; - } - - private Path(Path other) - { - HashMap classmap = new HashMap(); - - this.execution = other.execution; - - for (ClassInstance c : other.classes) - { - ClassInstance newclass = new ClassInstance(this, c); - classmap.put(c, newclass); - this.classes.add(newclass); - } - - for (ObjectInstanceBase o : other.objects) - o.dup(this, classmap.get(o.getType())); - - /* iteration order of a Stack is in reverse */ - for (Frame f : other.frames) - frames.push(new Frame(this, f)); - } - - public Execution getExecution() - { - return execution; - } - - public ClassInstance getClassInstance(ClassFile clazz) - { - for (ClassInstance cl : classes) - if (cl.getClassFile() == clazz) - return cl; - - /* load parent */ - ClassFile parent = clazz.getParent(); - if (parent != null) - getClassInstance(parent); - - ClassInstance cl = new ClassInstance(this, clazz); - classes.add(cl); - - return cl; - } - - public ObjectInstance createObject(ClassInstance type) - { - ObjectInstance obj = new ObjectInstance(this, type); - objects.add(obj); - return obj; - } - - public ArrayInstance createArray(ClassInstance type, int len) - { - ArrayInstance arr = new ArrayInstance(this, type, len); - objects.add(arr); - return arr; - } - - public Frame getCurrentFrame() - { - return frames.peek(); - } - - public Path dup() - { - Path other = new Path(this); - execution.addPath(other); - return other; - } - - public void resume() - { - for (Frame f : frames) - { - /* top most is at the correct pc */ - if (f == frames.peek()) - break; - - /* move pc past invoke function */ - f.skip(); - } - - /* resume execution */ - while (!frames.isEmpty()) - { - Frame top = frames.peek(); - top.resume(); - if (!frames.isEmpty() && frames.peek() == top) - frames.pop(); // XXX throwing doesnt remove - } - } - - public void invoke(Method method, Object... args) - { - if (!this.getExecution().visit(method)) - return; - - Frame f = new Frame(this, method); - Variables vars = f.getVariables(); - for (int i = 0; i < args.length; ++i) - vars.set(i, args[i]); - frames.push(f); - System.out.println("Executing frame " + method.getName() + " " + method.getDescriptor()); - f.execute(); - if (frames.isEmpty() == false && frames.peek() == f) - System.err.println("Unpopped frame post execute"); - } - - public void returnFrame(Instruction i, Object value) - { - returnFrame(); - Frame prevFrame = getCurrentFrame(); - - prevFrame.getStack().push(i, value); - } - - public void returnFrame() - { - Frame currentFrame = frames.pop(); - currentFrame.executing = false; - } - - public void throwException(Instruction ins, ObjectInstance exception) - { - ArrayList exceptions = new ArrayList(); - - /* collect all existing exception handlers */ - for (Frame f : frames) - { - Collection handlers = f.getExceptionHandlers(); - exceptions.addAll(handlers); - } - - for (Exception handler : exceptions) - { - /* jump to handler */ - Method handlerMethod = handler.getExceptions().getCode().getAttributes().getMethod(); - - Path other = this.dup(); - /* walk up the frames until we find the one which holds the exception handler */ - while (handlerMethod != other.getCurrentFrame().getMethod()) - other.returnFrame(); - - /* handler pc is absolute from the beginning instruction */ - other.getCurrentFrame().jumpAbsolute(handler.getHandlerPc()); - } - - /* this path stops executing */ - for (Frame f : frames) - f.executing = false; - } -} diff --git a/src/main/java/info/sigterm/deob/execution/Stack.java b/src/main/java/info/sigterm/deob/execution/Stack.java index cac95df88a..4bdc1fe03e 100644 --- a/src/main/java/info/sigterm/deob/execution/Stack.java +++ b/src/main/java/info/sigterm/deob/execution/Stack.java @@ -3,50 +3,59 @@ package info.sigterm.deob.execution; import java.util.Arrays; import info.sigterm.deob.attributes.code.Instruction; +import info.sigterm.deob.pool.Method; public class Stack { private int size; - private Object[] stack; - private Instruction[] ins; + private StackContext[] stack; public Stack(int sz) { - stack = new Object[sz]; - ins = new Instruction[sz]; + stack = new StackContext[sz]; } protected Stack(Stack other) { this.size = other.size; this.stack = Arrays.copyOf(other.stack, other.stack.length); - this.ins = Arrays.copyOf(other.ins, other.ins.length); - } - - public void push(Instruction i, Object obj) - { - if (size == stack.length) - throw new RuntimeException("Stack overflow"); - - stack[size] = obj; - ins[size] = i; - - ++size; } - public Instruction getIns() + private void printStack(StackContext ctx, int level) { - if (size <= 0) - throw new RuntimeException("Stack underflow"); - - return ins[size - 1]; + for (int i = 0; i < level; ++i) + System.err.print(" "); + System.err.println(ctx.getType().type + " pushed by " + ctx.getIns().getInstruction().getType().getName() + " at " + ctx.getIns().getInstruction().getPc()); + for (StackContext c : ctx.getIns().getPops()) + printStack(c, level + 2); } - public Object pop() + public void push(StackContext i) + { + if (size == stack.length) + { + info.sigterm.deob.Method m = i.getIns().getInstruction().getInstructions().getCode().getAttributes().getMethod(); + System.err.println("in " + m.getMethods().getClassFile().getName() + " method " + m.getNameAndType().getName()); + for (int c = 0; c < stack.length; ++c) + printStack(stack[c], 0); + throw new RuntimeException("Stack overflow"); + } + + assert !i.getType().type.equals("V"); + + System.out.println("PUSH context " + i.getType().type + " from + " + i.getIns().getInstruction()); + stack[size] = i; + ++size; + } + + public StackContext pop() { if (size <= 0) throw new RuntimeException("Stack underflow"); + System.out.println("POP"); + if (size == 1) + System.out.println("STACK SIZE IS NOW ZERO"); return stack[--size]; } diff --git a/src/main/java/info/sigterm/deob/execution/StackContext.java b/src/main/java/info/sigterm/deob/execution/StackContext.java new file mode 100644 index 0000000000..14f5815a84 --- /dev/null +++ b/src/main/java/info/sigterm/deob/execution/StackContext.java @@ -0,0 +1,35 @@ +package info.sigterm.deob.execution; + +public class StackContext +{ + private InstructionContext ic; // instruction which pushed this + private Type type; // type of this + + public StackContext(InstructionContext i, Type t) + { + ic = i; + type = t; + } + + public StackContext(InstructionContext i, Class c) + { + ic = i; + type = new Type(c.getCanonicalName()); + } + + public StackContext(InstructionContext i, info.sigterm.deob.pool.Class c) + { + ic = i; + type = new Type(c.getName()); + } + + public InstructionContext getIns() + { + return ic; + } + + public Type getType() + { + return type; + } +} diff --git a/src/main/java/info/sigterm/deob/execution/StaticFieldInstance.java b/src/main/java/info/sigterm/deob/execution/StaticFieldInstance.java deleted file mode 100644 index e7f3583990..0000000000 --- a/src/main/java/info/sigterm/deob/execution/StaticFieldInstance.java +++ /dev/null @@ -1,41 +0,0 @@ -package info.sigterm.deob.execution; - -import info.sigterm.deob.Field; -import info.sigterm.deob.attributes.ConstantValue; - -public class StaticFieldInstance -{ - private ClassInstance clazz; - private Field field; - private Object value; - - public StaticFieldInstance(ClassInstance clazz, Field field, ConstantValue value) - { - this.clazz = clazz; - this.field = field; - if (value != null) - this.value = value.getValue().getObject(); - } - - protected StaticFieldInstance(ClassInstance clazz, StaticFieldInstance other) - { - this.clazz = clazz; - this.field = other.field; - this.value = other.value; - } - - public Field getField() - { - return field; - } - - public Object getValue() - { - return value; - } - - public void setField(Object obj) - { - value = obj; - } -} diff --git a/src/main/java/info/sigterm/deob/execution/Type.java b/src/main/java/info/sigterm/deob/execution/Type.java new file mode 100644 index 0000000000..4c3d8630f2 --- /dev/null +++ b/src/main/java/info/sigterm/deob/execution/Type.java @@ -0,0 +1,73 @@ +package info.sigterm.deob.execution; + +public class Type +{ + public String type; + + public Type(String type) + { + if (type.startsWith("[")) + throw new IllegalStateException(); + this.type = type; + } + + public Type(info.sigterm.deob.signature.Type t) + { + String before = t.getType(); + type = asmTypeToClass(t.getType()); + for (int i = 0; i < t.getArrayDims(); ++i) + type = type + "[]"; + System.out.println(before + " -> " + type); + } + + public Type toStackType() + { + if (type.equals(byte.class.getCanonicalName()) || type.equals(char.class.getCanonicalName()) || type.equals(short.class.getCanonicalName()) + || type.equals(boolean.class.getCanonicalName())) + return new Type(int.class.getCanonicalName()); + return this; + } + + private static String asmTypeToClass(String type) + { + switch (type.toString()) + { + case "B": + return byte.class.getCanonicalName(); + case "C": + return char.class.getCanonicalName(); + case "I": + return int.class.getCanonicalName(); + case "S": + return short.class.getCanonicalName(); + case "Z": + return boolean.class.getCanonicalName(); + case "D": + return double.class.getCanonicalName(); + case "F": + return float.class.getCanonicalName(); + case "J": + return long.class.getCanonicalName(); + default: + return type.replace("/", "."); + } + } + + @Override + public boolean equals(Object other) + { + if (!(other instanceof Type)) + return false; + + Type t = (Type) other; + return type.equals(t.type); + } + + public Type getSubtype() + { + if (!type.endsWith("[]")) + throw new IllegalStateException(type + " is not an array type"); + + return new Type(type.substring(0, type.length() - 2)); + } +} diff --git a/src/main/java/info/sigterm/deob/execution/VariableContext.java b/src/main/java/info/sigterm/deob/execution/VariableContext.java new file mode 100644 index 0000000000..0a7e235417 --- /dev/null +++ b/src/main/java/info/sigterm/deob/execution/VariableContext.java @@ -0,0 +1,18 @@ +package info.sigterm.deob.execution; + +public class VariableContext +{ + private InstructionContext ic; + private Type type; + + public VariableContext(InstructionContext i, Type t) + { + ic = i; + type = t; + } + + public Type getType() + { + return type; + } +} diff --git a/src/main/java/info/sigterm/deob/execution/Variables.java b/src/main/java/info/sigterm/deob/execution/Variables.java index 23e4c62081..995a3df55b 100644 --- a/src/main/java/info/sigterm/deob/execution/Variables.java +++ b/src/main/java/info/sigterm/deob/execution/Variables.java @@ -1,28 +1,28 @@ -package info.sigterm.deob.execution; - -import java.util.Arrays; - -public class Variables -{ - private Object[] variables; - - public Variables(int sz) - { - variables = new Object[sz]; - } - - protected Variables(Variables other) - { - this.variables = Arrays.copyOf(other.variables, other.variables.length); - } - - public void set(int index, Object value) - { - variables[index] = value; - } - - public Object get(int index) - { - return variables[index]; - } -} +package info.sigterm.deob.execution; + +import java.util.Arrays; + +public class Variables +{ + private VariableContext[] variables; + + public Variables(int sz) + { + variables = new VariableContext[sz]; + } + + protected Variables(Variables other) + { + this.variables = Arrays.copyOf(other.variables, other.variables.length); + } + + public void set(int index, VariableContext value) + { + variables[index] = value; + } + + public VariableContext get(int index) + { + return variables[index]; + } +} diff --git a/src/main/java/info/sigterm/deob/pool/Class.java b/src/main/java/info/sigterm/deob/pool/Class.java index 1c2cf1cf08..f9aba1956e 100644 --- a/src/main/java/info/sigterm/deob/pool/Class.java +++ b/src/main/java/info/sigterm/deob/pool/Class.java @@ -1,6 +1,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; +import info.sigterm.deob.execution.Type; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -51,10 +52,10 @@ public class Class extends PoolEntry { out.writeShort(index); } - + @Override - public Object getObject() + public Type getTypeClass() { - return name; + return new Type(name); } } diff --git a/src/main/java/info/sigterm/deob/pool/Double.java b/src/main/java/info/sigterm/deob/pool/Double.java index 4a6054fc12..e59a6ef3df 100644 --- a/src/main/java/info/sigterm/deob/pool/Double.java +++ b/src/main/java/info/sigterm/deob/pool/Double.java @@ -1,6 +1,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; +import info.sigterm.deob.execution.Type; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -43,9 +44,9 @@ public class Double extends PoolEntry } @Override - public Object getObject() + public Type getTypeClass() { - return value; + return new Type(double.class.getCanonicalName()); } @Override diff --git a/src/main/java/info/sigterm/deob/pool/Float.java b/src/main/java/info/sigterm/deob/pool/Float.java index dc83084385..592c5a452c 100644 --- a/src/main/java/info/sigterm/deob/pool/Float.java +++ b/src/main/java/info/sigterm/deob/pool/Float.java @@ -1,6 +1,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; +import info.sigterm.deob.execution.Type; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -37,9 +38,9 @@ public class Float extends PoolEntry } @Override - public Object getObject() + public Type getTypeClass() { - return value; + return new Type(float.class.getCanonicalName()); } @Override diff --git a/src/main/java/info/sigterm/deob/pool/Integer.java b/src/main/java/info/sigterm/deob/pool/Integer.java index 5b76fd7925..bdc7c2a9b7 100644 --- a/src/main/java/info/sigterm/deob/pool/Integer.java +++ b/src/main/java/info/sigterm/deob/pool/Integer.java @@ -1,6 +1,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; +import info.sigterm.deob.execution.Type; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -37,9 +38,9 @@ public class Integer extends PoolEntry } @Override - public Object getObject() + public Type getTypeClass() { - return value; + return new Type(int.class.getCanonicalName()); } @Override diff --git a/src/main/java/info/sigterm/deob/pool/Long.java b/src/main/java/info/sigterm/deob/pool/Long.java index 01514bbf91..222d1b0e1a 100644 --- a/src/main/java/info/sigterm/deob/pool/Long.java +++ b/src/main/java/info/sigterm/deob/pool/Long.java @@ -1,6 +1,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; +import info.sigterm.deob.execution.Type; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -43,9 +44,9 @@ public class Long extends PoolEntry } @Override - public Object getObject() + public Type getTypeClass() { - return value; + return new Type(long.class.getCanonicalName()); } @Override diff --git a/src/main/java/info/sigterm/deob/pool/NameAndType.java b/src/main/java/info/sigterm/deob/pool/NameAndType.java index 6f390a2bfc..30fd68e199 100644 --- a/src/main/java/info/sigterm/deob/pool/NameAndType.java +++ b/src/main/java/info/sigterm/deob/pool/NameAndType.java @@ -103,7 +103,7 @@ public class NameAndType extends PoolEntry return 0d; case "F": return 0f; - case "L": + case "J": return 0L; default: return null; @@ -115,11 +115,11 @@ public class NameAndType extends PoolEntry return signature.size(); } - public boolean isNonVoid() + public boolean isVoid() { if (this.getName().equals("") || this.getName().equals("")) - return true; - return !signature.getReturnValue().equals("V"); + return true; + return signature.getReturnValue().getType().equals("V"); } @Override diff --git a/src/main/java/info/sigterm/deob/pool/PoolEntry.java b/src/main/java/info/sigterm/deob/pool/PoolEntry.java index 85fb4d0644..592d3ec19f 100644 --- a/src/main/java/info/sigterm/deob/pool/PoolEntry.java +++ b/src/main/java/info/sigterm/deob/pool/PoolEntry.java @@ -4,6 +4,7 @@ import java.io.DataOutputStream; import java.io.IOException; import info.sigterm.deob.ConstantPool; +import info.sigterm.deob.execution.Type; public abstract class PoolEntry { @@ -40,14 +41,14 @@ public abstract class PoolEntry { return type; } + + public Type getTypeClass() + { + throw new UnsupportedOperationException(); + } public int getSlots() { return 1; } - - public Object getObject() - { - return this; - } } diff --git a/src/main/java/info/sigterm/deob/pool/String.java b/src/main/java/info/sigterm/deob/pool/String.java index 3fbc02eda6..5891c077e7 100644 --- a/src/main/java/info/sigterm/deob/pool/String.java +++ b/src/main/java/info/sigterm/deob/pool/String.java @@ -1,6 +1,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; +import info.sigterm.deob.execution.Type; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -39,6 +40,12 @@ public class String extends PoolEntry stringIndex = this.getPool().makeUTF8(string); } + @Override + public Type getTypeClass() + { + return new Type(java.lang.String.class.getCanonicalName()); + } + @Override public boolean equals(Object other) { @@ -49,12 +56,6 @@ public class String extends PoolEntry return string.equals(s.string); } - @Override - public Object getObject() - { - return string; - } - @Override public void write(DataOutputStream out) throws IOException { diff --git a/src/main/java/info/sigterm/deob/pool/UTF8.java b/src/main/java/info/sigterm/deob/pool/UTF8.java index 94c629a5cb..f732628bd8 100644 --- a/src/main/java/info/sigterm/deob/pool/UTF8.java +++ b/src/main/java/info/sigterm/deob/pool/UTF8.java @@ -39,12 +39,6 @@ public class UTF8 extends PoolEntry { return string; } - - @Override - public Object getObject() - { - return getValue(); - } @Override public void write(DataOutputStream out) throws IOException diff --git a/src/main/java/info/sigterm/deob/signature/Signature.java b/src/main/java/info/sigterm/deob/signature/Signature.java index b2b607a6a4..990c61aea7 100644 --- a/src/main/java/info/sigterm/deob/signature/Signature.java +++ b/src/main/java/info/sigterm/deob/signature/Signature.java @@ -64,6 +64,11 @@ public class Signature arguments.remove(i); } + public Type getTypeOfArg(int i) + { + return arguments.get(i); + } + public Type getReturnValue() { return rv; diff --git a/src/main/java/info/sigterm/deob/signature/Type.java b/src/main/java/info/sigterm/deob/signature/Type.java index 0dd118aa66..82ecd72af9 100644 --- a/src/main/java/info/sigterm/deob/signature/Type.java +++ b/src/main/java/info/sigterm/deob/signature/Type.java @@ -16,6 +16,26 @@ public class Type type = str; } + public String getType() + { + return type; + } + + public int getArrayDims() + { + return arrayDimms; + } + + public int getSlots() + { + if (arrayDimms == 0) + { + if (type.equals("D") || type.equals("J")) + return 2; + } + return 1; + } + @Override public boolean equals(Object other) {