Search in sources :

Example 86 with Stack

use of net.runelite.asm.execution.Stack in project runelite by runelite.

the class IfICmpEqTest method testIsSame.

@Test
public void testIsSame() {
    Instructions ins = mock(Instructions.class);
    Frame frame = mock(Frame.class);
    Stack stack = new Stack(42);
    Variables variables = new Variables(42);
    when(frame.getStack()).thenReturn(stack);
    when(frame.getVariables()).thenReturn(variables);
    IfICmpEq ifeq = new IfICmpEq(ins, InstructionType.IF_ICMPEQ);
    InstructionContext ifeqCtx = new InstructionContext(ifeq, frame);
    ifeqCtx.pop(new StackContext(getConstantCtx(ins, 1), INT, new Value(1)));
    ifeqCtx.pop(new StackContext(getConstantCtx(ins, 1), INT, new Value(1)));
    IfNe ifne = new IfNe(ins, InstructionType.IFNE);
    InstructionContext ifneCtx = new InstructionContext(ifne, frame);
    ifneCtx.pop(new StackContext(getConstantCtx(ins, 42), INT, new Value(42)));
    assertTrue(ifeq.isSame(ifeqCtx, ifneCtx));
}
Also used : Variables(net.runelite.asm.execution.Variables) InstructionContext(net.runelite.asm.execution.InstructionContext) Frame(net.runelite.asm.execution.Frame) StackContext(net.runelite.asm.execution.StackContext) Value(net.runelite.asm.execution.Value) Instructions(net.runelite.asm.attributes.code.Instructions) Stack(net.runelite.asm.execution.Stack) Test(org.junit.Test)

Example 87 with Stack

use of net.runelite.asm.execution.Stack in project runelite by runelite.

the class IfEqTest method testIsSame.

@Test
public void testIsSame() {
    Instructions ins = mock(Instructions.class);
    Frame originalIfEqFrame = mock(Frame.class);
    Stack stack = new Stack(42);
    Variables variables = new Variables(42);
    when(originalIfEqFrame.getStack()).thenReturn(stack);
    when(originalIfEqFrame.getVariables()).thenReturn(variables);
    variables.set(9, new VariableContext(INT));
    Instruction i = new LDC(ins, 0);
    InstructionContext ctx = new InstructionContext(i, originalIfEqFrame);
    // ifeq 0
    IfEq ifeq = new IfEq(ins, InstructionType.IFEQ);
    InstructionContext ifeqCtx = new InstructionContext(ifeq, originalIfEqFrame);
    ifeqCtx.pop(new StackContext(ctx, INT, new Value(1)));
    // 
    ins = mock(Instructions.class);
    Frame originalIfIcmpNeFrame = mock(Frame.class);
    stack = new Stack(42);
    variables = new Variables(42);
    when(originalIfIcmpNeFrame.getStack()).thenReturn(stack);
    when(originalIfIcmpNeFrame.getVariables()).thenReturn(variables);
    variables.set(5, new VariableContext(INT));
    i = new LDC(ins, 1);
    InstructionContext ctx1 = new InstructionContext(i, originalIfIcmpNeFrame);
    i = new ILoad(ins, 5);
    InstructionContext ctx2 = new InstructionContext(i, originalIfIcmpNeFrame);
    // ificmpne 1
    IfICmpNe ificmpne = new IfICmpNe(ins, InstructionType.IF_ICMPNE);
    InstructionContext ificmpneCtx = new InstructionContext(ificmpne, originalIfIcmpNeFrame);
    ificmpneCtx.pop(new StackContext(ctx1, INT, new Value(1)), new StackContext(ctx2, INT, Value.UNKNOWN));
    assertEquals(ifeq.isSame(ifeqCtx, ificmpneCtx), ificmpne.isSame(ificmpneCtx, ifeqCtx));
    // check that both frames jump the same direction
    Frame ifeqBranchFrame = mock(Frame.class);
    ifeqCtx.branch(ifeqBranchFrame);
    Frame ificmpneBranchFrame = mock(Frame.class);
    ificmpneCtx.branch(ificmpneBranchFrame);
    // initially originalIfEqFrame.other == originalIfIcmpNeFrame.other
    when(originalIfEqFrame.getOther()).thenReturn(originalIfIcmpNeFrame);
    when(originalIfIcmpNeFrame.getOther()).thenReturn(originalIfEqFrame);
    ParallelExecutorMapping mapping = mock(ParallelExecutorMapping.class);
    ifeq.map(mapping, ifeqCtx, ificmpneCtx);
    // verify that ifeqBranchFrame.other = ificmpneBranchFrame
    ArgumentCaptor<Frame> frameCapture = ArgumentCaptor.forClass(Frame.class);
    verify(ifeqBranchFrame).setOther(frameCapture.capture());
    assertEquals(ificmpneBranchFrame, frameCapture.getValue());
}
Also used : InstructionContext(net.runelite.asm.execution.InstructionContext) Frame(net.runelite.asm.execution.Frame) Instructions(net.runelite.asm.attributes.code.Instructions) VariableContext(net.runelite.asm.execution.VariableContext) Instruction(net.runelite.asm.attributes.code.Instruction) ParallelExecutorMapping(net.runelite.deob.deobfuscators.mapping.ParallelExecutorMapping) Stack(net.runelite.asm.execution.Stack) Variables(net.runelite.asm.execution.Variables) StackContext(net.runelite.asm.execution.StackContext) Value(net.runelite.asm.execution.Value) Test(org.junit.Test)

Example 88 with Stack

use of net.runelite.asm.execution.Stack in project runelite by runelite.

the class LCmpTest method testIsSame.

@Test
public void testIsSame() {
    LCmp cmp = new LCmp(mock(Instructions.class), InstructionType.LCMP);
    LCmp cmp2 = new LCmp(mock(Instructions.class), InstructionType.LCMP);
    Frame f1 = mock(Frame.class);
    when(f1.getStack()).thenReturn(new Stack(42));
    when(f1.getVariables()).thenReturn(new Variables(42));
    Frame f2 = mock(Frame.class);
    when(f2.getStack()).thenReturn(new Stack(42));
    when(f2.getVariables()).thenReturn(new Variables(42));
    InstructionContext ctx1 = new InstructionContext(cmp, f1);
    InstructionContext ctx2 = new InstructionContext(cmp2, f2);
    boolean result = cmp.isSame(ctx1, ctx2);
    Assert.assertTrue(result);
}
Also used : Variables(net.runelite.asm.execution.Variables) InstructionContext(net.runelite.asm.execution.InstructionContext) Frame(net.runelite.asm.execution.Frame) Instructions(net.runelite.asm.attributes.code.Instructions) Stack(net.runelite.asm.execution.Stack) Test(org.junit.Test)

Example 89 with Stack

use of net.runelite.asm.execution.Stack in project runelite by runelite.

the class AAStore method execute.

@Override
public InstructionContext execute(Frame frame) {
    InstructionContext ins = new InstructionContext(this, frame);
    Stack stack = frame.getStack();
    StackContext value = stack.pop();
    StackContext index = stack.pop();
    StackContext array = stack.pop();
    ins.pop(value, index, array);
    array.getValue().arraySet(index.getValue(), value.getValue());
    return ins;
}
Also used : InstructionContext(net.runelite.asm.execution.InstructionContext) StackContext(net.runelite.asm.execution.StackContext) Stack(net.runelite.asm.execution.Stack)

Example 90 with Stack

use of net.runelite.asm.execution.Stack in project runelite by runelite.

the class ArrayLength method execute.

@Override
public InstructionContext execute(Frame frame) {
    InstructionContext ins = new InstructionContext(this, frame);
    Stack stack = frame.getStack();
    StackContext array = stack.pop();
    ins.pop(array);
    StackContext ctx = new StackContext(ins, Type.INT, array.getValue().arrayLength());
    stack.push(ctx);
    ins.push(ctx);
    return ins;
}
Also used : InstructionContext(net.runelite.asm.execution.InstructionContext) StackContext(net.runelite.asm.execution.StackContext) Stack(net.runelite.asm.execution.Stack)

Aggregations

InstructionContext (net.runelite.asm.execution.InstructionContext)120 Stack (net.runelite.asm.execution.Stack)120 StackContext (net.runelite.asm.execution.StackContext)119 Value (net.runelite.asm.execution.Value)47 Variables (net.runelite.asm.execution.Variables)13 VariableContext (net.runelite.asm.execution.VariableContext)11 Frame (net.runelite.asm.execution.Frame)8 Execution (net.runelite.asm.execution.Execution)4 Instructions (net.runelite.asm.attributes.code.Instructions)3 Test (org.junit.Test)3 Type (net.runelite.asm.Type)2 InstructionType (net.runelite.asm.attributes.code.InstructionType)2 Label (net.runelite.asm.attributes.code.Label)2 Instruction (net.runelite.asm.attributes.code.Instruction)1 ParallelExecutorMapping (net.runelite.deob.deobfuscators.mapping.ParallelExecutorMapping)1