Search in sources :

Example 21 with Stmt

use of com.googlecode.dex2jar.ir.stmt.Stmt in project dex2jar by pxb1988.

the class UnSSATransformerTransformerTest method test07PhiInHandler.

@Test
public void test07PhiInHandler() {
    initMethod(true, "I");
    Local a1 = addLocal("a1");
    Local a2 = addLocal("a2");
    Local a = addLocal("a");
    Local ex = addLocal("ex");
    addStmt(Stmts.nAssign(a1, nInt(1)));
    LabelStmt L0 = newLabel();
    LabelStmt L2 = newLabel();
    LabelStmt L3 = newLabel();
    addStmt(L0);
    addStmt(Stmts.nVoidInvoke(Exprs.nInvokeStatic(new Value[0], "La;", "m", new String[0], "V")));
    addStmt(Stmts.nAssign(a2, nInt(2)));
    addStmt(Stmts.nVoidInvoke(Exprs.nInvokeStatic(new Value[0], "La;", "m", new String[0], "V")));
    addStmt(L2);
    addStmt(Stmts.nReturn(a2));
    addStmt(L3);
    Stmt ref = addStmt(Stmts.nIdentity(ex, Exprs.nExceptionRef("Ljava/lang/Exception;")));
    attachPhi(L3, Stmts.nAssign(a, nPhi(a1, a2)));
    addStmt(Stmts.nVoidInvoke(Exprs.nInvokeStatic(new Value[] { a1 }, "La;", "m", new String[] { "I" }, "V")));
    addStmt(Stmts.nReturn(a));
    method.traps.add(new Trap(L0, L2, new LabelStmt[] { L3 }, new String[] { "Ljava/lang/Exception" }));
    transform();
    Assert.assertTrue("the fix assign should insert after x=@ExceptionRef", L3.getNext() == ref);
}
Also used : LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) Local(com.googlecode.dex2jar.ir.expr.Local) Trap(com.googlecode.dex2jar.ir.Trap) LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) Stmt(com.googlecode.dex2jar.ir.stmt.Stmt) Test(org.junit.Test)

Example 22 with Stmt

use of com.googlecode.dex2jar.ir.stmt.Stmt in project dex2jar by pxb1988.

the class ExceptionHandlerTrim method transform.

@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void transform(IrMethod irMethod) {
    List<Trap> trips = irMethod.traps;
    irMethod.traps = new ArrayList();
    LabelAndLocalMapper map = new LabelAndLocalMapper() {

        @Override
        public LabelStmt map(LabelStmt label) {
            return label;
        }
    };
    for (Trap trap : trips) {
        Trap ntrap = trap.clone(map);
        int status = 0;
        for (Stmt p = trap.start.getNext(); p != trap.end; p = p.getNext()) {
            if (!Cfg.notThrow(p)) {
                if (status == 0) {
                    Stmt pre = p.getPre();
                    if (pre == null || pre.st != ST.LABEL) {
                        pre = Stmts.nLabel();
                        irMethod.stmts.insertBefore(p, pre);
                    }
                    ntrap.start = (LabelStmt) pre;
                    status = 1;
                } else if (status == 1) {
                // continue;
                }
            } else if (status == 1) {
                Stmt pre = p.getPre();
                if (pre == null || pre.st != ST.LABEL) {
                    pre = Stmts.nLabel();
                    irMethod.stmts.insertBefore(p, pre);
                }
                ntrap.end = (LabelStmt) pre;
                irMethod.traps.add(ntrap);
                status = 0;
                ntrap = trap.clone(map);
            }
        }
        if (status == 1) {
            ntrap.end = trap.end;
            irMethod.traps.add(ntrap);
            status = 0;
        }
    }
}
Also used : LabelAndLocalMapper(com.googlecode.dex2jar.ir.LabelAndLocalMapper) LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) ArrayList(java.util.ArrayList) Trap(com.googlecode.dex2jar.ir.Trap) LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) Stmt(com.googlecode.dex2jar.ir.stmt.Stmt)

Example 23 with Stmt

use of com.googlecode.dex2jar.ir.stmt.Stmt in project dex2jar by pxb1988.

the class JimpleTransformer method transform.

@Override
public void transform(IrMethod method) {
    List<Stmt> tmp = new ArrayList<>();
    N n = new N(tmp, method.locals);
    for (Stmt p = method.stmts.getFirst(); p != null; p = p.getNext()) {
        tmp.clear();
        convertStmt(p, n);
        for (Stmt t : tmp) {
            method.stmts.insertBefore(p, t);
        }
    }
}
Also used : ArrayList(java.util.ArrayList) Stmt(com.googlecode.dex2jar.ir.stmt.Stmt)

Example 24 with Stmt

use of com.googlecode.dex2jar.ir.stmt.Stmt in project dex2jar by pxb1988.

the class NewTransformer method makeSureUsedBeforeConstructor.

void makeSureUsedBeforeConstructor(IrMethod method, final Map<Local, TObject> init, final int size) {
    Cfg.createCFG(method);
    Cfg.dfs(method.stmts, new Cfg.FrameVisitor<Vx[]>() {

        boolean keepFrame = false;

        Vx[] tmp = new Vx[size];

        StmtTraveler stmtTraveler = new StmtTraveler() {

            Stmt current;

            @Override
            public Stmt travel(Stmt stmt) {
                this.current = stmt;
                if (stmt.et == ET.E2) {
                    if (stmt.getOp1().vt == LOCAL) {
                        Local op1 = (Local) stmt.getOp1();
                        if (stmt.getOp2().vt == LOCAL) {
                            Local op2 = (Local) stmt.getOp2();
                            tmp[op1._ls_index] = tmp[op2._ls_index];
                            return stmt;
                        } else if (stmt.getOp2().vt == NEW) {
                            tmp[op1._ls_index] = new Vx(init.get(op1), false);
                            return stmt;
                        } else {
                            travel(stmt.getOp2());
                            tmp[op1._ls_index] = IGNORED;
                            return stmt;
                        }
                    }
                }
                if (stmt.st == LABEL) {
                    LabelStmt labelStmt = (LabelStmt) stmt;
                    if (labelStmt.phis != null) {
                        for (AssignStmt phi : labelStmt.phis) {
                            Local local = (Local) phi.getOp1();
                            tmp[local._ls_index] = IGNORED;
                        }
                    }
                    return stmt;
                }
                return super.travel(stmt);
            }

            @Override
            public Value travel(Value op) {
                if (op.vt == INVOKE_SPECIAL) {
                    if (op.getOps().length >= 1) {
                        InvokeExpr ie = (InvokeExpr) op;
                        if ("<init>".equals(ie.name)) {
                            Value thiz = op.getOps()[0];
                            if (thiz.vt == LOCAL) {
                                Local local = (Local) thiz;
                                Vx vx = tmp[local._ls_index];
                                TObject object = vx.obj;
                                if (object != null) {
                                    if (object.invokeStmt != null) {
                                        object.useBeforeInit = true;
                                    } else {
                                        vx.init = true;
                                        object.invokeStmt = current;
                                        for (int i = 0; i < tmp.length; i++) {
                                            Vx s = tmp[i];
                                            if (s != null && s.obj == object) {
                                                tmp[i] = IGNORED;
                                            }
                                        }
                                        keepFrame = true;
                                    }
                                }
                            }
                        }
                    }
                }
                op = super.travel(op);
                if (op.vt == LOCAL) {
                    use((Local) op);
                }
                return op;
            }
        };

        @Override
        public Vx[] merge(Vx[] srcFrame, Vx[] distFrame, Stmt src, Stmt dist) {
            if (distFrame == null) {
                distFrame = new Vx[size];
                System.arraycopy(srcFrame, 0, distFrame, 0, size);
            } else {
                for (int i = 0; i < size; i++) {
                    Vx s = srcFrame[i];
                    Vx d = distFrame[i];
                    if (s != null) {
                        if (d == null) {
                            distFrame[i] = s;
                        } else {
                            if (s != d) {
                                TObject obj = s.obj;
                                if (obj != null) {
                                    obj.useBeforeInit = true;
                                }
                                obj = d.obj;
                                if (obj != null) {
                                    obj.useBeforeInit = true;
                                }
                            }
                        }
                    }
                }
            }
            if (dist.st == LABEL) {
                List<AssignStmt> phis = ((LabelStmt) dist).phis;
                if (phis != null && phis.size() > 0) {
                    for (AssignStmt phi : phis) {
                        for (Value value : phi.getOp2().getOps()) {
                            Local local = (Local) value;
                            int i = local._ls_index;
                            Vx s = srcFrame[i];
                            Vx d = distFrame[i];
                            if (d != null) {
                                if (!d.init) {
                                    TObject obj = d.obj;
                                    if (obj != null) {
                                        obj.useBeforeInit = true;
                                    }
                                }
                            } else if (s != null) {
                                if (!s.init) {
                                    TObject obj = s.obj;
                                    if (obj != null) {
                                        obj.useBeforeInit = true;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return distFrame;
        }

        @Override
        public Vx[] initFirstFrame(Stmt first) {
            return new Vx[size];
        }

        @Override
        public Vx[] exec(Vx[] frame, Stmt stmt) {
            keepFrame = false;
            System.arraycopy(frame, 0, tmp, 0, size);
            stmtTraveler.travel(stmt);
            if (stmt._cfg_froms.size() > 1) {
                keepFrame = true;
            }
            if (!keepFrame) {
                stmt.frame = null;
            }
            return tmp;
        }

        void use(Local local) {
            Vx vx = tmp[local._ls_index];
            if (!vx.init) {
                TObject object = vx.obj;
                if (object != null) {
                    object.useBeforeInit = true;
                }
                tmp[local._ls_index] = IGNORED;
            }
        }
    });
    for (Iterator<Map.Entry<Local, TObject>> iterator = init.entrySet().iterator(); iterator.hasNext(); ) {
        Map.Entry<Local, TObject> e = iterator.next();
        boolean keep = true;
        TObject obj = e.getValue();
        if (obj.useBeforeInit) {
            keep = false;
        }
        if (obj.invokeStmt == null) {
            keep = false;
        }
        if (!keep) {
            iterator.remove();
        }
    }
}
Also used : LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) AssignStmt(com.googlecode.dex2jar.ir.stmt.AssignStmt) LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) AssignStmt(com.googlecode.dex2jar.ir.stmt.AssignStmt) Stmt(com.googlecode.dex2jar.ir.stmt.Stmt) StmtTraveler(com.googlecode.dex2jar.ir.StmtTraveler)

Example 25 with Stmt

use of com.googlecode.dex2jar.ir.stmt.Stmt in project dex2jar by pxb1988.

the class NewTransformer method replaceAST.

void replaceAST(IrMethod method) {
    for (Iterator<Stmt> it = method.stmts.iterator(); it.hasNext(); ) {
        Stmt p = it.next();
        InvokeExpr ie = findInvokeExpr(p, null);
        if (ie != null) {
            if ("<init>".equals(ie.name) && "V".equals(ie.ret)) {
                Value[] orgOps = ie.getOps();
                if (orgOps[0].vt == NEW) {
                    NewExpr newExpr = (NewExpr) ie.getOps()[0];
                    if (newExpr != null) {
                        Value[] nOps = new Value[orgOps.length - 1];
                        System.arraycopy(orgOps, 1, nOps, 0, nOps.length);
                        InvokeExpr invokeNew = Exprs.nInvokeNew(nOps, ie.args, ie.owner);
                        method.stmts.insertBefore(p, Stmts.nVoidInvoke(invokeNew));
                        it.remove();
                    }
                }
            }
        }
    }
}
Also used : LabelStmt(com.googlecode.dex2jar.ir.stmt.LabelStmt) AssignStmt(com.googlecode.dex2jar.ir.stmt.AssignStmt) Stmt(com.googlecode.dex2jar.ir.stmt.Stmt)

Aggregations

Stmt (com.googlecode.dex2jar.ir.stmt.Stmt)41 LabelStmt (com.googlecode.dex2jar.ir.stmt.LabelStmt)31 Local (com.googlecode.dex2jar.ir.expr.Local)23 AssignStmt (com.googlecode.dex2jar.ir.stmt.AssignStmt)22 Test (org.junit.Test)10 Value (com.googlecode.dex2jar.ir.expr.Value)8 ArrayList (java.util.ArrayList)7 JumpStmt (com.googlecode.dex2jar.ir.stmt.JumpStmt)4 Cfg (com.googlecode.dex2jar.ir.ts.Cfg)4 Trap (com.googlecode.dex2jar.ir.Trap)3 StmtList (com.googlecode.dex2jar.ir.stmt.StmtList)3 List (java.util.List)3 StmtTraveler (com.googlecode.dex2jar.ir.StmtTraveler)2 Constant (com.googlecode.dex2jar.ir.expr.Constant)2 PhiExpr (com.googlecode.dex2jar.ir.expr.PhiExpr)2 E2Stmt (com.googlecode.dex2jar.ir.stmt.Stmt.E2Stmt)2 HashSet (java.util.HashSet)2 IR2JConverter (com.googlecode.d2j.converter.IR2JConverter)1 DexFileNode (com.googlecode.d2j.node.DexFileNode)1 DexMethodNode (com.googlecode.d2j.node.DexMethodNode)1