use of com.googlecode.dex2jar.ir.expr.Local in project dex2jar by pxb1988.
the class Dex2IRConverter method newLocal.
private Local newLocal() {
Local thiz = Exprs.nLocal(target.locals.size());
target.locals.add(thiz);
return thiz;
}
use of com.googlecode.dex2jar.ir.expr.Local in project dex2jar by pxb1988.
the class J2IRConverter method initFirstFrame.
private JvmFrame initFirstFrame(MethodNode methodNode, IrMethod target) {
JvmFrame first = new JvmFrame(methodNode.maxLocals, methodNode.maxStack);
int x = 0;
if (!target.isStatic) {
// not static
Local thiz = newLocal();
emit(Stmts.nIdentity(thiz, Exprs.nThisRef(target.owner)));
first.setLocal(x++, new JvmValue(1, thiz));
}
for (int i = 0; i < target.args.length; i++) {
Local p = newLocal();
emit(Stmts.nIdentity(p, Exprs.nParameterRef(target.args[i], i)));
int sizeOfType = sizeOfType(target.args[i]);
first.setLocal(x, new JvmValue(sizeOfType, p));
x += sizeOfType;
}
return first;
}
use of com.googlecode.dex2jar.ir.expr.Local in project dex2jar by pxb1988.
the class Dex2IrAdapter method visitStmt2R.
@Override
public void visitStmt2R(Op op, int a, int b) {
Local va = locals[a];
Local vb = locals[b];
Value to = null;
switch(op) {
case MOVE:
case MOVE_16:
case MOVE_FROM16:
case MOVE_OBJECT:
case MOVE_OBJECT_16:
case MOVE_OBJECT_FROM16:
case MOVE_WIDE:
case MOVE_WIDE_FROM16:
case MOVE_WIDE_16:
to = vb;
break;
case ARRAY_LENGTH:
to = nLength(vb);
break;
case ADD_DOUBLE_2ADDR:
to = nAdd(va, vb, "D");
break;
case ADD_FLOAT_2ADDR:
to = nAdd(va, vb, "F");
break;
case ADD_INT_2ADDR:
to = nAdd(va, vb, "I");
break;
case ADD_LONG_2ADDR:
to = nAdd(va, vb, "J");
break;
case SUB_DOUBLE_2ADDR:
to = nSub(va, vb, "D");
break;
case SUB_FLOAT_2ADDR:
to = nSub(va, vb, "F");
break;
case SUB_INT_2ADDR:
to = nSub(va, vb, "I");
break;
case SUB_LONG_2ADDR:
to = nSub(va, vb, "J");
break;
case MUL_DOUBLE_2ADDR:
to = nMul(va, vb, "D");
break;
case MUL_FLOAT_2ADDR:
to = nMul(va, vb, "F");
break;
case MUL_INT_2ADDR:
to = nMul(va, vb, "I");
break;
case MUL_LONG_2ADDR:
to = nMul(va, vb, "J");
break;
case DIV_DOUBLE_2ADDR:
to = nDiv(va, vb, "D");
break;
case DIV_FLOAT_2ADDR:
to = nDiv(va, vb, "F");
break;
case DIV_INT_2ADDR:
to = nDiv(va, vb, "I");
break;
case DIV_LONG_2ADDR:
to = nDiv(va, vb, "J");
break;
case REM_DOUBLE_2ADDR:
to = nRem(va, vb, "D");
break;
case REM_FLOAT_2ADDR:
to = nRem(va, vb, "F");
break;
case REM_INT_2ADDR:
to = nRem(va, vb, "I");
break;
case REM_LONG_2ADDR:
to = nRem(va, vb, "J");
break;
case AND_INT_2ADDR:
to = nAnd(va, vb, TypeClass.ZI.name);
break;
case AND_LONG_2ADDR:
to = nAnd(va, vb, "J");
break;
case OR_INT_2ADDR:
to = nOr(va, vb, TypeClass.ZI.name);
break;
case OR_LONG_2ADDR:
to = nOr(va, vb, "J");
break;
case XOR_INT_2ADDR:
to = nXor(va, vb, TypeClass.ZI.name);
break;
case XOR_LONG_2ADDR:
to = nXor(va, vb, "J");
break;
case SHL_INT_2ADDR:
to = nShl(va, vb, "I");
break;
case SHL_LONG_2ADDR:
to = nShl(va, vb, "J");
break;
case SHR_INT_2ADDR:
to = nShr(va, vb, "I");
break;
case SHR_LONG_2ADDR:
to = nShr(va, vb, "J");
break;
case USHR_INT_2ADDR:
to = nUshr(va, vb, "I");
break;
case USHR_LONG_2ADDR:
to = nUshr(va, vb, "J");
break;
case NOT_INT:
to = nNot(vb, "I");
break;
case NOT_LONG:
to = nNot(vb, "J");
break;
case NEG_DOUBLE:
to = nNeg(vb, "D");
break;
case NEG_FLOAT:
to = nNeg(vb, "F");
break;
case NEG_INT:
to = nNeg(vb, "I");
break;
case NEG_LONG:
to = nNeg(vb, "J");
break;
case INT_TO_BYTE:
to = nCast(vb, "I", "B");
break;
case INT_TO_CHAR:
to = nCast(vb, "I", "C");
break;
case INT_TO_DOUBLE:
to = nCast(vb, "I", "D");
break;
case INT_TO_FLOAT:
to = nCast(vb, "I", "F");
break;
case INT_TO_LONG:
to = nCast(vb, "I", "J");
break;
case INT_TO_SHORT:
to = nCast(vb, "I", "S");
break;
case FLOAT_TO_DOUBLE:
to = nCast(vb, "F", "D");
break;
case FLOAT_TO_INT:
to = nCast(vb, "F", "I");
break;
case FLOAT_TO_LONG:
to = nCast(vb, "F", "J");
break;
case DOUBLE_TO_FLOAT:
to = nCast(vb, "D", "F");
break;
case DOUBLE_TO_INT:
to = nCast(vb, "D", "I");
break;
case DOUBLE_TO_LONG:
to = nCast(vb, "D", "J");
break;
case LONG_TO_DOUBLE:
to = nCast(vb, "J", "D");
break;
case LONG_TO_FLOAT:
to = nCast(vb, "J", "F");
break;
case LONG_TO_INT:
to = nCast(vb, "J", "I");
break;
default:
throw new RuntimeException();
}
x(nAssign(va, to));
}
use of com.googlecode.dex2jar.ir.expr.Local in project dex2jar by pxb1988.
the class Dex2IrAdapter method visitStmt2R1N.
@Override
public void visitStmt2R1N(Op op, int a, int b, int content) {
Local va = locals[a];
Local vb = locals[b];
Value to;
switch(op) {
case ADD_INT_LIT16:
case ADD_INT_LIT8:
to = nAdd(vb, nInt(content), "I");
break;
case RSUB_INT_LIT8:
case //
RSUB_INT:
to = nSub(nInt(content), vb, "I");
break;
case MUL_INT_LIT8:
case MUL_INT_LIT16:
to = nMul(vb, nInt(content), "I");
break;
case DIV_INT_LIT16:
case DIV_INT_LIT8:
to = nDiv(vb, nInt(content), "I");
break;
case REM_INT_LIT16:
case REM_INT_LIT8:
to = nRem(vb, nInt(content), "I");
break;
case AND_INT_LIT16:
case AND_INT_LIT8:
to = nAnd(vb, nInt(content), content < 0 || content > 1 ? "I" : TypeClass.ZI.name);
break;
case OR_INT_LIT16:
case OR_INT_LIT8:
to = nOr(vb, nInt(content), content < 0 || content > 1 ? "I" : TypeClass.ZI.name);
break;
case XOR_INT_LIT16:
case XOR_INT_LIT8:
to = nXor(vb, nInt(content), content < 0 || content > 1 ? "I" : TypeClass.ZI.name);
break;
case SHL_INT_LIT8:
to = nShl(vb, nInt(content), "I");
break;
case SHR_INT_LIT8:
to = nShr(vb, nInt(content), "I");
break;
case USHR_INT_LIT8:
to = nUshr(vb, nInt(content), "I");
break;
default:
throw new RuntimeException();
}
x(nAssign(va, to));
}
use of com.googlecode.dex2jar.ir.expr.Local in project dex2jar by pxb1988.
the class Dex2IRConverter method initFirstFrame.
private Dex2IrFrame initFirstFrame(DexCodeNode methodNode, IrMethod target) {
Dex2IrFrame first = new Dex2IrFrame(methodNode.totalRegister);
int x = methodNode.totalRegister - methodArgCount(target.args);
if (!target.isStatic) {
// not static
Local thiz = newLocal();
emit(Stmts.nIdentity(thiz, Exprs.nThisRef(target.owner)));
first.setReg(x - 1, new DvmValue(thiz));
}
for (int i = 0; i < target.args.length; i++) {
Local p = newLocal();
emit(Stmts.nIdentity(p, Exprs.nParameterRef(target.args[i], i)));
first.setReg(x, new DvmValue(p));
x += sizeofType(target.args[i]);
}
if (initAllToZero) {
for (int i = 0; i < first.getTotalRegisters(); i++) {
if (first.getReg(i) == null) {
Local p = newLocal();
emit(nAssign(p, nInt(0)));
first.setReg(i, new DvmValue(p));
}
}
}
return first;
}
Aggregations