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