@Override public boolean test(final HandlerInfo o) { return o.handlerNode.getEndFinallyNode() == edge.getSource(); } }
@Override public boolean test(final HandlerInfo o) { return o.handlerNode.getEndFinallyNode() == edge.getSource(); } }
@Override public boolean test(final HandlerInfo o) { return o.handlerNode.getEndFinallyNode() == edge.getSource(); } }
private void collectNodes(final ControlFlowNode node) { if (node == end || node == newEnd) { throw new IllegalStateException("Unexpected cycle involving finally constructs!"); } if (oldToNew.containsKey(node)) { return; } final int newBlockIndex = _nodes.size(); final ControlFlowNode copy; switch (node.getNodeType()) { case Normal: copy = new ControlFlowNode(newBlockIndex, node.getStart(), node.getEnd()); break; case FinallyHandler: copy = new ControlFlowNode(newBlockIndex, node.getExceptionHandler(), node.getEndFinallyNode()); break; default: throw ContractUtils.unsupported(); } copy.setCopyFrom(node); _nodes.add(copy); oldToNew.put(node, copy); if (node != start) { for (final ControlFlowNode predecessor : node.getPredecessors()) { collectNodes(predecessor); } } }
terminals.add(handlerNode.getEndFinallyNode());
terminals.add(handlerNode.getEndFinallyNode());
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 collectNodes(final ControlFlowNode node) { if (node == end || node == newEnd) { throw new IllegalStateException("Unexpected cycle involving finally constructs!"); } if (oldToNew.containsKey(node)) { return; } final int newBlockIndex = _nodes.size(); final ControlFlowNode copy; switch (node.getNodeType()) { case Normal: copy = new ControlFlowNode(newBlockIndex, node.getStart(), node.getEnd()); break; case FinallyHandler: copy = new ControlFlowNode(newBlockIndex, node.getExceptionHandler(), node.getEndFinallyNode()); break; default: throw ContractUtils.unsupported(); } copy.setCopyFrom(node); _nodes.add(copy); oldToNew.put(node, copy); if (node != start) { for (final ControlFlowNode predecessor : node.getPredecessors()) { collectNodes(predecessor); } } }
private void collectNodes(final ControlFlowNode node) { if (node == end || node == newEnd) { throw new IllegalStateException("Unexpected cycle involving finally constructs!"); } if (oldToNew.containsKey(node)) { return; } final int newBlockIndex = _nodes.size(); final ControlFlowNode copy; switch (node.getNodeType()) { case Normal: copy = new ControlFlowNode(newBlockIndex, node.getStart(), node.getEnd()); break; case FinallyHandler: copy = new ControlFlowNode(newBlockIndex, node.getExceptionHandler(), node.getEndFinallyNode()); break; default: throw ContractUtils.unsupported(); } copy.setCopyFrom(node); _nodes.add(copy); oldToNew.put(node, copy); if (node != start) { for (final ControlFlowNode predecessor : node.getPredecessors()) { collectNodes(predecessor); } } }
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); } } }
final ControlFlowNode handlerBlock = findInnermostFinallyBlock(end.getOffset()); if (handlerBlock.getEndFinallyNode() != null) { createEdge(node, handlerBlock.getEndFinallyNode(), JumpType.Normal); if (handlerBlock.getEndFinallyNode() == null) { handlerBlock = findInnermostFinallyHandlerNode( handlerBlock.getExceptionHandler().getTryBlock().getLastInstruction().getOffset() if (handlerBlock.getEndFinallyNode() != null) { createEdge(node, handlerBlock.getEndFinallyNode(), JumpType.LeaveTry);
final ControlFlowNode handlerBlock = findInnermostFinallyBlock(end.getOffset()); if (handlerBlock.getEndFinallyNode() != null) { createEdge(node, handlerBlock.getEndFinallyNode(), JumpType.Normal); if (handlerBlock.getEndFinallyNode() == null) { handlerBlock = findInnermostFinallyHandlerNode( handlerBlock.getExceptionHandler().getTryBlock().getLastInstruction().getOffset() if (handlerBlock.getEndFinallyNode() != null) { createEdge(node, handlerBlock.getEndFinallyNode(), JumpType.LeaveTry);
final ControlFlowNode handlerBlock = findInnermostFinallyBlock(end.getOffset()); if (handlerBlock.getEndFinallyNode() != null) { createEdge(node, handlerBlock.getEndFinallyNode(), JumpType.Normal); if (handlerBlock.getEndFinallyNode() == null) { handlerBlock = findInnermostFinallyHandlerNode( handlerBlock.getExceptionHandler().getTryBlock().getLastInstruction().getOffset() if (handlerBlock.getEndFinallyNode() != null) { createEdge(node, handlerBlock.getEndFinallyNode(), JumpType.LeaveTry);
createEdge(node, finallyBlock.getEndFinallyNode(), JumpType.Normal); createEdge(finallyBlock.getEndFinallyNode(), parentHandler, JumpType.EndFinally); createEdge(finallyBlock.getEndFinallyNode(), target, JumpType.EndFinally); finallyBlock.getEndFinallyNode(), JumpType.Normal );
edges.addAll(node.getOutgoing()); final ControlFlowNode endFinallyNode = node.getEndFinallyNode();
edges.addAll(node.getOutgoing()); final ControlFlowNode endFinallyNode = node.getEndFinallyNode();
edges.addAll(node.getOutgoing()); final ControlFlowNode endFinallyNode = node.getEndFinallyNode();
createEdge(node, handlerNode.getEndFinallyNode(), JumpType.Normal); createEdge(handlerNode.getEndFinallyNode(), target, JumpType.Normal);
createEdge(node, handlerNode.getEndFinallyNode(), JumpType.Normal); createEdge(handlerNode.getEndFinallyNode(), target, JumpType.Normal);