Package jadx.core.utils
Class BlockUtils
- java.lang.Object
-
- jadx.core.utils.BlockUtils
-
public class BlockUtils extends java.lang.Object
-
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static booleanatLeastOnePathExists(java.util.Collection<BlockNode> startBlocks, BlockNode end)Search at least one path from startBlocks to endstatic java.util.List<BlockNode>bitSetToBlocks(MethodNode mth, java.util.BitSet bs)static @Nullable BlockNodebitSetToOneBlock(MethodNode mth, java.util.BitSet bs)static booleanblockContains(BlockNode block, InsnNode insn)Check if instruction contains in block (use == for comparison, not equals)static java.util.BitSetblocksToBitSet(MethodNode mth, java.util.Collection<BlockNode> blocks)static java.util.List<BlockNode>buildSimplePath(BlockNode block)static booleancheckFirstInsn(IBlock block, java.util.function.Predicate<InsnNode> predicate)static booleancheckLastInsnType(IBlock block, InsnType expectedType)static voidcleanBitSet(MethodNode mth, java.util.BitSet bs)Remove exception handlers from block nodes bitsetstatic java.util.List<InsnNode>collectAllInsns(java.util.List<BlockNode> blocks)static java.util.List<BlockNode>collectAllSuccessors(MethodNode mth, BlockNode startBlock, boolean clean)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 handlersstatic 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 booleancontainsExitInsn(IBlock block)static java.util.BitSetcopyBlocksBitSet(MethodNode mth, java.util.BitSet bitSet)static BlockNodefollowEmptyPath(BlockNode start)Follow empty blocks and return end of path block (first not empty).static voidforEachBlockFromBitSet(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 BlockNodegetBlockByInsn(MethodNode mth, @Nullable InsnNode insn)static @Nullable BlockNodegetBlockByInsn(MethodNode mth, @Nullable InsnNode insn, java.util.List<BlockNode> blocks)static BlockNodegetBlockByOffset(int offset, java.lang.Iterable<BlockNode> casesBlocks)static @Nullable BlockNodegetBlockWithFlag(java.util.List<BlockNode> blocks, AFlag flag)static @Nullable BlockNodegetBottomBlock(java.util.List<BlockNode> blocks)Search last block in control flow graph from input set.static @Nullable CatchAttrgetCatchAttrForInsn(MethodNode mth, InsnNode insn)static @Nullable BlockNodegetCommonDominator(MethodNode mth, java.util.List<BlockNode> blocks)Search the lowest common ancestor in dominator tree for input set.static @Nullable InsnNodegetFirstInsn(@Nullable IBlock block)static intgetFirstSourceLine(IBlock block)static intgetInsnIndexInBlock(BlockNode block, InsnNode insn)static @Nullable InsnNodegetLastInsn(@Nullable IBlock block)static InsnNodegetLastInsnWithType(IBlock block, InsnType expectedType)static @Nullable BlockNodegetNextBlock(BlockNode block)Return first successor which not exception handler and not follow loop back edgestatic BlockNodegetNextBlockToPath(BlockNode block, BlockNode pathEnd)Return successor on path to 'pathEnd' blockstatic @Nullable BlockNodegetNextSinglePathBlock(BlockNode block)static @Nullable InsnNodegetOnlyOneInsnFromMth(MethodNode mth)Return insn if it is only one instruction in this method.static BlockNodegetPathCross(MethodNode mth, BlockNode b1, BlockNode b2)static @Nullable BlockNodegetPathCross(MethodNode mth, java.util.Collection<BlockNode> blocks)Return common cross block for input set.static @Nullable BlockNodegetPrevBlock(BlockNode block)static @Nullable BlockNodegetPrevBlockOnPath(MethodNode mth, BlockNode block, BlockNode pathStart)Return predecessor on path from 'pathStart' blockstatic BlockNodegetTopBlock(java.util.List<BlockNode> blocks)static BlockNodegetTopSplitterForHandler(BlockNode handlerBlock)static booleaninsertAfterInsn(BlockNode block, InsnNode insn, InsnNode newInsn)static booleaninsertBeforeInsn(BlockNode block, InsnNode insn, InsnNode newInsn)static booleanisAllBlocksEmpty(java.util.List<BlockNode> blocks)static booleanisAllPathExists(java.util.Collection<BlockNode> startBlocks, BlockNode end)Check if exist path from every startBlocks to endstatic booleanisAnyPathExists(BlockNode start, BlockNode end)static booleanisBackEdge(BlockNode from, BlockNode to)static booleanisDuplicateBlockPath(BlockNode first, BlockNode second)static booleanisEmptySimplePath(BlockNode start, BlockNode end)Return true if on path from start to end no instructions and no branches.static booleanisEqualPaths(BlockNode b1, BlockNode b2)static booleanisEqualReturnBlocks(BlockNode b1, BlockNode b2)static booleanisExceptionHandlerPath(BlockNode b)static booleanisExitBlock(BlockNode block)static booleanisExitBlock(MethodNode mth, BlockNode block)static booleanisFirstInsn(MethodNode mth, InsnNode insn)static booleanisFollowBackEdge(BlockNode block)static booleanisOnlyOnePathExists(BlockNode start, BlockNode end)static booleanisPathExists(BlockNode start, BlockNode end)static booleanisSameInsnsBlocks(BlockNode first, BlockNode second)static java.util.BitSetnewBlocksBitSet(MethodNode mth)static voidreplaceInsn(MethodNode mth, BlockNode block, int i, InsnNode insn)Replace insn by index i in block, for proper copy attributes, assume attributes are not overlapstatic booleanreplaceInsn(MethodNode mth, BlockNode block, InsnNode oldInsn, InsnNode newInsn)static booleanreplaceInsn(MethodNode mth, InsnNode oldInsn, InsnNode newInsn)static BlockNodesearchBlockWithPhi(MethodNode mth, PhiInsn insn)static InsnNodesearchInsnParent(MethodNode mth, InsnNode insn)static InsnArgsearchWrappedInsnParent(MethodNode mth, InsnNode insn)static BlockNodeselectOther(BlockNode node, java.util.List<BlockNode> blocks)static BlockNodeselectOtherSafe(BlockNode node, java.util.List<BlockNode> blocks)static voidskipPredSyntheticPaths(BlockNode block)Set 'SKIP' flag for all synthetic predecessors from start block.static BlockNodeskipSyntheticPredecessor(BlockNode block)Return predecessor of synthetic block or same block otherwise.static BlockNodetraverseWhileDominates(BlockNode dom, BlockNode start)Search for first node which not dominated by dom, starting from startstatic voidvisitBlocksOnEmptyPath(BlockNode start, java.util.function.Consumer<BlockNode> visitor)static booleanvisitBlocksOnPath(MethodNode mth, BlockNode start, BlockNode end, java.util.function.Consumer<BlockNode> visitor)Visit blocks on any path from start to end.static voidvisitDFS(MethodNode mth, java.util.function.Consumer<BlockNode> visitor)static voidvisitPredecessorsUntil(MethodNode mth, BlockNode start, java.util.function.Predicate<BlockNode> visitor)static voidvisitReverseDFS(MethodNode mth, java.util.function.Consumer<BlockNode> visitor)static voidvisitSinglePath(BlockNode startBlock, java.util.function.Consumer<BlockNode> visitor)Visit blocks on path without branching or merging paths.
-
-
-
Method Detail
-
getBlockByOffset
public static BlockNode getBlockByOffset(int offset, java.lang.Iterable<BlockNode> casesBlocks)
-
selectOtherSafe
public static BlockNode selectOtherSafe(BlockNode node, java.util.List<BlockNode> blocks)
-
isExceptionHandlerPath
public static boolean isExceptionHandlerPath(BlockNode b)
-
cleanBitSet
public static void cleanBitSet(MethodNode mth, java.util.BitSet bs)
Remove exception handlers from block nodes bitset
-
isFollowBackEdge
public static boolean isFollowBackEdge(BlockNode block)
-
blockContains
public static boolean blockContains(BlockNode block, InsnNode insn)
Check if instruction contains in block (use == for comparison, not equals)
-
checkFirstInsn
public static boolean checkFirstInsn(IBlock block, java.util.function.Predicate<InsnNode> predicate)
-
getLastInsnWithType
public static InsnNode getLastInsnWithType(IBlock block, InsnType expectedType)
-
getFirstSourceLine
public static int getFirstSourceLine(IBlock block)
-
getFirstInsn
@Nullable public static @Nullable InsnNode getFirstInsn(@Nullable @Nullable IBlock block)
-
getLastInsn
@Nullable public static @Nullable InsnNode getLastInsn(@Nullable @Nullable IBlock block)
-
isExitBlock
public static boolean isExitBlock(MethodNode mth, BlockNode block)
-
isExitBlock
public static boolean isExitBlock(BlockNode block)
-
containsExitInsn
public static boolean containsExitInsn(IBlock block)
-
getBlockByInsn
@Nullable public static @Nullable BlockNode getBlockByInsn(MethodNode mth, @Nullable @Nullable InsnNode insn)
-
getBlockByInsn
@Nullable public static @Nullable BlockNode getBlockByInsn(MethodNode mth, @Nullable @Nullable InsnNode insn, java.util.List<BlockNode> blocks)
-
searchBlockWithPhi
public static BlockNode searchBlockWithPhi(MethodNode mth, PhiInsn insn)
-
searchInsnParent
public static InsnNode searchInsnParent(MethodNode mth, InsnNode insn)
-
searchWrappedInsnParent
public static InsnArg searchWrappedInsnParent(MethodNode mth, InsnNode insn)
-
newBlocksBitSet
public static java.util.BitSet newBlocksBitSet(MethodNode mth)
-
copyBlocksBitSet
public static java.util.BitSet copyBlocksBitSet(MethodNode mth, java.util.BitSet bitSet)
-
blocksToBitSet
public static java.util.BitSet blocksToBitSet(MethodNode mth, java.util.Collection<BlockNode> blocks)
-
bitSetToOneBlock
@Nullable public static @Nullable BlockNode bitSetToOneBlock(MethodNode mth, java.util.BitSet bs)
-
bitSetToBlocks
public static java.util.List<BlockNode> bitSetToBlocks(MethodNode mth, java.util.BitSet bs)
-
forEachBlockFromBitSet
public static void forEachBlockFromBitSet(MethodNode mth, java.util.BitSet bs, java.util.function.Consumer<BlockNode> consumer)
-
getNextBlock
@Nullable public static @Nullable BlockNode getNextBlock(BlockNode block)
Return first successor which not exception handler and not follow loop back edge
-
getNextBlockToPath
public static BlockNode getNextBlockToPath(BlockNode block, BlockNode pathEnd)
Return successor on path to 'pathEnd' block
-
getPrevBlockOnPath
@Nullable public static @Nullable BlockNode getPrevBlockOnPath(MethodNode mth, BlockNode block, BlockNode pathStart)
Return predecessor on path from 'pathStart' block
-
visitBlocksOnPath
public static boolean visitBlocksOnPath(MethodNode mth, BlockNode start, BlockNode end, java.util.function.Consumer<BlockNode> visitor)
Visit blocks on any path from start to end. Only one path will be visited!
-
collectAllSuccessors
public static java.util.List<BlockNode> collectAllSuccessors(MethodNode mth, BlockNode startBlock, boolean clean)
-
visitDFS
public static void visitDFS(MethodNode mth, java.util.function.Consumer<BlockNode> visitor)
-
visitReverseDFS
public static void visitReverseDFS(MethodNode mth, java.util.function.Consumer<BlockNode> visitor)
-
collectPredecessors
public static java.util.List<BlockNode> collectPredecessors(MethodNode mth, BlockNode start, java.util.Collection<BlockNode> stopBlocks)
-
visitPredecessorsUntil
public static void visitPredecessorsUntil(MethodNode mth, BlockNode start, java.util.function.Predicate<BlockNode> visitor)
-
getAllPathsBlocks
public static java.util.Set<BlockNode> getAllPathsBlocks(BlockNode start, BlockNode end)
Collect blocks from all possible execution paths from 'start' to 'end'
-
atLeastOnePathExists
public static boolean atLeastOnePathExists(java.util.Collection<BlockNode> startBlocks, BlockNode end)
Search at least one path from startBlocks to end
-
isAllPathExists
public static boolean isAllPathExists(java.util.Collection<BlockNode> startBlocks, BlockNode end)
Check if exist path from every startBlocks to end
-
getBottomBlock
@Nullable public static @Nullable BlockNode getBottomBlock(java.util.List<BlockNode> blocks)
Search last block in control flow graph from input set.
-
traverseWhileDominates
public static BlockNode traverseWhileDominates(BlockNode dom, BlockNode start)
Search for first node which not dominated by dom, starting from start
-
getCommonDominator
@Nullable public static @Nullable BlockNode getCommonDominator(MethodNode mth, java.util.List<BlockNode> blocks)
Search the lowest common ancestor in dominator tree for input set.
-
getPathCross
@Nullable public static @Nullable BlockNode getPathCross(MethodNode mth, java.util.Collection<BlockNode> blocks)
Return common cross block for input set.- Returns:
- could be one of the giving blocks. null if cross is a method exit block.
-
getPathCross
public static BlockNode getPathCross(MethodNode mth, BlockNode b1, BlockNode b2)
-
collectBlocksDominatedBy
public static java.util.List<BlockNode> collectBlocksDominatedBy(MethodNode mth, BlockNode dominator, BlockNode start)
Collect all block dominated by 'dominator', starting from 'start'
-
collectBlocksDominatedByWithExcHandlers
public static java.util.Set<BlockNode> collectBlocksDominatedByWithExcHandlers(MethodNode mth, BlockNode dominator, BlockNode start)
Collect all block dominated by 'dominator', starting from 'start', including exception handlers
-
visitSinglePath
public static void visitSinglePath(BlockNode startBlock, java.util.function.Consumer<BlockNode> visitor)
Visit blocks on path without branching or merging paths.
-
getNextSinglePathBlock
@Nullable public static @Nullable BlockNode getNextSinglePathBlock(BlockNode block)
-
skipPredSyntheticPaths
public static void skipPredSyntheticPaths(BlockNode block)
Set 'SKIP' flag for all synthetic predecessors from start block.
-
followEmptyPath
public static BlockNode followEmptyPath(BlockNode start)
Follow empty blocks and return end of path block (first not empty). Return start block if no such path.
-
visitBlocksOnEmptyPath
public static void visitBlocksOnEmptyPath(BlockNode start, java.util.function.Consumer<BlockNode> visitor)
-
isEmptySimplePath
public static boolean isEmptySimplePath(BlockNode start, BlockNode end)
Return true if on path from start to end no instructions and no branches.
-
skipSyntheticPredecessor
public static BlockNode skipSyntheticPredecessor(BlockNode block)
Return predecessor of synthetic block or same block otherwise.
-
isAllBlocksEmpty
public static boolean isAllBlocksEmpty(java.util.List<BlockNode> blocks)
-
collectAllInsns
public static java.util.List<InsnNode> collectAllInsns(java.util.List<BlockNode> blocks)
-
collectInsnsWithLimit
public static java.util.List<InsnNode> collectInsnsWithLimit(java.util.List<BlockNode> blocks, int limit)
Return limited number of instructions from method. Return empty list if method contains more than limit.
-
getOnlyOneInsnFromMth
@Nullable public static @Nullable InsnNode getOnlyOneInsnFromMth(MethodNode mth)
Return insn if it is only one instruction in this method. Return null otherwise.
-
isFirstInsn
public static boolean isFirstInsn(MethodNode mth, InsnNode insn)
-
replaceInsn
public 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
-
replaceInsn
public static boolean replaceInsn(MethodNode mth, BlockNode block, InsnNode oldInsn, InsnNode newInsn)
-
insertBeforeInsn
public static boolean insertBeforeInsn(BlockNode block, InsnNode insn, InsnNode newInsn)
-
insertAfterInsn
public static boolean insertAfterInsn(BlockNode block, InsnNode insn, InsnNode newInsn)
-
replaceInsn
public static boolean replaceInsn(MethodNode mth, InsnNode oldInsn, InsnNode newInsn)
-
getBlockWithFlag
@Nullable public static @Nullable BlockNode getBlockWithFlag(java.util.List<BlockNode> blocks, AFlag flag)
-
getCatchAttrForInsn
@Nullable public static @Nullable CatchAttr getCatchAttrForInsn(MethodNode mth, InsnNode insn)
-
-