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());
}
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);
}
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);
}
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);
}
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);
}
Aggregations