Search in sources :

Example 26 with VReturn

use of net.runelite.asm.attributes.code.instructions.VReturn in project runelite by runelite.

the class ExprArgOrderTest method test6.

@Test
public void test6() {
    ClassGroup group = ClassGroupFactory.generateGroup();
    Code code = group.findClass("test").findMethod("func").getCode();
    Instructions ins = code.getInstructions();
    code.setMaxStack(2);
    // vars[0] = 3
    Instruction[] prepareVariables = { new LDC(ins, 3), new IStore(ins, 0) };
    for (Instruction i : prepareVariables) {
        ins.addInstruction(i);
    }
    Label label = new Label(ins);
    /*
		iconst_0
		ldc                   8388608
		iload_3
		iadd
		ldc                   -16777216
		iand
		if_icmpeq             LABEL0x49
		 */
    Instruction[] body = { new LDC(ins, 0), new LDC(ins, 8388608), new ILoad(ins, 0), new IAdd(ins), new LDC(ins, -16777216), new IAnd(ins), // 8
    new IfICmpEq(ins, label), label, new VReturn(ins) };
    for (Instruction i : body) {
        ins.addInstruction(i);
    }
    ExprArgOrder exprArgOrder = new ExprArgOrder();
    exprArgOrder.run(group);
    List<Instruction> instructions = ins.getInstructions();
    assertEquals(ILOAD, instructions.get(2).getType());
    assertEquals(LDC, instructions.get(3).getType());
    assertEquals(IADD, instructions.get(4).getType());
    assertEquals(LDC, instructions.get(5).getType());
    assertEquals(IAND, instructions.get(6).getType());
    assertEquals(LDC, instructions.get(7).getType());
    assertEquals(IF_ICMPEQ, instructions.get(8).getType());
}
Also used : IfICmpEq(net.runelite.asm.attributes.code.instructions.IfICmpEq) IStore(net.runelite.asm.attributes.code.instructions.IStore) ILoad(net.runelite.asm.attributes.code.instructions.ILoad) Label(net.runelite.asm.attributes.code.Label) Instructions(net.runelite.asm.attributes.code.Instructions) LDC(net.runelite.asm.attributes.code.InstructionType.LDC) LDC(net.runelite.asm.attributes.code.instructions.LDC) Instruction(net.runelite.asm.attributes.code.Instruction) IAnd(net.runelite.asm.attributes.code.instructions.IAnd) Code(net.runelite.asm.attributes.Code) VReturn(net.runelite.asm.attributes.code.instructions.VReturn) ClassGroup(net.runelite.asm.ClassGroup) IAdd(net.runelite.asm.attributes.code.instructions.IAdd) Test(org.junit.Test)

Example 27 with VReturn

use of net.runelite.asm.attributes.code.instructions.VReturn in project runelite by runelite.

the class ExprArgOrderTest method test.

@Test
public void test() {
    ClassGroup group = ClassGroupFactory.generateGroup();
    Code code = group.findClass("test").findMethod("func").getCode();
    Instructions ins = code.getInstructions();
    code.setMaxStack(2);
    // vars[0] = 3
    Instruction[] prepareVariables = { new LDC(ins, 3), new IStore(ins, 0) };
    for (Instruction i : prepareVariables) {
        ins.addInstruction(i);
    }
    Instruction[] body = { // 2
    new LDC(ins, 3), new ILoad(ins, 0), new IAdd(ins), new Pop(ins), new VReturn(ins) };
    for (Instruction i : body) {
        ins.addInstruction(i);
    }
    ExprArgOrder exprArgOrder = new ExprArgOrder();
    exprArgOrder.run(group);
    List<Instruction> instructions = ins.getInstructions();
    assertEquals(ILOAD, instructions.get(2).getType());
    assertEquals(LDC, instructions.get(3).getType());
    assertEquals(IADD, instructions.get(4).getType());
}
Also used : IStore(net.runelite.asm.attributes.code.instructions.IStore) ILoad(net.runelite.asm.attributes.code.instructions.ILoad) Instructions(net.runelite.asm.attributes.code.Instructions) LDC(net.runelite.asm.attributes.code.InstructionType.LDC) LDC(net.runelite.asm.attributes.code.instructions.LDC) Instruction(net.runelite.asm.attributes.code.Instruction) Code(net.runelite.asm.attributes.Code) VReturn(net.runelite.asm.attributes.code.instructions.VReturn) Pop(net.runelite.asm.attributes.code.instructions.Pop) ClassGroup(net.runelite.asm.ClassGroup) IAdd(net.runelite.asm.attributes.code.instructions.IAdd) Test(org.junit.Test)

Example 28 with VReturn

use of net.runelite.asm.attributes.code.instructions.VReturn in project runelite by runelite.

the class LvtTest method testReuseIndex.

@Test
public void testReuseIndex() {
    ClassGroup group = ClassGroupFactory.generateGroup();
    Code code = group.findClass("test").findMethod("func").getCode();
    Instructions ins = code.getInstructions();
    Instruction[] body = { // var0 = null
    new AConstNull(ins), new AStore(ins, 0), // this forces a reindex to varn
    new LDC(ins, 0), new IStore(ins, 0), // var2 = null
    new AConstNull(ins), new AStore(ins, 2), // this forces a reindex to varn+1
    new LDC(ins, 0), new IStore(ins, 2), // var0 = 0L
    new LDC(ins, 0L), new LStore(ins, 0), new VReturn(ins) };
    for (Instruction i : body) {
        ins.addInstruction(i);
    }
    Lvt lvt = new Lvt();
    lvt.run(group);
    AStore astore1 = (AStore) body[1];
    IStore istore1 = (IStore) body[3];
    AStore astore2 = (AStore) body[5];
    IStore istore2 = (IStore) body[7];
    LStore lstore1 = (LStore) body[9];
    int astore1Idx = astore1.getVariableIndex();
    int istore1Idx = istore1.getVariableIndex();
    int astore2Idx = astore2.getVariableIndex();
    int istore2Idx = istore2.getVariableIndex();
    int lstore1Idx = lstore1.getVariableIndex();
    logger.debug("{} -> {}", astore1, astore1.getVariableIndex());
    logger.debug("{} -> {}", istore1, istore1.getVariableIndex());
    logger.debug("{} -> {}", astore2, astore2.getVariableIndex());
    logger.debug("{} -> {}", istore2, istore2.getVariableIndex());
    logger.debug("{} -> {}", lstore1, lstore1.getVariableIndex());
    Assert.assertNotEquals(astore1Idx, istore1Idx);
    Assert.assertNotEquals(astore2Idx, istore2Idx);
    // assert that the lstore doesn't overwrite an existing index
    Assert.assertNotEquals(lstore1Idx + 1, astore1Idx);
    Assert.assertNotEquals(lstore1Idx + 1, istore1Idx);
    Assert.assertNotEquals(lstore1Idx + 1, astore2Idx);
    Assert.assertNotEquals(lstore1Idx + 1, istore2Idx);
}
Also used : IStore(net.runelite.asm.attributes.code.instructions.IStore) Instructions(net.runelite.asm.attributes.code.Instructions) AConstNull(net.runelite.asm.attributes.code.instructions.AConstNull) LDC(net.runelite.asm.attributes.code.instructions.LDC) Instruction(net.runelite.asm.attributes.code.Instruction) Code(net.runelite.asm.attributes.Code) LStore(net.runelite.asm.attributes.code.instructions.LStore) VReturn(net.runelite.asm.attributes.code.instructions.VReturn) AStore(net.runelite.asm.attributes.code.instructions.AStore) ClassGroup(net.runelite.asm.ClassGroup) Test(org.junit.Test)

Example 29 with VReturn

use of net.runelite.asm.attributes.code.instructions.VReturn in project runelite by runelite.

the class HandlerFinder method insertReturn.

private void insertReturn(Instructions ins, Instruction start, Instruction end) {
    assert end instanceof Label;
    int idx = ins.getInstructions().indexOf(end);
    assert idx != -1;
    Instruction before = ins.getInstructions().get(idx - 1);
    if (// XXX check isTerminal?
    before.getType() == InstructionType.RETURN) {
        return;
    }
    // insert return before end
    logger.info("Inserting return before {}", end);
    Instruction ret = new VReturn(ins);
    ins.addInstruction(idx, ret);
    Label label = ins.createLabelFor(ret);
    // Change jumps which go to the next handler to instead go to return
    for (Instruction i : ins.getInstructions()) {
        if (i instanceof JumpingInstruction) {
            JumpingInstruction j = (JumpingInstruction) i;
            if (i == start) {
                continue;
            }
            if (j.getJumps().size() == 1 && j.getJumps().get(0) == end) {
                j.setJumps(Collections.singletonList(label));
            }
        }
    }
}
Also used : JumpingInstruction(net.runelite.asm.attributes.code.instruction.types.JumpingInstruction) Label(net.runelite.asm.attributes.code.Label) PushConstantInstruction(net.runelite.asm.attributes.code.instruction.types.PushConstantInstruction) JumpingInstruction(net.runelite.asm.attributes.code.instruction.types.JumpingInstruction) Instruction(net.runelite.asm.attributes.code.Instruction) VReturn(net.runelite.asm.attributes.code.instructions.VReturn)

Example 30 with VReturn

use of net.runelite.asm.attributes.code.instructions.VReturn in project runelite by runelite.

the class ClassGroupFactory method generateGroup.

public static ClassGroup generateGroup() {
    ClassGroup group = new ClassGroup();
    ClassFile cf = new ClassFile(group);
    cf.setName("test");
    cf.setSuperName("java/lang/Object");
    group.addClass(cf);
    Field field = new Field(cf, "field", Type.INT);
    field.setStatic();
    cf.addField(field);
    Method method = new Method(cf, "func", new Signature("()V"));
    method.setStatic();
    cf.addMethod(method);
    Code code = new Code(method);
    method.setCode(code);
    {
        method = new Method(cf, "func2", new Signature("(III)V"));
        method.setStatic();
        cf.addMethod(method);
        code = new Code(method);
        method.setCode(code);
        Instructions ins = code.getInstructions();
        ins.addInstruction(new VReturn(ins));
    }
    addVoidMethod(cf, "void1");
    addVoidMethod(cf, "void2");
    addVoidMethod(cf, "void3");
    addVoidMethod(cf, "void4");
    return group;
}
Also used : Field(net.runelite.asm.Field) ClassFile(net.runelite.asm.ClassFile) ClassGroup(net.runelite.asm.ClassGroup) Signature(net.runelite.asm.signature.Signature) Instructions(net.runelite.asm.attributes.code.Instructions) Method(net.runelite.asm.Method) Code(net.runelite.asm.attributes.Code) VReturn(net.runelite.asm.attributes.code.instructions.VReturn)

Aggregations

VReturn (net.runelite.asm.attributes.code.instructions.VReturn)31 Code (net.runelite.asm.attributes.Code)30 Instructions (net.runelite.asm.attributes.code.Instructions)30 Instruction (net.runelite.asm.attributes.code.Instruction)28 ClassGroup (net.runelite.asm.ClassGroup)26 LDC (net.runelite.asm.attributes.code.instructions.LDC)26 Test (org.junit.Test)25 IStore (net.runelite.asm.attributes.code.instructions.IStore)23 ILoad (net.runelite.asm.attributes.code.instructions.ILoad)21 IMul (net.runelite.asm.attributes.code.instructions.IMul)19 Execution (net.runelite.asm.execution.Execution)18 Deobfuscator (net.runelite.deob.Deobfuscator)18 Pop (net.runelite.asm.attributes.code.instructions.Pop)11 IAdd (net.runelite.asm.attributes.code.instructions.IAdd)10 Label (net.runelite.asm.attributes.code.Label)9 LDC (net.runelite.asm.attributes.code.InstructionType.LDC)6 Dup_X1 (net.runelite.asm.attributes.code.instructions.Dup_X1)6 AConstNull (net.runelite.asm.attributes.code.instructions.AConstNull)5 IfEq (net.runelite.asm.attributes.code.instructions.IfEq)5 SiPush (net.runelite.asm.attributes.code.instructions.SiPush)5