/** * Creates a new SSA basic block from a ROP form basic block. * * @param rmeth original method * @param basicBlockIndex index this block will have * @param parent method of this block predecessor set will be updated * @return new instance */ public static SsaBasicBlock newFromRop( RopMethod rmeth, int basicBlockIndex, final SsaMethod parent) { BasicBlockList ropBlocks = rmeth.getBlocks(); BasicBlock bb = ropBlocks.get(basicBlockIndex); SsaBasicBlock result = new SsaBasicBlock(basicBlockIndex, bb.getLabel(), parent); InsnList ropInsns = bb.getInsns(); result.insns.ensureCapacity(ropInsns.size()); for (int i = 0, sz = ropInsns.size(); i < sz; i++) { result.insns.add(new NormalSsaInsn(ropInsns.get(i), result)); } result.predecessors = SsaMethod.bitSetFromLabelList(ropBlocks, rmeth.labelToPredecessors(bb.getLabel())); result.successors = SsaMethod.bitSetFromLabelList(ropBlocks, bb.getSuccessors()); result.successorList = SsaMethod.indexListFromLabelList(ropBlocks, bb.getSuccessors()); if (result.successorList.size() != 0) { int primarySuccessor = bb.getPrimarySuccessor(); result.primarySuccessor = (primarySuccessor < 0) ? -1 : ropBlocks.indexOfLabel(primarySuccessor); } return result; }