Search in sources :

Example 76 with Local

use of com.googlecode.dex2jar.ir.expr.Local in project dex2jar by pxb1988.

the class SSATransformerTest method test08.

/**
     * test for
     * 
     * <pre>
     * if (xxx) {
     *     a = 1;
     * } else {
     *     a = 2;
     * }// phi here
     * 
     * if (xxx) {
     *     if (xxx) {
     *         a = 3;
     *     }// phi here
     *     return a;
     * } else {
     *     if (xxx) {
     *         a = 4;
     *     } // phi here
     *     return a;
     * }
     * </pre>
     */
@Test
public void test08() {
    Local a = addLocal("a");
    LabelStmt L0 = newLabel();
    LabelStmt L1 = newLabel();
    LabelStmt L2 = newLabel();
    LabelStmt L3 = newLabel();
    LabelStmt L4 = newLabel();
    LabelStmt L5 = newLabel();
    {
        // if-else
        addStmt(Stmts.nIf(Exprs.niEq(nInt(0), nInt(9)), L0));
        {
            addStmt(nAssign(a, nString("1")));
        }
        addStmt(Stmts.nGoto(L1));
        addStmt(L0);
        {
            addStmt(nAssign(a, nString("2")));
        }
        // expect a phi here
        addStmt(L1);
    }
    {
        // if-else
        addStmt(Stmts.nIf(Exprs.niEq(nInt(0), nInt(9)), L2));
        {
            {
                // if
                addStmt(Stmts.nIf(Exprs.niEq(nInt(0), nInt(9)), L4));
                addStmt(nAssign(a, nString("3")));
                addStmt(L4);
            }
            addStmt(nReturn(a));
        }
        addStmt(Stmts.nGoto(L3));
        addStmt(L2);
        {
            {
                // if
                addStmt(Stmts.nIf(Exprs.niEq(nInt(0), nInt(9)), L5));
                addStmt(nAssign(a, nString("4")));
                addStmt(L5);
            }
            addStmt(nReturn(a));
        }
        addStmt(L3);
    }
    transform();
    assertPhiStmt(L1);
    assertPhiStmt(L4);
    assertPhiStmt(L5);
    // 4 assign + 3 phi
    Assert.assertEquals(7, method.locals.size());
}
Also used : Local(com.googlecode.dex2jar.ir.expr.Local) Test(org.junit.Test)

Example 77 with Local

use of com.googlecode.dex2jar.ir.expr.Local in project dex2jar by pxb1988.

the class SSATransformerTest method test06PhiInTrap.

@Test
public void test06PhiInTrap() {
    String exType = "Ljava/lang/Exception;";
    LabelStmt L1 = newLabel();
    LabelStmt L2 = newLabel();
    LabelStmt L3 = newLabel();
    LabelStmt L4 = newLabel();
    method.traps.add(new Trap(L1, L2, new LabelStmt[] { L3 }, new String[] { exType }));
    Local b = addLocal("a");
    Local ex = addLocal("ex");
    addStmt(L1);
    addStmt(nAssign(b, nString("123")));
    addStmt(Stmts.nLock(b));
    addStmt(L2);
    addStmt(nGoto(L4));
    addStmt(L3);
    addStmt(nIdentity(ex, nExceptionRef(exType)));
    addStmt(nAssign(b, nNull()));
    addStmt(L4);
    addStmt(nReturn(b));
    transform();
    // phi inserted
    Assert.assertEquals(4, method.locals.size());
    assertPhiStmt(L4);
}
Also used : Local(com.googlecode.dex2jar.ir.expr.Local) Trap(com.googlecode.dex2jar.ir.Trap) Test(org.junit.Test)

Example 78 with Local

use of com.googlecode.dex2jar.ir.expr.Local in project dex2jar by pxb1988.

the class SSATransformerTest method test00Base.

/**
     * base test
     */
@Test
public void test00Base() {
    Local b = addLocal("b");
    AssignStmt st1 = addStmt(nAssign(b, nString("123")));
    AssignStmt st2 = addStmt(nAssign(b, nNull()));
    UnopStmt st3 = addStmt(nReturn(b));
    transform();
    Assert.assertSame(st2.op1, st3.op);
    Assert.assertNotSame("st1 and st1 must be cut", st1.op1, st2.op1);
    Assert.assertTrue(method.locals.size() == 2);
}
Also used : Local(com.googlecode.dex2jar.ir.expr.Local) Test(org.junit.Test)

Example 79 with Local

use of com.googlecode.dex2jar.ir.expr.Local in project dex2jar by pxb1988.

the class SSATransformerTest method test07MergeAtFirst.

@Test
public void test07MergeAtFirst() {
    LabelStmt L0 = newLabel();
    LabelStmt L1 = newLabel();
    LabelStmt L2 = newLabel();
    LabelStmt L3 = newLabel();
    Local b = addLocal("b");
    Local c = addLocal("c");
    addStmt(Stmts.nIf(Exprs.niEq(nInt(1), nInt(2)), L0));
    addStmt(nAssign(b, nInt(3)));
    addStmt(nGoto(L1));
    addStmt(L0);
    addStmt(nAssign(b, nInt(4)));
    addStmt(L1);
    addStmt(Stmts.nIf(Exprs.niEq(nInt(1), nInt(2)), L2));
    addStmt(Stmts.nReturnVoid());
    addStmt(L2);
    addStmt(Stmts.nIf(Exprs.niEq(nInt(1), nInt(2)), L3));
    addStmt(Stmts.nAssign(c, Exprs.nInvokeStatic(new Value[] { b }, "Ljava/lang/String;", "someMethod", new String[] { "I" }, "V")));
    addStmt(Stmts.nReturnVoid());
    addStmt(L3);
    addStmt(Stmts.nReturnVoid());
    transform();
    Assert.assertEquals(4, method.locals.size());
    assertPhiStmt(L1);
}
Also used : Local(com.googlecode.dex2jar.ir.expr.Local) Test(org.junit.Test)

Example 80 with Local

use of com.googlecode.dex2jar.ir.expr.Local in project dex2jar by pxb1988.

the class SSATransformerTest method test05PhiInGoto.

/**
     * test for Phi insert
     */
@Test
public void test05PhiInGoto() {
    Local b = addLocal("a");
    LabelStmt L1 = newLabel();
    LabelStmt L2 = newLabel();
    addStmt(nIf(niGt(nInt(100), nInt(0)), L1));
    addStmt(nAssign(b, nString("123")));
    addStmt(nGoto(L2));
    addStmt(L1);
    addStmt(nAssign(b, nNull()));
    addStmt(L2);
    addStmt(nReturn(b));
    transform();
    // phi inserted
    Assert.assertEquals(3, method.locals.size());
    assertPhiStmt(L2);
}
Also used : Local(com.googlecode.dex2jar.ir.expr.Local) Test(org.junit.Test)

Aggregations

Local (com.googlecode.dex2jar.ir.expr.Local)86 Test (org.junit.Test)44 LabelStmt (com.googlecode.dex2jar.ir.stmt.LabelStmt)28 Stmt (com.googlecode.dex2jar.ir.stmt.Stmt)23 Value (com.googlecode.dex2jar.ir.expr.Value)19 AssignStmt (com.googlecode.dex2jar.ir.stmt.AssignStmt)15 ArrayList (java.util.ArrayList)8 IrMethod (com.googlecode.dex2jar.ir.IrMethod)6 Exprs.nLocal (com.googlecode.dex2jar.ir.expr.Exprs.nLocal)6 UnopStmt (com.googlecode.dex2jar.ir.stmt.UnopStmt)6 JumpStmt (com.googlecode.dex2jar.ir.stmt.JumpStmt)5 ConstTransformer (com.googlecode.dex2jar.ir.ts.ConstTransformer)5 Exprs.nString (com.googlecode.dex2jar.ir.expr.Exprs.nString)4 StmtList (com.googlecode.dex2jar.ir.stmt.StmtList)4 Trap (com.googlecode.dex2jar.ir.Trap)3 Exprs.nArrayValue (com.googlecode.dex2jar.ir.expr.Exprs.nArrayValue)3 AnalyzeValue (com.googlecode.dex2jar.ir.ts.an.AnalyzeValue)3 List (java.util.List)3 DexLabel (com.googlecode.d2j.DexLabel)2 Op (com.googlecode.d2j.reader.Op)2