private boolean collectBlocks(CFG.Block block, Map<Tree, CFGLoop> container, Set<CFG.Block> visitedBlocks) { if (blocks.contains(block)) { return true; } if (block.id() == startingBlock.id() || !visitedBlocks.add(block)) { return false; } boolean answer = returnsToStart(block, container, visitedBlocks); if (answer || isBreak(block)) { blocks.add(block); } return answer; }
private boolean collectBlocks(CFG.Block block, Map<Tree, CFGLoop> container, Set<CFG.Block> visitedBlocks) { if (blocks.contains(block)) { return true; } if (block.id() == startingBlock.id() || !visitedBlocks.add(block)) { return false; } boolean answer = returnsToStart(block, container, visitedBlocks); if (answer || isBreak(block)) { blocks.add(block); } return answer; }
private boolean returnsToStart(CFG.Block block, Map<Tree, CFGLoop> container, Set<CFG.Block> visitedBlocks) { Set<Block> localSuccessors = localSuccessors(block, container); if (localSuccessors == null) { return true; } boolean answer = false; for (CFG.Block successor : localSuccessors) { if (startingBlock.id() == successor.id()) { answer = true; } else { answer |= collectBlocks(successor, container, visitedBlocks); } } return answer; }
@Override public String toString() { return "B" + programPoint.block.id() + "." + programPoint.i + ": " + programState; } }
@Override public int hashCode() { if(hashcode == 0) { hashcode = block.id() * 31 + i; } return hashcode; }
private boolean returnsToStart(CFG.Block block, Map<Tree, CFGLoop> container, Set<CFG.Block> visitedBlocks) { Set<Block> localSuccessors = localSuccessors(block, container); if (localSuccessors == null) { return true; } boolean answer = false; for (CFG.Block successor : localSuccessors) { if (startingBlock.id() == successor.id()) { answer = true; } else { answer |= collectBlocks(successor, container, visitedBlocks); } } return answer; }