public void replaceStatement(Statement oldstat, Statement newstat) { for (StatEdge edge : oldstat.getAllPredecessorEdges()) { oldstat.removePredecessor(edge); edge.getSource().changeEdgeNode(DIRECTION_FORWARD, edge, newstat); newstat.addPredecessor(edge); } for (StatEdge edge : oldstat.getAllSuccessorEdges()) { oldstat.removeSuccessor(edge); edge.setSource(newstat); newstat.addSuccessor(edge); } int statindex = stats.getIndexByKey(oldstat.id); stats.removeWithKey(oldstat.id); stats.addWithKeyAndIndex(statindex, newstat, newstat.id); newstat.setParent(this); newstat.post = oldstat.post; if (first == oldstat) { first = newstat; } List<StatEdge> lst = new ArrayList<StatEdge>(oldstat.getLabelEdges()); for (int i = lst.size() - 1; i >= 0; i--) { StatEdge edge = lst.get(i); if (edge.getSource() != newstat) { newstat.addLabeledEdge(edge); } else { if (this == edge.getDestination() || this.containsStatementStrict(edge.getDestination())) { edge.closure = null; } else { this.addLabeledEdge(edge); } } } oldstat.getLabelEdges().clear(); }
private static void addToReversePostOrderListIterative(Statement root, List<Statement> lst) { LinkedList<Statement> stackNode = new LinkedList<Statement>(); LinkedList<Integer> stackIndex = new LinkedList<Integer>(); HashSet<Statement> setVisited = new HashSet<Statement>(); stackNode.add(root); stackIndex.add(0); while (!stackNode.isEmpty()) { Statement node = stackNode.getLast(); int index = stackIndex.removeLast(); setVisited.add(node); List<StatEdge> lstEdges = node.getAllSuccessorEdges(); for (; index < lstEdges.size(); index++) { StatEdge edge = lstEdges.get(index); Statement succ = edge.getDestination(); if (!setVisited.contains(succ) && (edge.getType() == StatEdge.TYPE_REGULAR || edge.getType() == StatEdge.TYPE_EXCEPTION)) { // TODO: edge filter? stackIndex.add(index + 1); stackNode.add(succ); stackIndex.add(0); break; } } if (index == lstEdges.size()) { lst.add(0, node); stackNode.removeLast(); } } }