Search in sources :

Example 11 with BasicBlockList

use of com.taobao.android.dx.rop.code.BasicBlockList in project atlas by alibaba.

the class Ropper method getRopMethod.

/**
     * Extracts the resulting {@link RopMethod} from the instance.
     *
     * @return {@code non-null;} the method object
     */
private RopMethod getRopMethod() {
    // Construct the final list of blocks.
    int sz = result.size();
    BasicBlockList bbl = new BasicBlockList(sz);
    for (int i = 0; i < sz; i++) {
        bbl.set(i, result.get(i));
    }
    bbl.setImmutable();
    /*
         * Note: The parameter assignment block is always the first
         * that should be executed, hence the second argument to the
         * constructor.
         */
    return new RopMethod(bbl, getSpecialLabel(PARAM_ASSIGNMENT));
}
Also used : RopMethod(com.taobao.android.dx.rop.code.RopMethod) BasicBlockList(com.taobao.android.dx.rop.code.BasicBlockList)

Example 12 with BasicBlockList

use of com.taobao.android.dx.rop.code.BasicBlockList in project atlas by alibaba.

the class StdCatchBuilder method build.

/**
     * Builds and returns the catch table for a given method.
     *
     * @param method {@code non-null;} method to build the list for
     * @param order {@code non-null;} block output order
     * @param addresses {@code non-null;} address objects for each block
     * @return {@code non-null;} the constructed table
     */
public static CatchTable build(RopMethod method, int[] order, BlockAddresses addresses) {
    int len = order.length;
    BasicBlockList blocks = method.getBlocks();
    ArrayList<CatchTable.Entry> resultList = new ArrayList<CatchTable.Entry>(len);
    CatchHandlerList currentHandlers = CatchHandlerList.EMPTY;
    BasicBlock currentStartBlock = null;
    BasicBlock currentEndBlock = null;
    for (int i = 0; i < len; i++) {
        BasicBlock block = blocks.labelToBlock(order[i]);
        if (!block.canThrow()) {
            /*
                 * There is no need to concern ourselves with the
                 * placement of blocks that can't throw with respect
                 * to the blocks that *can* throw.
                 */
            continue;
        }
        CatchHandlerList handlers = handlersFor(block, addresses);
        if (currentHandlers.size() == 0) {
            // This is the start of a new catch range.
            currentStartBlock = block;
            currentEndBlock = block;
            currentHandlers = handlers;
            continue;
        }
        if (currentHandlers.equals(handlers) && rangeIsValid(currentStartBlock, block, addresses)) {
            /*
                 * The block we are looking at now has the same handlers
                 * as the block that started the currently open catch
                 * range, and adding it to the currently open range won't
                 * cause it to be too long.
                 */
            currentEndBlock = block;
            continue;
        }
        /*
             * The block we are looking at now has incompatible handlers,
             * so we need to finish off the last entry and start a new
             * one. Note: We only emit an entry if it has associated handlers.
             */
        if (currentHandlers.size() != 0) {
            CatchTable.Entry entry = makeEntry(currentStartBlock, currentEndBlock, currentHandlers, addresses);
            resultList.add(entry);
        }
        currentStartBlock = block;
        currentEndBlock = block;
        currentHandlers = handlers;
    }
    if (currentHandlers.size() != 0) {
        // Emit an entry for the range that was left hanging.
        CatchTable.Entry entry = makeEntry(currentStartBlock, currentEndBlock, currentHandlers, addresses);
        resultList.add(entry);
    }
    // Construct the final result.
    int resultSz = resultList.size();
    if (resultSz == 0) {
        return CatchTable.EMPTY;
    }
    CatchTable result = new CatchTable(resultSz);
    for (int i = 0; i < resultSz; i++) {
        result.set(i, resultList.get(i));
    }
    result.setImmutable();
    return result;
}
Also used : ArrayList(java.util.ArrayList) BasicBlock(com.taobao.android.dx.rop.code.BasicBlock) BasicBlockList(com.taobao.android.dx.rop.code.BasicBlockList)

Aggregations

BasicBlockList (com.taobao.android.dx.rop.code.BasicBlockList)12 BasicBlock (com.taobao.android.dx.rop.code.BasicBlock)8 RopMethod (com.taobao.android.dx.rop.code.RopMethod)3 IntList (com.taobao.android.dx.util.IntList)3 DexTranslationAdvice (com.taobao.android.dx.rop.code.DexTranslationAdvice)2 Insn (com.taobao.android.dx.rop.code.Insn)2 InsnList (com.taobao.android.dx.rop.code.InsnList)2 TranslationAdvice (com.taobao.android.dx.rop.code.TranslationAdvice)2 TypeList (com.taobao.android.dx.rop.type.TypeList)2 Optimizer (com.taobao.android.dx.ssa.Optimizer)2 BytecodeArray (com.taobao.android.dx.cf.code.BytecodeArray)1 ConcreteMethod (com.taobao.android.dx.cf.code.ConcreteMethod)1 Method (com.taobao.android.dx.cf.iface.Method)1 SourcePosition (com.taobao.android.dx.rop.code.SourcePosition)1 CstType (com.taobao.android.dx.rop.cst.CstType)1 Type (com.taobao.android.dx.rop.type.Type)1 SsaBasicBlock (com.taobao.android.dx.ssa.SsaBasicBlock)1 ByteArray (com.taobao.android.dx.util.ByteArray)1 ArrayList (java.util.ArrayList)1 HashSet (java.util.HashSet)1