Search in sources :

Example 81 with Local

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;
}
Also used : Local(com.googlecode.dex2jar.ir.expr.Local)

Example 82 with Local

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;
}
Also used : Local(com.googlecode.dex2jar.ir.expr.Local)

Example 83 with Local

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));
}
Also used : Exprs.nArrayValue(com.googlecode.dex2jar.ir.expr.Exprs.nArrayValue) Value(com.googlecode.dex2jar.ir.expr.Value) Local(com.googlecode.dex2jar.ir.expr.Local)

Example 84 with Local

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));
}
Also used : Exprs.nArrayValue(com.googlecode.dex2jar.ir.expr.Exprs.nArrayValue) Value(com.googlecode.dex2jar.ir.expr.Value) Local(com.googlecode.dex2jar.ir.expr.Local)

Example 85 with Local

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;
}
Also used : Local(com.googlecode.dex2jar.ir.expr.Local)

Aggregations

Local (com.googlecode.dex2jar.ir.expr.Local)86 Test (org.junit.Test)44 LabelStmt (com.googlecode.dex2jar.ir.stmt.LabelStmt)28 Stmt (com.googlecode.dex2jar.ir.stmt.Stmt)23 Value (com.googlecode.dex2jar.ir.expr.Value)19 AssignStmt (com.googlecode.dex2jar.ir.stmt.AssignStmt)15 ArrayList (java.util.ArrayList)8 IrMethod (com.googlecode.dex2jar.ir.IrMethod)6 Exprs.nLocal (com.googlecode.dex2jar.ir.expr.Exprs.nLocal)6 UnopStmt (com.googlecode.dex2jar.ir.stmt.UnopStmt)6 JumpStmt (com.googlecode.dex2jar.ir.stmt.JumpStmt)5 ConstTransformer (com.googlecode.dex2jar.ir.ts.ConstTransformer)5 Exprs.nString (com.googlecode.dex2jar.ir.expr.Exprs.nString)4 StmtList (com.googlecode.dex2jar.ir.stmt.StmtList)4 Trap (com.googlecode.dex2jar.ir.Trap)3 Exprs.nArrayValue (com.googlecode.dex2jar.ir.expr.Exprs.nArrayValue)3 AnalyzeValue (com.googlecode.dex2jar.ir.ts.an.AnalyzeValue)3 List (java.util.List)3 DexLabel (com.googlecode.d2j.DexLabel)2 Op (com.googlecode.d2j.reader.Op)2