Keep real type of stack contexts, which I think I need later. Exec test passes, not sure of other implications of this.
This commit is contained in:
@@ -52,7 +52,7 @@ public class GetField extends Instruction implements GetFieldInstruction
|
||||
StackContext object = stack.pop();
|
||||
ins.pop(object);
|
||||
|
||||
StackContext ctx = new StackContext(ins, new Type(field.getNameAndType().getDescriptorType()).toStackType(), Value.NULL);
|
||||
StackContext ctx = new StackContext(ins, new Type(field.getNameAndType().getDescriptorType()), Value.NULL);
|
||||
stack.push(ctx);
|
||||
|
||||
ins.push(ctx);
|
||||
|
||||
@@ -56,7 +56,7 @@ public class GetStatic extends Instruction implements GetFieldInstruction
|
||||
InstructionContext ins = new InstructionContext(this, frame);
|
||||
Stack stack = frame.getStack();
|
||||
|
||||
StackContext ctx = new StackContext(ins, new Type(field.getNameAndType().getDescriptorType()).toStackType(), Value.NULL);
|
||||
StackContext ctx = new StackContext(ins, new Type(field.getNameAndType().getDescriptorType()), Value.NULL);
|
||||
stack.push(ctx);
|
||||
|
||||
ins.push(ctx);
|
||||
|
||||
@@ -65,7 +65,7 @@ public class IInc extends Instruction implements LVTInstruction, WideInstruction
|
||||
Variables var = frame.getVariables();
|
||||
|
||||
VariableContext vctx = var.get(index);
|
||||
assert vctx.getType().equals(new Type(int.class.getCanonicalName()));
|
||||
assert vctx.getType().isInt();
|
||||
ins.read(vctx);
|
||||
|
||||
Value value = vctx.getValue();
|
||||
|
||||
@@ -70,7 +70,7 @@ public class ILoad extends Instruction implements LVTInstruction, WideInstructio
|
||||
Variables variables = frame.getVariables();
|
||||
|
||||
VariableContext vctx = variables.get(index);
|
||||
assert vctx.getType().equals(new Type(int.class.getName()));
|
||||
assert vctx.getType().isInt();
|
||||
ins.read(vctx);
|
||||
|
||||
StackContext ctx = new StackContext(ins, vctx);
|
||||
|
||||
@@ -29,7 +29,7 @@ public class ILoad_0 extends Instruction implements LVTInstruction
|
||||
Variables variables = frame.getVariables();
|
||||
|
||||
VariableContext vctx = variables.get(0);
|
||||
assert vctx.getType().equals(new Type(int.class.getName()));
|
||||
assert vctx.getType().isInt();
|
||||
ins.read(vctx);
|
||||
|
||||
StackContext ctx = new StackContext(ins, vctx);
|
||||
|
||||
@@ -29,7 +29,7 @@ public class ILoad_1 extends Instruction implements LVTInstruction
|
||||
Variables variables = frame.getVariables();
|
||||
|
||||
VariableContext vctx = variables.get(1);
|
||||
assert vctx.getType().equals(new Type(int.class.getName()));
|
||||
assert vctx.getType().isInt();
|
||||
ins.read(vctx);
|
||||
|
||||
StackContext ctx = new StackContext(ins, vctx);
|
||||
|
||||
@@ -29,7 +29,7 @@ public class ILoad_2 extends Instruction implements LVTInstruction
|
||||
Variables variables = frame.getVariables();
|
||||
|
||||
VariableContext vctx = variables.get(2);
|
||||
assert vctx.getType().equals(new Type(int.class.getName()));
|
||||
assert vctx.getType().isInt();
|
||||
ins.read(vctx);
|
||||
|
||||
StackContext ctx = new StackContext(ins, vctx);
|
||||
|
||||
@@ -29,7 +29,7 @@ public class ILoad_3 extends Instruction implements LVTInstruction
|
||||
Variables variables = frame.getVariables();
|
||||
|
||||
VariableContext vctx = variables.get(3);
|
||||
assert vctx.getType().equals(new Type(int.class.getName()));
|
||||
assert vctx.getType().isInt();
|
||||
ins.read(vctx);
|
||||
|
||||
StackContext ctx = new StackContext(ins, vctx);
|
||||
|
||||
@@ -55,7 +55,7 @@ public class IStore extends Instruction implements LVTInstruction, WideInstructi
|
||||
Variables variables = frame.getVariables();
|
||||
|
||||
StackContext value = stack.pop();
|
||||
assert value.getType().equals(new Type(int.class.getName()));
|
||||
assert value.getType().isInt();
|
||||
ins.pop(value);
|
||||
|
||||
variables.set(index, new VariableContext(ins, value));
|
||||
|
||||
@@ -34,7 +34,7 @@ public class IStore_0 extends Instruction implements LVTInstruction
|
||||
Variables variables = frame.getVariables();
|
||||
|
||||
StackContext value = stack.pop();
|
||||
assert value.getType().equals(new Type(int.class.getName()));
|
||||
assert value.getType().isInt();
|
||||
ins.pop(value);
|
||||
|
||||
variables.set(0, new VariableContext(ins, value));
|
||||
|
||||
@@ -34,7 +34,7 @@ public class IStore_1 extends Instruction implements LVTInstruction
|
||||
Variables variables = frame.getVariables();
|
||||
|
||||
StackContext value = stack.pop();
|
||||
assert value.getType().equals(new Type(int.class.getName()));
|
||||
assert value.getType().isInt();
|
||||
ins.pop(value);
|
||||
|
||||
variables.set(1, new VariableContext(ins, value));
|
||||
|
||||
@@ -34,7 +34,7 @@ public class IStore_2 extends Instruction implements LVTInstruction
|
||||
Variables variables = frame.getVariables();
|
||||
|
||||
StackContext value = stack.pop();
|
||||
assert value.getType().equals(new Type(int.class.getName()));
|
||||
assert value.getType().isInt();
|
||||
ins.pop(value);
|
||||
|
||||
variables.set(2, new VariableContext(ins, value));
|
||||
|
||||
@@ -29,7 +29,7 @@ public class IStore_3 extends Instruction implements LVTInstruction
|
||||
Variables variables = frame.getVariables();
|
||||
|
||||
StackContext value = stack.pop();
|
||||
assert value.getType().equals(new Type(int.class.getName()));
|
||||
assert value.getType().isInt();
|
||||
ins.pop(value);
|
||||
|
||||
variables.set(3, new VariableContext(ins, value));
|
||||
|
||||
@@ -92,7 +92,7 @@ public class InvokeInterface extends Instruction implements InvokeInstruction
|
||||
if (!method.getNameAndType().isVoid())
|
||||
{
|
||||
StackContext ctx = new StackContext(ins,
|
||||
new Type(method.getNameAndType().getDescriptor().getReturnValue()).toStackType(),
|
||||
new Type(method.getNameAndType().getDescriptor().getReturnValue()),
|
||||
Value.NULL
|
||||
);
|
||||
stack.push(ctx);
|
||||
|
||||
@@ -77,7 +77,7 @@ public class InvokeSpecial extends Instruction implements InvokeInstruction
|
||||
if (!method.getNameAndType().isVoid())
|
||||
{
|
||||
StackContext ctx = new StackContext(ins,
|
||||
new Type(method.getNameAndType().getDescriptor().getReturnValue()).toStackType(),
|
||||
new Type(method.getNameAndType().getDescriptor().getReturnValue()),
|
||||
Value.NULL
|
||||
);
|
||||
stack.push(ctx);
|
||||
|
||||
@@ -87,7 +87,7 @@ public class InvokeStatic extends Instruction implements InvokeInstruction
|
||||
if (!method.getNameAndType().isVoid())
|
||||
{
|
||||
StackContext ctx = new StackContext(ins,
|
||||
new Type(method.getNameAndType().getDescriptor().getReturnValue()).toStackType(),
|
||||
new Type(method.getNameAndType().getDescriptor().getReturnValue()),
|
||||
Value.NULL
|
||||
);
|
||||
stack.push(ctx);
|
||||
|
||||
@@ -79,7 +79,7 @@ public class InvokeVirtual extends Instruction implements InvokeInstruction
|
||||
if (!method.getNameAndType().isVoid())
|
||||
{
|
||||
StackContext ctx = new StackContext(ins,
|
||||
new Type(method.getNameAndType().getDescriptor().getReturnValue()).toStackType(),
|
||||
new Type(method.getNameAndType().getDescriptor().getReturnValue()),
|
||||
Value.NULL
|
||||
);
|
||||
stack.push(ctx);
|
||||
|
||||
@@ -64,7 +64,7 @@ public class Frame
|
||||
NameAndType nat = method.getNameAndType();
|
||||
for (int i = 0; i < nat.getNumberOfArgs(); ++i)
|
||||
{
|
||||
variables.set(pos, new VariableContext(new Type(nat.getDescriptor().getTypeOfArg(i)).toStackType()).markParameter());
|
||||
variables.set(pos, new VariableContext(new Type(nat.getDescriptor().getTypeOfArg(i))).markParameter());
|
||||
pos += nat.getDescriptor().getTypeOfArg(i).getSlots();
|
||||
}
|
||||
|
||||
|
||||
@@ -17,8 +17,8 @@ public class Type
|
||||
for (int i = 0; i < t.getArrayDims(); ++i)
|
||||
type = type + "[]";
|
||||
}
|
||||
|
||||
public Type toStackType()
|
||||
|
||||
private Type toStackType()
|
||||
{
|
||||
if (type.equals(byte.class.getCanonicalName()) || type.equals(char.class.getCanonicalName()) || type.equals(short.class.getCanonicalName())
|
||||
|| type.equals(boolean.class.getCanonicalName()))
|
||||
@@ -26,6 +26,11 @@ public class Type
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean isInt()
|
||||
{
|
||||
return toStackType().equals(new Type(int.class.getName()));
|
||||
}
|
||||
|
||||
private static String asmTypeToClass(String type)
|
||||
{
|
||||
switch (type)
|
||||
|
||||
@@ -2,28 +2,30 @@ package net.runelite.deob.execution;
|
||||
|
||||
import java.io.File;
|
||||
import net.runelite.deob.ClassGroup;
|
||||
import net.runelite.deob.deobfuscators.rename.MapStaticTest;
|
||||
import net.runelite.deob.util.JarUtil;
|
||||
import org.junit.Test;
|
||||
|
||||
public class ExecutionTest
|
||||
{
|
||||
private static final String JAR1 = MapStaticTest.class.getResource("/adamin1.jar").getFile(),
|
||||
JAR2 = MapStaticTest.class.getResource("/adamin2.jar").getFile();
|
||||
|
||||
@Test
|
||||
public void test() throws Exception
|
||||
{
|
||||
ClassGroup group = JarUtil.loadJar(new File("d:/rs/07/adamin1.jar"));
|
||||
|
||||
System.out.println("Done loading jar " + System.currentTimeMillis() / 1000);
|
||||
|
||||
Execution e = new Execution(group);
|
||||
//e.setBuildGraph(true);
|
||||
//e.setFollowInvokes(false);
|
||||
ClassGroup group1 = JarUtil.loadJar(new File(JAR1));
|
||||
Execution e = new Execution(group1);
|
||||
e.populateInitialMethods();
|
||||
e.run();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test2() throws Exception
|
||||
{
|
||||
ClassGroup group2 = JarUtil.loadJar(new File(JAR2));
|
||||
Execution e = new Execution(group2);
|
||||
e.populateInitialMethods();
|
||||
e.run();
|
||||
|
||||
System.out.println("Done exec " + System.currentTimeMillis() / 1000);
|
||||
|
||||
Runtime runtime = Runtime.getRuntime();
|
||||
|
||||
System.out.println("Total memory (MB) " + runtime.totalMemory()/1024L/1024L);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user