public class BlockUtils
extends java.lang.Object
| Modifier and Type | Method and Description |
|---|---|
static boolean |
atLeastOnePathExists(java.util.Collection<BlockNode> startBlocks,
BlockNode end)
Search at least one path from startBlocks to end
|
static java.util.List<BlockNode> |
bitSetToBlocks(MethodNode mth,
java.util.BitSet bs) |
static @Nullable BlockNode |
bitSetToOneBlock(MethodNode mth,
java.util.BitSet bs) |
static boolean |
blockContains(BlockNode block,
InsnNode insn)
Check if instruction contains in block (use == for comparison, not equals)
|
static java.util.BitSet |
blocksToBitSet(MethodNode mth,
java.util.Collection<BlockNode> blocks) |
static java.util.List<BlockNode> |
buildSimplePath(BlockNode block) |
static @Nullable BlockNode |
calcImmediatePostDominator(MethodNode mth,
BlockNode block) |
static @Nullable BlockNode |
calcImmediatePostDominator(MethodNode mth,
BlockNode block,
java.util.Map<BlockNode,java.util.BitSet> postDomsMap) |
static @Nullable BlockNode |
calcPartialImmediatePostDominator(MethodNode mth,
BlockNode block,
java.util.Collection<BlockNode> blockNodes,
BlockNode exitBlock) |
static java.util.Map<BlockNode,java.util.BitSet> |
calcPartialPostDominance(MethodNode mth,
java.util.Collection<BlockNode> blockNodes,
BlockNode exitBlock) |
static java.util.Map<BlockNode,java.util.BitSet> |
calcPostDominance(MethodNode mth) |
static boolean |
checkFirstInsn(IBlock block,
java.util.function.Predicate<InsnNode> predicate) |
static boolean |
checkLastInsnType(IBlock block,
InsnType expectedType) |
static void |
cleanBitSet(MethodNode mth,
java.util.BitSet bs)
Remove exception handlers from block nodes bitset
|
static java.util.List<InsnNode> |
collectAllInsns(java.util.List<BlockNode> blocks) |
static java.util.List<BlockNode> |
collectBlocksDominatedBy(MethodNode mth,
BlockNode dominator,
BlockNode start)
Collect all block dominated by 'dominator', starting from 'start'
|
static java.util.Set<BlockNode> |
collectBlocksDominatedByWithExcHandlers(MethodNode mth,
BlockNode dominator,
BlockNode start)
Collect all block dominated by 'dominator', starting from 'start', including exception handlers
|
static java.util.List<InsnNode> |
collectInsnsWithLimit(java.util.List<BlockNode> blocks,
int limit)
Return limited number of instructions from method.
|
static java.util.List<BlockNode> |
collectPredecessors(MethodNode mth,
BlockNode start,
java.util.Collection<BlockNode> stopBlocks) |
static boolean |
containsExitInsn(IBlock block) |
static java.util.BitSet |
copyBlocksBitSet(MethodNode mth,
java.util.BitSet bitSet) |
static void |
dfsVisit(MethodNode mth,
java.util.function.Consumer<BlockNode> visitor) |
static BlockNode |
followEmptyPath(BlockNode start)
Follow empty blocks and return end of path block (first not empty).
|
static void |
forEachBlockFromBitSet(MethodNode mth,
java.util.BitSet bs,
java.util.function.Consumer<BlockNode> consumer) |
static java.util.Set<BlockNode> |
getAllPathsBlocks(BlockNode start,
BlockNode end)
Collect blocks from all possible execution paths from 'start' to 'end'
|
static @Nullable BlockNode |
getBlockByInsn(MethodNode mth,
@Nullable InsnNode insn) |
static BlockNode |
getBlockByOffset(int offset,
java.lang.Iterable<BlockNode> casesBlocks) |
static @Nullable BlockNode |
getBlockWithFlag(java.util.List<BlockNode> blocks,
AFlag flag) |
static @Nullable BlockNode |
getBottomBlock(java.util.List<BlockNode> blocks)
Search last block in control flow graph from input set.
|
static @Nullable BlockNode |
getCommonDominator(MethodNode mth,
java.util.List<BlockNode> blocks)
Search the lowest common ancestor in dominator tree for input set.
|
static @Nullable InsnNode |
getFirstInsn(@Nullable IBlock block) |
static int |
getFirstSourceLine(IBlock block) |
static int |
getInsnIndexInBlock(BlockNode block,
InsnNode insn) |
static @Nullable InsnNode |
getLastInsn(@Nullable IBlock block) |
static InsnNode |
getLastInsnWithType(IBlock block,
InsnType expectedType) |
static @Nullable BlockNode |
getNextBlock(BlockNode block)
Return first successor which not exception handler and not follow loop back edge
|
static BlockNode |
getNextBlockToPath(BlockNode block,
BlockNode pathEnd)
Return successor on path to 'pathEnd' block
|
static @Nullable BlockNode |
getNextSinglePathBlock(BlockNode block) |
static @Nullable InsnNode |
getOnlyOneInsnFromMth(MethodNode mth)
Return insn if it is only one instruction in this method.
|
static BlockNode |
getPathCross(MethodNode mth,
BlockNode b1,
BlockNode b2) |
static @Nullable BlockNode |
getPathCross(MethodNode mth,
java.util.Collection<BlockNode> blocks)
Return common cross block for input set.
|
static BlockNode |
getTopBlock(java.util.List<BlockNode> blocks) |
static BlockNode |
getTopSplitterForHandler(BlockNode handlerBlock) |
static boolean |
insertAfterInsn(BlockNode block,
InsnNode insn,
InsnNode newInsn) |
static boolean |
insertBeforeInsn(BlockNode block,
InsnNode insn,
InsnNode newInsn) |
static boolean |
isAllBlocksEmpty(java.util.List<BlockNode> blocks) |
static boolean |
isAllPathExists(java.util.Collection<BlockNode> startBlocks,
BlockNode end)
Check if exist path from every startBlocks to end
|
static boolean |
isAnyPathExists(BlockNode start,
BlockNode end) |
static boolean |
isBackEdge(BlockNode from,
BlockNode to) |
static boolean |
isEmptySimplePath(BlockNode start,
BlockNode end)
Return true if on path from start to end no instructions and no branches.
|
static boolean |
isExceptionHandlerPath(BlockNode b) |
static boolean |
isExitBlock(BlockNode block) |
static boolean |
isExitBlock(MethodNode mth,
BlockNode block) |
static boolean |
isFirstInsn(MethodNode mth,
InsnNode insn) |
static boolean |
isFollowBackEdge(BlockNode block) |
static boolean |
isOnlyOnePathExists(BlockNode start,
BlockNode end) |
static boolean |
isPathExists(BlockNode start,
BlockNode end) |
static java.util.BitSet |
newBlocksBitSet(MethodNode mth) |
static boolean |
replaceInsn(MethodNode mth,
BlockNode block,
InsnNode oldInsn,
InsnNode newInsn) |
static void |
replaceInsn(MethodNode mth,
BlockNode block,
int i,
InsnNode insn)
Replace insn by index i in block,
for proper copy attributes, assume attributes are not overlap
|
static boolean |
replaceInsn(MethodNode mth,
InsnNode oldInsn,
InsnNode newInsn) |
static BlockNode |
searchBlockWithPhi(MethodNode mth,
PhiInsn insn) |
static InsnNode |
searchInsnParent(MethodNode mth,
InsnNode insn) |
static InsnArg |
searchWrappedInsnParent(MethodNode mth,
InsnNode insn) |
static BlockNode |
selectOther(BlockNode node,
java.util.List<BlockNode> blocks) |
static BlockNode |
selectOtherSafe(BlockNode node,
java.util.List<BlockNode> blocks) |
static void |
skipPredSyntheticPaths(BlockNode block)
Set 'SKIP' flag for all synthetic predecessors from start block.
|
static BlockNode |
skipSyntheticPredecessor(BlockNode block)
Return predecessor of synthetic block or same block otherwise.
|
static BlockNode |
traverseWhileDominates(BlockNode dom,
BlockNode start)
Search for first node which not dominated by dom, starting from start
|
static void |
visitBlocksOnEmptyPath(BlockNode start,
java.util.function.Consumer<BlockNode> visitor) |
static boolean |
visitBlocksOnPath(MethodNode mth,
BlockNode start,
BlockNode end,
java.util.function.Consumer<BlockNode> visitor)
Visit blocks on any path from start to end.
|
static void |
visitSinglePath(BlockNode startBlock,
java.util.function.Consumer<BlockNode> visitor)
Visit blocks on path without branching or merging paths.
|
public static BlockNode getBlockByOffset(int offset, java.lang.Iterable<BlockNode> casesBlocks)
public static BlockNode selectOtherSafe(BlockNode node, java.util.List<BlockNode> blocks)
public static boolean isExceptionHandlerPath(BlockNode b)
public static void cleanBitSet(MethodNode mth, java.util.BitSet bs)
public static boolean isFollowBackEdge(BlockNode block)
public static boolean blockContains(BlockNode block, InsnNode insn)
public static boolean checkFirstInsn(IBlock block, java.util.function.Predicate<InsnNode> predicate)
public static int getFirstSourceLine(IBlock block)
@Nullable public static @Nullable InsnNode getFirstInsn(@Nullable @Nullable IBlock block)
@Nullable public static @Nullable InsnNode getLastInsn(@Nullable @Nullable IBlock block)
public static boolean isExitBlock(MethodNode mth, BlockNode block)
public static boolean isExitBlock(BlockNode block)
public static boolean containsExitInsn(IBlock block)
@Nullable public static @Nullable BlockNode getBlockByInsn(MethodNode mth, @Nullable @Nullable InsnNode insn)
public static BlockNode searchBlockWithPhi(MethodNode mth, PhiInsn insn)
public static InsnNode searchInsnParent(MethodNode mth, InsnNode insn)
public static InsnArg searchWrappedInsnParent(MethodNode mth, InsnNode insn)
public static java.util.BitSet newBlocksBitSet(MethodNode mth)
public static java.util.BitSet copyBlocksBitSet(MethodNode mth, java.util.BitSet bitSet)
public static java.util.BitSet blocksToBitSet(MethodNode mth, java.util.Collection<BlockNode> blocks)
@Nullable public static @Nullable BlockNode bitSetToOneBlock(MethodNode mth, java.util.BitSet bs)
public static java.util.List<BlockNode> bitSetToBlocks(MethodNode mth, java.util.BitSet bs)
public static void forEachBlockFromBitSet(MethodNode mth, java.util.BitSet bs, java.util.function.Consumer<BlockNode> consumer)
@Nullable public static @Nullable BlockNode getNextBlock(BlockNode block)
public static BlockNode getNextBlockToPath(BlockNode block, BlockNode pathEnd)
public static boolean visitBlocksOnPath(MethodNode mth, BlockNode start, BlockNode end, java.util.function.Consumer<BlockNode> visitor)
public static void dfsVisit(MethodNode mth, java.util.function.Consumer<BlockNode> visitor)
public static java.util.List<BlockNode> collectPredecessors(MethodNode mth, BlockNode start, java.util.Collection<BlockNode> stopBlocks)
public static java.util.Set<BlockNode> getAllPathsBlocks(BlockNode start, BlockNode end)
public static boolean atLeastOnePathExists(java.util.Collection<BlockNode> startBlocks, BlockNode end)
public static boolean isAllPathExists(java.util.Collection<BlockNode> startBlocks, BlockNode end)
@Nullable public static @Nullable BlockNode getBottomBlock(java.util.List<BlockNode> blocks)
public static BlockNode traverseWhileDominates(BlockNode dom, BlockNode start)
@Nullable public static @Nullable BlockNode getCommonDominator(MethodNode mth, java.util.List<BlockNode> blocks)
@Nullable public static @Nullable BlockNode getPathCross(MethodNode mth, java.util.Collection<BlockNode> blocks)
public static BlockNode getPathCross(MethodNode mth, BlockNode b1, BlockNode b2)
public static java.util.List<BlockNode> collectBlocksDominatedBy(MethodNode mth, BlockNode dominator, BlockNode start)
public static java.util.Set<BlockNode> collectBlocksDominatedByWithExcHandlers(MethodNode mth, BlockNode dominator, BlockNode start)
public static void visitSinglePath(BlockNode startBlock, java.util.function.Consumer<BlockNode> visitor)
@Nullable public static @Nullable BlockNode getNextSinglePathBlock(BlockNode block)
public static void skipPredSyntheticPaths(BlockNode block)
public static BlockNode followEmptyPath(BlockNode start)
public static void visitBlocksOnEmptyPath(BlockNode start, java.util.function.Consumer<BlockNode> visitor)
public static boolean isEmptySimplePath(BlockNode start, BlockNode end)
public static BlockNode skipSyntheticPredecessor(BlockNode block)
public static boolean isAllBlocksEmpty(java.util.List<BlockNode> blocks)
public static java.util.List<InsnNode> collectAllInsns(java.util.List<BlockNode> blocks)
public static java.util.List<InsnNode> collectInsnsWithLimit(java.util.List<BlockNode> blocks, int limit)
@Nullable public static @Nullable InsnNode getOnlyOneInsnFromMth(MethodNode mth)
public static boolean isFirstInsn(MethodNode mth, InsnNode insn)
public static void replaceInsn(MethodNode mth, BlockNode block, int i, InsnNode insn)
public static boolean replaceInsn(MethodNode mth, BlockNode block, InsnNode oldInsn, InsnNode newInsn)
public static boolean insertBeforeInsn(BlockNode block, InsnNode insn, InsnNode newInsn)
public static boolean insertAfterInsn(BlockNode block, InsnNode insn, InsnNode newInsn)
public static boolean replaceInsn(MethodNode mth, InsnNode oldInsn, InsnNode newInsn)
public static java.util.Map<BlockNode,java.util.BitSet> calcPostDominance(MethodNode mth)
public static java.util.Map<BlockNode,java.util.BitSet> calcPartialPostDominance(MethodNode mth, java.util.Collection<BlockNode> blockNodes, BlockNode exitBlock)
@Nullable public static @Nullable BlockNode calcImmediatePostDominator(MethodNode mth, BlockNode block)
@Nullable public static @Nullable BlockNode calcPartialImmediatePostDominator(MethodNode mth, BlockNode block, java.util.Collection<BlockNode> blockNodes, BlockNode exitBlock)
@Nullable public static @Nullable BlockNode calcImmediatePostDominator(MethodNode mth, BlockNode block, java.util.Map<BlockNode,java.util.BitSet> postDomsMap)