use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.
the class Dex2IrAdapter method visitStmt3R.
@Override
public void visitStmt3R(Op op, int a, int b, int c) {
Value va = locals[a];
Value vb = locals[b];
Value vc = locals[c];
switch(op) {
case APUT:
x(nAssign(nArray(vb, vc, TypeClass.IF.name), va));
break;
case APUT_BOOLEAN:
x(nAssign(nArray(vb, vc, "Z"), va));
break;
case APUT_BYTE:
x(nAssign(nArray(vb, vc, "B"), va));
break;
case APUT_CHAR:
x(nAssign(nArray(vb, vc, "C"), va));
break;
case APUT_OBJECT:
x(nAssign(nArray(vb, vc, "L"), va));
break;
case APUT_SHORT:
x(nAssign(nArray(vb, vc, "S"), va));
break;
case APUT_WIDE:
x(nAssign(nArray(vb, vc, TypeClass.JD.name), va));
break;
case AGET:
x(nAssign(va, nArray(vb, vc, TypeClass.IF.name)));
break;
case AGET_BOOLEAN:
x(nAssign(va, nArray(vb, vc, "Z")));
break;
case AGET_BYTE:
x(nAssign(va, nArray(vb, vc, "B")));
break;
case AGET_CHAR:
x(nAssign(va, nArray(vb, vc, "C")));
break;
case AGET_OBJECT:
x(nAssign(va, nArray(vb, vc, "L")));
break;
case AGET_SHORT:
x(nAssign(va, nArray(vb, vc, "S")));
break;
case AGET_WIDE:
x(nAssign(va, nArray(vb, vc, TypeClass.JD.name)));
break;
case CMP_LONG:
x(nAssign(va, nLCmp(vb, vc)));
break;
case CMPG_DOUBLE:
x(nAssign(va, nDCmpg(vb, vc)));
break;
case CMPG_FLOAT:
x(nAssign(va, nFCmpg(vb, vc)));
break;
case CMPL_DOUBLE:
x(nAssign(va, nDCmpl(vb, vc)));
break;
case CMPL_FLOAT:
x(nAssign(va, nFCmpl(vb, vc)));
break;
case ADD_DOUBLE:
x(nAssign(va, nAdd(vb, vc, "D")));
break;
case ADD_FLOAT:
x(nAssign(va, nAdd(vb, vc, "F")));
break;
case ADD_INT:
x(nAssign(va, nAdd(vb, vc, "I")));
break;
case ADD_LONG:
x(nAssign(va, nAdd(vb, vc, "J")));
break;
case SUB_DOUBLE:
x(nAssign(va, nSub(vb, vc, "D")));
break;
case SUB_FLOAT:
x(nAssign(va, nSub(vb, vc, "F")));
break;
// break;
case SUB_INT:
x(nAssign(va, nSub(vb, vc, "I")));
break;
case SUB_LONG:
x(nAssign(va, nSub(vb, vc, "J")));
break;
case MUL_DOUBLE:
x(nAssign(va, nMul(vb, vc, "D")));
break;
case MUL_FLOAT:
x(nAssign(va, nMul(vb, vc, "F")));
break;
case MUL_INT:
x(nAssign(va, nMul(vb, vc, "I")));
break;
case MUL_LONG:
x(nAssign(va, nMul(vb, vc, "J")));
break;
case DIV_DOUBLE:
x(nAssign(va, nDiv(vb, vc, "D")));
break;
case DIV_FLOAT:
x(nAssign(va, nDiv(vb, vc, "F")));
break;
case DIV_INT:
x(nAssign(va, nDiv(vb, vc, "I")));
break;
case DIV_LONG:
x(nAssign(va, nDiv(vb, vc, "J")));
break;
case REM_DOUBLE:
x(nAssign(va, nRem(vb, vc, "D")));
break;
case REM_FLOAT:
x(nAssign(va, nRem(vb, vc, "F")));
break;
case REM_INT:
x(nAssign(va, nRem(vb, vc, "I")));
break;
case REM_LONG:
x(nAssign(va, nRem(vb, vc, "J")));
break;
case AND_INT:
x(nAssign(va, nAnd(vb, vc, TypeClass.ZI.name)));
break;
case AND_LONG:
x(nAssign(va, nAnd(vb, vc, "J")));
break;
case OR_INT:
x(nAssign(va, nOr(vb, vc, TypeClass.ZI.name)));
break;
case OR_LONG:
x(nAssign(va, nOr(vb, vc, "J")));
break;
case XOR_INT:
x(nAssign(va, nXor(vb, vc, TypeClass.ZI.name)));
break;
case XOR_LONG:
x(nAssign(va, nXor(vb, vc, "J")));
break;
case SHL_INT:
x(nAssign(va, nShl(vb, vc, "I")));
break;
case SHL_LONG:
x(nAssign(va, nShl(vb, vc, "J")));
break;
case SHR_INT:
x(nAssign(va, nShr(vb, vc, "I")));
break;
case SHR_LONG:
x(nAssign(va, nShr(vb, vc, "J")));
break;
case USHR_INT:
x(nAssign(va, nUshr(vb, vc, "I")));
break;
case USHR_LONG:
x(nAssign(va, nUshr(vb, vc, "J")));
break;
default:
throw new RuntimeException();
}
}
use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.
the class Dex2IrAdapter method visitMethodStmt.
@Override
public void visitMethodStmt(Op op, int[] args, Method method) {
Value[] vs;
if (args.length > 0) {
int i = 0;
List<Local> ps = new ArrayList<Local>(args.length);
if (op == Op.INVOKE_STATIC || op == Op.INVOKE_STATIC_RANGE) {
;
} else {
ps.add(locals[args[i]]);
i++;
}
for (String t : method.getParameterTypes()) {
ps.add(locals[args[i]]);
if (t.equals("J") || t.equals("D")) {
i += 2;
} else {
i++;
}
}
vs = ps.toArray(new Value[ps.size()]);
} else {
vs = new Value[0];
}
Value invoke = null;
switch(op) {
case INVOKE_VIRTUAL_RANGE:
case INVOKE_VIRTUAL:
invoke = nInvokeVirtual(vs, method.getOwner(), method.getName(), method.getParameterTypes(), method.getReturnType());
break;
case INVOKE_SUPER_RANGE:
case INVOKE_DIRECT_RANGE:
case INVOKE_SUPER:
case INVOKE_DIRECT:
invoke = nInvokeSpecial(vs, method.getOwner(), method.getName(), method.getParameterTypes(), method.getReturnType());
break;
case INVOKE_STATIC_RANGE:
case INVOKE_STATIC:
invoke = nInvokeStatic(vs, method.getOwner(), method.getName(), method.getParameterTypes(), method.getReturnType());
break;
case INVOKE_INTERFACE_RANGE:
case INVOKE_INTERFACE:
invoke = nInvokeInterface(vs, method.getOwner(), method.getName(), method.getParameterTypes(), method.getReturnType());
break;
default:
throw new RuntimeException();
}
if ("V".equals(method.getReturnType())) {
x(nVoidInvoke(invoke));
} else {
x(nAssign(tmpLocal, invoke));
}
}
use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.
the class JimpleTransformer method convertExpr.
private Value convertExpr(Value x, boolean keep, N tmp) {
switch(x.et) {
case E0:
if (!keep) {
switch(x.vt) {
case CONSTANT:
Constant cst = (Constant) x;
if (cst.value instanceof String || cst.value instanceof Constant.Type || cst.value.getClass().isArray()) {
return tmp.newAssign(x);
}
break;
case NEW:
case STATIC_FIELD:
return tmp.newAssign(x);
default:
}
}
break;
case E1:
x.setOp(convertExpr(x.getOp(), false, tmp));
if (!keep) {
return tmp.newAssign(x);
}
break;
case E2:
x.setOp1(convertExpr(x.getOp1(), false, tmp));
x.setOp2(convertExpr(x.getOp2(), false, tmp));
if (!keep) {
return tmp.newAssign(x);
}
break;
case En:
Value[] ops = x.getOps();
for (int i = 0; i < ops.length; i++) {
ops[i] = convertExpr(ops[i], false, tmp);
}
if (!keep) {
return tmp.newAssign(x);
}
break;
}
return x;
}
use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.
the class NpeTransformer method replace.
private void replace(final IrMethod m, final Stmt p) {
StmtTraveler traveler = new StmtTraveler() {
@Override
public Value travel(Value op) {
switch(op.vt) {
case INVOKE_VIRTUAL:
case INVOKE_SPECIAL:
case INVOKE_INTERFACE:
{
Value[] ops = op.getOps();
if (isNull(ops[0])) {
for (int i = 1; i < ops.length; i++) {
travel(ops[i]);
}
throw NPE;
}
}
break;
case ARRAY:
{
if (isNull(op.getOp1())) {
travel(op.getOp2());
throw NPE;
}
}
break;
case FIELD:
{
if (isNull(op.getOp())) {
throw NPE;
}
}
break;
case IDIV:
if (op.getOp2().vt == Value.VT.CONSTANT) {
Constant constant = (Constant) op.getOp2();
if (((Number) constant.value).intValue() == 0) {
travel(op.getOp1());
throw DIVE;
}
}
break;
case LDIV:
if (op.getOp2().vt == Value.VT.CONSTANT) {
Constant constant = (Constant) op.getOp2();
if (((Number) constant.value).longValue() == 0) {
travel(op.getOp1());
throw DIVE;
}
}
break;
case NEW_ARRAY:
if (op.getOp().vt == Value.VT.CONSTANT) {
Constant constant = (Constant) op.getOp();
if (((Number) constant.value).intValue() < 0) {
throw NEGATIVE_ARRAY_SIZE;
}
}
break;
case NEW_MUTI_ARRAY:
for (Value size : op.getOps()) {
if (size.vt == Value.VT.CONSTANT) {
Constant constant = (Constant) size;
if (((Number) constant.value).intValue() < 0) {
throw NEGATIVE_ARRAY_SIZE;
} else {
travel(size);
}
}
}
break;
default:
}
Value sop = super.travel(op);
if (sop.vt == Value.VT.LOCAL || sop.vt == Value.VT.CONSTANT) {
return sop;
} else {
Local local = new Local();
m.locals.add(local);
m.stmts.insertBefore(p, Stmts.nAssign(local, sop));
return local;
}
}
};
try {
switch(p.et) {
case E0:
// impossible
break;
case E1:
traveler.travel(p.getOp());
break;
case E2:
if (p.st == Stmt.ST.ASSIGN) {
switch(p.getOp1().vt) {
case ARRAY:
traveler.travel(p.getOp1().getOp1());
traveler.travel(p.getOp1().getOp2());
traveler.travel(p.getOp2());
break;
case FIELD:
traveler.travel(p.getOp1().getOp());
traveler.travel(p.getOp2());
break;
case STATIC_FIELD:
case LOCAL:
traveler.travel(p.getOp2());
break;
default:
}
} else if (p.st == Stmt.ST.FILL_ARRAY_DATA) {
if (isNull(p.getOp1())) {
throw NPE;
} else {
traveler.travel(p.getOp1());
}
}
break;
case En:
}
} catch (MustThrowException e) {
if (e == NPE) {
m.stmts.insertBefore(p, Stmts.nThrow(Exprs.nInvokeNew(new Value[0], new String[0], "Ljava/lang/NullPointerException;")));
} else if (e == DIVE) {
m.stmts.insertBefore(p, Stmts.nThrow(Exprs.nInvokeNew(new Value[] { Exprs.nString("divide by zero") }, new String[] { "Ljava/lang/String;" }, "Ljava/lang/ArithmeticException;")));
} else if (e == NEGATIVE_ARRAY_SIZE) {
m.stmts.insertBefore(p, Stmts.nThrow(Exprs.nInvokeNew(new Value[0], new String[0], "Ljava/lang/NegativeArraySizeException;")));
}
}
}
use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.
the class NpeTransformer method transformReportChanged.
@Override
public boolean transformReportChanged(IrMethod method) {
boolean changed = false;
if (method.locals.size() == 0) {
return false;
}
StmtSearcher st = new StmtSearcher() {
@Override
public void travel(Stmt stmt) {
if (stmt.st == Stmt.ST.FILL_ARRAY_DATA) {
if (isNull(stmt.getOp1())) {
throw NPE;
}
}
super.travel(stmt);
}
@Override
public void travel(Value op) {
switch(op.vt) {
case INVOKE_VIRTUAL:
case INVOKE_SPECIAL:
case INVOKE_INTERFACE:
{
if (isNull(op.getOps()[0])) {
throw NPE;
}
}
break;
case ARRAY:
{
if (isNull(op.getOp1())) {
throw NPE;
}
}
break;
case FIELD:
{
if (isNull(op.getOp())) {
throw NPE;
}
}
break;
case IDIV:
if (op.getOp2().vt == Value.VT.CONSTANT) {
Constant constant = (Constant) op.getOp2();
if (((Number) constant.value).intValue() == 0) {
throw DIVE;
}
}
break;
case LDIV:
if (op.getOp2().vt == Value.VT.CONSTANT) {
Constant constant = (Constant) op.getOp2();
if (((Number) constant.value).longValue() == 0) {
throw DIVE;
}
}
break;
case NEW_ARRAY:
if (op.getOp().vt == Value.VT.CONSTANT) {
Constant constant = (Constant) op.getOp();
if (((Number) constant.value).intValue() < 0) {
throw NEGATIVE_ARRAY_SIZE;
}
}
break;
case NEW_MUTI_ARRAY:
for (Value size : op.getOps()) {
if (size.vt == Value.VT.CONSTANT) {
Constant constant = (Constant) size;
if (((Number) constant.value).intValue() < 0) {
throw NEGATIVE_ARRAY_SIZE;
}
}
}
break;
default:
}
}
};
for (Stmt p = method.stmts.getFirst(); p != null; ) {
try {
st.travel(p);
p = p.getNext();
} catch (MustThrowException e) {
replace(method, p);
Stmt q = p.getNext();
method.stmts.remove(p);
changed = true;
p = q;
}
}
return changed;
}
Aggregations