Search in sources :

Example 1 with CodeObserver

use of com.android.dx.cf.direct.CodeObserver in project buck by facebook.

the class BlockDumper method regularDump.

/**
     * Does a regular basic block dump.
     *
     * @param meth {@code non-null;} method data to dump
     */
private void regularDump(ConcreteMethod meth) {
    BytecodeArray code = meth.getCode();
    ByteArray bytes = code.getBytes();
    ByteBlockList list = BasicBlocker.identifyBlocks(meth);
    int sz = list.size();
    CodeObserver codeObserver = new CodeObserver(bytes, BlockDumper.this);
    // Reset the dump cursor to the start of the bytecode.
    setAt(bytes, 0);
    suppressDump = false;
    int byteAt = 0;
    for (int i = 0; i < sz; i++) {
        ByteBlock bb = list.get(i);
        int start = bb.getStart();
        int end = bb.getEnd();
        if (byteAt < start) {
            parsed(bytes, byteAt, start - byteAt, "dead code " + Hex.u2(byteAt) + ".." + Hex.u2(start));
        }
        parsed(bytes, start, 0, "block " + Hex.u2(bb.getLabel()) + ": " + Hex.u2(start) + ".." + Hex.u2(end));
        changeIndent(1);
        int len;
        for (int j = start; j < end; j += len) {
            len = code.parseInstruction(j, codeObserver);
            codeObserver.setPreviousOffset(j);
        }
        IntList successors = bb.getSuccessors();
        int ssz = successors.size();
        if (ssz == 0) {
            parsed(bytes, end, 0, "returns");
        } else {
            for (int j = 0; j < ssz; j++) {
                int succ = successors.get(j);
                parsed(bytes, end, 0, "next " + Hex.u2(succ));
            }
        }
        ByteCatchList catches = bb.getCatches();
        int csz = catches.size();
        for (int j = 0; j < csz; j++) {
            ByteCatchList.Item one = catches.get(j);
            CstType exceptionClass = one.getExceptionClass();
            parsed(bytes, end, 0, "catch " + ((exceptionClass == CstType.OBJECT) ? "<any>" : exceptionClass.toHuman()) + " -> " + Hex.u2(one.getHandlerPc()));
        }
        changeIndent(-1);
        byteAt = end;
    }
    int end = bytes.size();
    if (byteAt < end) {
        parsed(bytes, byteAt, end - byteAt, "dead code " + Hex.u2(byteAt) + ".." + Hex.u2(end));
    }
    suppressDump = true;
}
Also used : BytecodeArray(com.android.dx.cf.code.BytecodeArray) ByteCatchList(com.android.dx.cf.code.ByteCatchList) ByteBlock(com.android.dx.cf.code.ByteBlock) CstType(com.android.dx.rop.cst.CstType) ByteArray(com.android.dx.util.ByteArray) CodeObserver(com.android.dx.cf.direct.CodeObserver) ByteBlockList(com.android.dx.cf.code.ByteBlockList) IntList(com.android.dx.util.IntList)

Aggregations

ByteBlock (com.android.dx.cf.code.ByteBlock)1 ByteBlockList (com.android.dx.cf.code.ByteBlockList)1 ByteCatchList (com.android.dx.cf.code.ByteCatchList)1 BytecodeArray (com.android.dx.cf.code.BytecodeArray)1 CodeObserver (com.android.dx.cf.direct.CodeObserver)1 CstType (com.android.dx.rop.cst.CstType)1 ByteArray (com.android.dx.util.ByteArray)1 IntList (com.android.dx.util.IntList)1