private ControlFlowEdge createEdge(final ControlFlowNode fromNode, final ControlFlowNode toNode, final JumpType type) { final ControlFlowEdge edge = new ControlFlowEdge(fromNode, toNode, type); fromNode.getOutgoing().add(edge); toNode.getIncoming().add(edge); return edge; }
private ControlFlowEdge createEdge(final ControlFlowNode fromNode, final ControlFlowNode toNode, final JumpType type) { final ControlFlowEdge edge = new ControlFlowEdge(fromNode, toNode, type); fromNode.getOutgoing().add(edge); toNode.getIncoming().add(edge); return edge; }
private ControlFlowEdge createEdge(final ControlFlowNode fromNode, final ControlFlowNode toNode, final JumpType type) { final ControlFlowEdge edge = new ControlFlowEdge(fromNode, toNode, type); fromNode.getOutgoing().add(edge); toNode.getIncoming().add(edge); return edge; }
private static boolean hasSingleEdgeEnteringBlock(final ControlFlowNode node) { int count = 0; for (final ControlFlowEdge edge : node.getIncoming()) { if (!node.dominates(edge.getSource())) { if (++count > 1) { return false; } } } return count == 1; }
private static boolean hasSingleEdgeEnteringBlock(final ControlFlowNode node) { int count = 0; for (final ControlFlowEdge edge : node.getIncoming()) { if (!node.dominates(edge.getSource())) { if (++count > 1) { return false; } } } return count == 1; }
private static boolean hasSingleEdgeEnteringBlock(final ControlFlowNode node) { int count = 0; for (final ControlFlowEdge edge : node.getIncoming()) { if (!node.dominates(edge.getSource())) { if (++count > 1) { return false; } } } return count == 1; }
private LoopExitInfo findLoopExitInfo(final Set<ControlFlowNode> contents) { final LoopExitInfo exitInfo = new LoopExitInfo(); boolean noCommonExit = false; for (final ControlFlowNode node : contents) { final BasicBlock basicBlock = (BasicBlock) node.getUserData(); for (final Expression e : basicBlock.getSelfAndChildrenRecursive(Expression.class)) { for (final Label target : e.getBranchTargets()) { final ControlFlowNode targetNode = labelsToNodes.get(target); if (targetNode == null || contents.contains(targetNode)) { continue; } if (targetNode.getIncoming().size() == 1) { exitInfo.additionalNodes.add(targetNode); } else if (exitInfo.exitLabel == null) { exitInfo.exitLabel = target; } else if (exitInfo.exitLabel != target) { noCommonExit = true; } } } } if (noCommonExit) { exitInfo.exitLabel = null; } return exitInfo; }
private LoopExitInfo findLoopExitInfo(final Set<ControlFlowNode> contents) { final LoopExitInfo exitInfo = new LoopExitInfo(); boolean noCommonExit = false; for (final ControlFlowNode node : contents) { final BasicBlock basicBlock = (BasicBlock) node.getUserData(); for (final Expression e : basicBlock.getSelfAndChildrenRecursive(Expression.class)) { for (final Label target : e.getBranchTargets()) { final ControlFlowNode targetNode = labelsToNodes.get(target); if (targetNode == null || contents.contains(targetNode)) { continue; } if (targetNode.getIncoming().size() == 1) { exitInfo.additionalNodes.add(targetNode); } else if (exitInfo.exitLabel == null) { exitInfo.exitLabel = target; } else if (exitInfo.exitLabel != target) { noCommonExit = true; } } } } if (noCommonExit) { exitInfo.exitLabel = null; } return exitInfo; }
private LoopExitInfo findLoopExitInfo(final Set<ControlFlowNode> contents) { final LoopExitInfo exitInfo = new LoopExitInfo(); boolean noCommonExit = false; for (final ControlFlowNode node : contents) { final BasicBlock basicBlock = (BasicBlock) node.getUserData(); for (final Expression e : basicBlock.getSelfAndChildrenRecursive(Expression.class)) { for (final Label target : e.getBranchTargets()) { final ControlFlowNode targetNode = labelsToNodes.get(target); if (targetNode == null || contents.contains(targetNode)) { continue; } if (targetNode.getIncoming().size() == 1) { exitInfo.additionalNodes.add(targetNode); } else if (exitInfo.exitLabel == null) { exitInfo.exitLabel = target; } else if (exitInfo.exitLabel != target) { noCommonExit = true; } } } } if (noCommonExit) { exitInfo.exitLabel = null; } return exitInfo; }
private ControlFlowEdge createEdge(final ControlFlowNode fromNode, final ControlFlowNode toNode, final JumpType type) { final ControlFlowEdge edge = new ControlFlowEdge(fromNode, toNode, type); for (final ControlFlowEdge existingEdge : fromNode.getOutgoing()) { if (existingEdge.getSource() == fromNode && existingEdge.getTarget() == toNode && existingEdge.getType() == type) { return existingEdge; } } fromNode.getOutgoing().add(edge); toNode.getIncoming().add(edge); return edge; }
private ControlFlowEdge createEdge(final ControlFlowNode fromNode, final ControlFlowNode toNode, final JumpType type) { final ControlFlowEdge edge = new ControlFlowEdge(fromNode, toNode, type); for (final ControlFlowEdge existingEdge : fromNode.getOutgoing()) { if (existingEdge.getSource() == fromNode && existingEdge.getTarget() == toNode && existingEdge.getType() == type) { return existingEdge; } } fromNode.getOutgoing().add(edge); toNode.getIncoming().add(edge); return edge; }
private ControlFlowEdge createEdge(final ControlFlowNode fromNode, final ControlFlowNode toNode, final JumpType type) { final ControlFlowEdge edge = new ControlFlowEdge(fromNode, toNode, type); for (final ControlFlowEdge existingEdge : fromNode.getOutgoing()) { if (existingEdge.getSource() == fromNode && existingEdge.getTarget() == toNode && existingEdge.getType() == type) { return existingEdge; } } fromNode.getOutgoing().add(edge); toNode.getIncoming().add(edge); return edge; }
entryNode.getIncoming().add(entryEdge); if (!destination.getIncoming().contains(edge)) { destination.getIncoming().add(edge);
entryNode.getIncoming().add(entryEdge); if (!destination.getIncoming().contains(edge)) { destination.getIncoming().add(edge);
entryNode.getIncoming().add(entryEdge); if (!destination.getIncoming().contains(edge)) { destination.getIncoming().add(edge);
private void copyFinallyBlocksIntoLeaveEdges() { // // Step 5b: Copy finally blocks into the LeaveTry edges. // for (int n = _nodes.size(), i = n - 1; i >= 0; i--) { final ControlFlowNode node = _nodes.get(i); final Instruction end = node.getEnd(); if (end != null && node.getOutgoing().size() == 1 && node.getOutgoing().get(0).getType() == JumpType.LeaveTry) { assert end.getOpCode() == OpCode.GOTO || end.getOpCode() == OpCode.GOTO_W; final ControlFlowEdge edge = node.getOutgoing().get(0); final ControlFlowNode target = edge.getTarget(); target.getIncoming().remove(edge); node.getOutgoing().clear(); final ControlFlowNode handler = findInnermostExceptionHandlerNode(end.getEndOffset()); assert handler.getNodeType() == ControlFlowNodeType.FinallyHandler; final ControlFlowNode copy = copyFinallySubGraph(handler, handler.getEndFinallyNode(), target); createEdge(node, copy, JumpType.Normal); } } }
private void copyFinallyBlocksIntoLeaveEdges() { // // Step 5b: Copy finally blocks into the LeaveTry edges. // for (int n = _nodes.size(), i = n - 1; i >= 0; i--) { final ControlFlowNode node = _nodes.get(i); final Instruction end = node.getEnd(); if (end != null && node.getOutgoing().size() == 1 && node.getOutgoing().get(0).getType() == JumpType.LeaveTry) { assert end.getOpCode() == OpCode.GOTO || end.getOpCode() == OpCode.GOTO_W; final ControlFlowEdge edge = node.getOutgoing().get(0); final ControlFlowNode target = edge.getTarget(); target.getIncoming().remove(edge); node.getOutgoing().clear(); final ControlFlowNode handler = findInnermostExceptionHandlerNode(end.getEndOffset()); assert handler.getNodeType() == ControlFlowNodeType.FinallyHandler; final ControlFlowNode copy = copyFinallySubGraph(handler, handler.getEndFinallyNode(), target); createEdge(node, copy, JumpType.Normal); } } }
private void copyFinallyBlocksIntoLeaveEdges() { // // Step 5b: Copy finally blocks into the LeaveTry edges. // for (int n = _nodes.size(), i = n - 1; i >= 0; i--) { final ControlFlowNode node = _nodes.get(i); final Instruction end = node.getEnd(); if (end != null && node.getOutgoing().size() == 1 && node.getOutgoing().get(0).getType() == JumpType.LeaveTry) { assert end.getOpCode() == OpCode.GOTO || end.getOpCode() == OpCode.GOTO_W; final ControlFlowEdge edge = node.getOutgoing().get(0); final ControlFlowNode target = edge.getTarget(); target.getIncoming().remove(edge); node.getOutgoing().clear(); final ControlFlowNode handler = findInnermostExceptionHandlerNode(end.getEndOffset()); assert handler.getNodeType() == ControlFlowNodeType.FinallyHandler; final ControlFlowNode copy = copyFinallySubGraph(handler, handler.getEndFinallyNode(), target); createEdge(node, copy, JumpType.Normal); } } }
output.writeLine("];"); edges.addAll(node.getIncoming()); edges.addAll(node.getOutgoing()); output.writeLine("];"); edges.addAll(endFinallyNode.getIncoming()); edges.addAll(endFinallyNode.getOutgoing());
output.writeLine("];"); edges.addAll(node.getIncoming()); edges.addAll(node.getOutgoing()); output.writeLine("];"); edges.addAll(endFinallyNode.getIncoming()); edges.addAll(endFinallyNode.getOutgoing());