public SubroutineInfo(final ControlFlowNode entryNode, final List<ControlFlowNode> contents, final ControlFlowGraph cfg) { this.start = entryNode.getStart(); this.end = last(contents).getEnd(); this.entryNode = entryNode; this.contents = contents; this.cfg = cfg; for (final ControlFlowNode node : contents) { if (node.getNodeType() == ControlFlowNodeType.Normal && node.getEnd().getOpCode().isReturnFromSubroutine()) { this.exitNodes.add(node); } } } }
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); } } }
public SubroutineInfo(final ControlFlowNode entryNode, final List<ControlFlowNode> contents, final ControlFlowGraph cfg) { this.start = entryNode.getStart(); this.end = last(contents).getEnd(); this.entryNode = entryNode; this.contents = contents; this.cfg = cfg; for (final ControlFlowNode node : contents) { if (node.getNodeType() == ControlFlowNodeType.Normal && node.getEnd().getOpCode().isReturnFromSubroutine()) { this.exitNodes.add(node); } } } }
public SubroutineInfo(final ControlFlowNode entryNode, final List<ControlFlowNode> contents, final ControlFlowGraph cfg) { this.start = entryNode.getStart(); this.end = last(contents).getEnd(); this.entryNode = entryNode; this.contents = contents; this.cfg = cfg; for (final ControlFlowNode node : contents) { if (node.getNodeType() == ControlFlowNodeType.Normal && node.getEnd().getOpCode().isReturnFromSubroutine()) { this.exitNodes.add(node); } } } }
private static Map<Instruction, ControlFlowNode> createNodeMap(final ControlFlowGraph cfg) { final Map<Instruction, ControlFlowNode> nodeMap = new IdentityHashMap<>(); for (final ControlFlowNode node : cfg.getNodes()) { if (node.getNodeType() != ControlFlowNodeType.Normal) { continue; } for (Instruction p = node.getStart(); p != null && p.getOffset() < node.getEnd().getEndOffset(); p = p.getNext()) { nodeMap.put(p, node); } } return nodeMap; }
private static Map<Instruction, ControlFlowNode> createNodeMap(final ControlFlowGraph cfg) { final Map<Instruction, ControlFlowNode> nodeMap = new IdentityHashMap<>(); for (final ControlFlowNode node : cfg.getNodes()) { if (node.getNodeType() != ControlFlowNodeType.Normal) { continue; } for (Instruction p = node.getStart(); p != null && p.getOffset() < node.getEnd().getEndOffset(); p = p.getNext()) { nodeMap.put(p, node); } } return nodeMap; }
private static Map<Instruction, ControlFlowNode> createNodeMap(final ControlFlowGraph cfg) { final Map<Instruction, ControlFlowNode> nodeMap = new IdentityHashMap<>(); for (final ControlFlowNode node : cfg.getNodes()) { if (node.getNodeType() != ControlFlowNodeType.Normal) { continue; } for (Instruction p = node.getStart(); p != null && p.getOffset() < node.getEnd().getEndOffset(); p = p.getNext()) { nodeMap.put(p, node); } } return nodeMap; }
private ControlFlowNode findNode(final Instruction instruction) { final int offset = instruction.getOffset(); for (final ControlFlowNode node : _nodes) { if (node.getNodeType() != ControlFlowNodeType.Normal) { continue; } if (offset >= node.getStart().getOffset() && offset < node.getEnd().getEndOffset()) { return node; } } return null; }
private ControlFlowNode findNode(final Instruction instruction) { final int offset = instruction.getOffset(); for (final ControlFlowNode node : _nodes) { if (node.getNodeType() != ControlFlowNodeType.Normal) { continue; } if (offset >= node.getStart().getOffset() && offset < node.getEnd().getEndOffset()) { return node; } } return null; }
private ControlFlowNode findNode(final Instruction instruction) { final int offset = instruction.getOffset(); for (final ControlFlowNode node : _nodes) { if (node.getNodeType() != ControlFlowNodeType.Normal) { continue; } if (offset >= node.getStart().getOffset() && offset < node.getEnd().getEndOffset()) { return node; } } return null; }
@Override public boolean test(final ControlFlowNode node) { return node.getNodeType() == ControlFlowNodeType.Normal && instruction.getOffset() >= node.getStart().getOffset() && instruction.getOffset() < node.getEnd().getEndOffset(); } }
@Override public boolean test(final ControlFlowNode node) { return node.getNodeType() == ControlFlowNodeType.Normal && instruction.getOffset() >= node.getStart().getOffset() && instruction.getOffset() < node.getEnd().getEndOffset(); } }
@Override public boolean test(final ControlFlowNode node) { return node.getNodeType() == ControlFlowNodeType.Normal && instruction.getOffset() >= node.getStart().getOffset() && instruction.getOffset() < node.getEnd().getEndOffset(); } }
private static ControlFlowNode findNode(final ControlFlowGraph cfg, final Instruction instruction) { final int offset = instruction.getOffset(); for (final ControlFlowNode node : cfg.getNodes()) { if (node.getNodeType() != ControlFlowNodeType.Normal) { continue; } if (offset >= node.getStart().getOffset() && offset < node.getEnd().getEndOffset()) { return node; } } return null; }
private static ControlFlowNode findNode(final ControlFlowGraph cfg, final Instruction instruction) { final int offset = instruction.getOffset(); for (final ControlFlowNode node : cfg.getNodes()) { if (node.getNodeType() != ControlFlowNodeType.Normal) { continue; } if (offset >= node.getStart().getOffset() && offset < node.getEnd().getEndOffset()) { return node; } } return null; }
private static ControlFlowNode findNode(final ControlFlowGraph cfg, final Instruction instruction) { final int offset = instruction.getOffset(); for (final ControlFlowNode node : cfg.getNodes()) { if (node.getNodeType() != ControlFlowNodeType.Normal) { continue; } if (offset >= node.getStart().getOffset() && offset < node.getEnd().getEndOffset()) { return node; } } return null; }
private static boolean shouldIncludeExceptionalExit( final ControlFlowGraph cfg, final ControlFlowNode head, final ControlFlowNode node) { if (node.getNodeType() != ControlFlowNodeType.Normal) { return false; } if (!node.getDominanceFrontier().contains(cfg.getExceptionalExit()) && !node.dominates(cfg.getExceptionalExit())) { final ControlFlowNode innermostHandlerNode = findInnermostExceptionHandlerNode(cfg, node.getEnd().getOffset(), false); if (innermostHandlerNode == null || !node.getDominanceFrontier().contains(innermostHandlerNode)) { return false; } } return head.getNodeType() == ControlFlowNodeType.Normal && node.getNodeType() == ControlFlowNodeType.Normal && node.getStart().getNext() == node.getEnd() && head.getStart().getOpCode().isStore() && node.getStart().getOpCode().isLoad() && node.getEnd().getOpCode() == OpCode.ATHROW && InstructionHelper.getLoadOrStoreSlot(head.getStart()) == InstructionHelper.getLoadOrStoreSlot(node.getStart()); }
private static boolean shouldIncludeExceptionalExit( final ControlFlowGraph cfg, final ControlFlowNode head, final ControlFlowNode node) { if (node.getNodeType() != ControlFlowNodeType.Normal) { return false; } if (!node.getDominanceFrontier().contains(cfg.getExceptionalExit()) && !node.dominates(cfg.getExceptionalExit())) { final ControlFlowNode innermostHandlerNode = findInnermostExceptionHandlerNode(cfg, node.getEnd().getOffset(), false); if (innermostHandlerNode == null || !node.getDominanceFrontier().contains(innermostHandlerNode)) { return false; } } return head.getNodeType() == ControlFlowNodeType.Normal && node.getNodeType() == ControlFlowNodeType.Normal && node.getStart().getNext() == node.getEnd() && head.getStart().getOpCode().isStore() && node.getStart().getOpCode().isLoad() && node.getEnd().getOpCode() == OpCode.ATHROW && InstructionHelper.getLoadOrStoreSlot(head.getStart()) == InstructionHelper.getLoadOrStoreSlot(node.getStart()); }
private static boolean shouldIncludeExceptionalExit(final ControlFlowGraph cfg, final ControlFlowNode head, final ControlFlowNode node) { if (node.getNodeType() != ControlFlowNodeType.Normal) { return false; } if (!node.getDominanceFrontier().contains(cfg.getExceptionalExit()) && !node.dominates(cfg.getExceptionalExit())) { final ControlFlowNode innermostHandlerNode = findInnermostExceptionHandlerNode(cfg, node.getStart().getOffset()); if (innermostHandlerNode == null || !node.getDominanceFrontier().contains(innermostHandlerNode)) { return false; } } if (node.getStart().getNext() != node.getEnd()) { return false; } if (head.getStart().getOpCode().isStore() && node.getStart().getOpCode().isLoad() && node.getEnd().getOpCode() == OpCode.ATHROW) { return InstructionHelper.getLoadOrStoreSlot(head.getStart()) == InstructionHelper.getLoadOrStoreSlot(node.getStart()); } return false; }
private static boolean shouldIncludeExceptionalExit(final ControlFlowGraph cfg, final ControlFlowNode head, final ControlFlowNode node) { if (node.getNodeType() != ControlFlowNodeType.Normal) { return false; } if (!node.getDominanceFrontier().contains(cfg.getExceptionalExit()) && !node.dominates(cfg.getExceptionalExit())) { final ControlFlowNode innermostHandlerNode = findInnermostExceptionHandlerNode(cfg, node.getStart().getOffset()); if (innermostHandlerNode == null || !node.getDominanceFrontier().contains(innermostHandlerNode)) { return false; } } if (node.getStart().getNext() != node.getEnd()) { return false; } if (head.getStart().getOpCode().isStore() && node.getStart().getOpCode().isLoad() && node.getEnd().getOpCode() == OpCode.ATHROW) { return InstructionHelper.getLoadOrStoreSlot(head.getStart()) == InstructionHelper.getLoadOrStoreSlot(node.getStart()); } return false; }