public void addLabeledEdge(StatEdge edge) { if (edge.closure != null) { edge.closure.getLabelEdges().remove(edge); } edge.closure = this; this.getLabelEdges().add(edge); }
public void addSuccessor(StatEdge edge) { addEdgeInternal(DIRECTION_FORWARD, edge); if (edge.closure != null) { edge.closure.getLabelEdges().add(edge); } edge.getDestination().addPredecessor(edge); }
public void removeSuccessor(StatEdge edge) { if (edge == null) { return; } removeEdgeInternal(DIRECTION_FORWARD, edge); if (edge.closure != null) { edge.closure.getLabelEdges().remove(edge); } if (edge.getDestination() != null) { // TODO: redundant? edge.getDestination().removePredecessor(edge); } }
private static LabelSets processStatementLabel(Statement stat) { LabelSets sets = new LabelSets(); if (stat.getExprents() == null) { for (Statement st : stat.getStats()) { LabelSets nested = processStatementLabel(st); sets.breaks.addAll(nested.breaks); sets.continues.addAll(nested.continues); } boolean shieldType = (stat.type == Statement.TYPE_DO || stat.type == Statement.TYPE_SWITCH); if (shieldType) { for (StatEdge edge : stat.getLabelEdges()) { if (edge.explicit && ((edge.getType() == StatEdge.TYPE_BREAK && sets.breaks.contains(edge.getSource())) || (edge.getType() == StatEdge.TYPE_CONTINUE && sets.continues.contains(edge.getSource())))) { edge.labeled = false; } } } switch (stat.type) { case Statement.TYPE_DO: sets.continues.clear(); case Statement.TYPE_SWITCH: sets.breaks.clear(); } } sets.breaks.add(stat); sets.continues.add(stat); return sets; }
edge.closure.getLabelEdges().remove(edge);
public static void lowClosures(Statement stat) { for (StatEdge edge : new ArrayList<>(stat.getLabelEdges())) { if (edge.getType() == StatEdge.TYPE_BREAK) { // FIXME: ? for (Statement st : stat.getStats()) { if (st.containsStatementStrict(edge.getSource())) { if (MergeHelper.isDirectPath(st, edge.getDestination())) { st.addLabeledEdge(edge); } } } } } for (Statement st : stat.getStats()) { lowClosures(st); } }
List<StatEdge> lst = new ArrayList<>(oldstat.getLabelEdges()); oldstat.getLabelEdges().clear();
edge.closure.getLabelEdges().remove(edge); edge.closure = null; for (StatEdge edge : new HashSet<>(st.getLabelEdges())) { if (edge.getSource() != last) { last.addLabeledEdge(edge);
stat.getLabelEdges().isEmpty()) { Statement parent = stat.getParent(); if (stat != parent.getFirst() || (parent.type != Statement.TYPE_IF &&
public void addLabeledEdge(StatEdge edge) { if (edge.closure != null) { edge.closure.getLabelEdges().remove(edge); } edge.closure = this; this.getLabelEdges().add(edge); }
public void addSuccessor(StatEdge edge) { addEdgeInternal(DIRECTION_FORWARD, edge); if (edge.closure != null) { edge.closure.getLabelEdges().add(edge); } edge.getDestination().addPredecessor(edge); }
public void removeSuccessor(StatEdge edge) { if (edge == null) { return; } removeEdgeInternal(DIRECTION_FORWARD, edge); if (edge.closure != null) { edge.closure.getLabelEdges().remove(edge); } if (edge.getDestination() != null) { // TODO: redundant? edge.getDestination().removePredecessor(edge); } }
private static HashSet<Statement>[] processStatementLabel(Statement stat) { HashSet<Statement> setBreak = new HashSet<>(); HashSet<Statement> setContinue = new HashSet<>(); if (stat.getExprents() == null) { for (Statement st : stat.getStats()) { HashSet<Statement>[] arr = processStatementLabel(st); setBreak.addAll(arr[0]); setContinue.addAll(arr[1]); } boolean shieldType = (stat.type == Statement.TYPE_DO || stat.type == Statement.TYPE_SWITCH); if (shieldType) { for (StatEdge edge : stat.getLabelEdges()) { if (edge.explicit && ((edge.getType() == StatEdge.TYPE_BREAK && setBreak.contains(edge.getSource())) || (edge.getType() == StatEdge.TYPE_CONTINUE && setContinue.contains(edge.getSource())))) { edge.labeled = false; } } } switch (stat.type) { case Statement.TYPE_DO: setContinue.clear(); case Statement.TYPE_SWITCH: setBreak.clear(); } } setBreak.add(stat); setContinue.add(stat); return new HashSet[] { setBreak, setContinue }; }
private static void eliminateLoop(Statement loop, Statement parentloop) { // move continue edges to the parent loop List<StatEdge> lst = new ArrayList<>(loop.getLabelEdges()); for (StatEdge edge : lst) { loop.removePredecessor(edge); edge.getSource().changeEdgeNode(Statement.DIRECTION_FORWARD, edge, parentloop); parentloop.addPredecessor(edge); parentloop.addLabeledEdge(edge); } // remove the last break edge, if exists Statement loopcontent = loop.getFirst(); if (!loopcontent.getAllSuccessorEdges().isEmpty()) { loopcontent.removeSuccessor(loopcontent.getAllSuccessorEdges().get(0)); } // replace loop with its content loop.getParent().replaceStatement(loop, loopcontent); } }
public static void lowClosures(Statement stat) { for (StatEdge edge : new ArrayList<>(stat.getLabelEdges())) { if (edge.getType() == StatEdge.TYPE_BREAK) { // FIXME: ? for (Statement st : stat.getStats()) { if (st.containsStatementStrict(edge.getSource())) { if (MergeHelper.isDirectPath(st, edge.getDestination())) { st.addLabeledEdge(edge); } } } } } for (Statement st : stat.getStats()) { lowClosures(st); } }
List<StatEdge> lst = new ArrayList<>(oldstat.getLabelEdges()); oldstat.getLabelEdges().clear();
private static void liftBreakLabels(Statement stat) { for (Statement st : stat.getStats()) { liftBreakLabels(st); } while (true) { boolean found = false; for (StatEdge edge : stat.getLabelEdges()) { if (edge.explicit && edge.labeled && edge.getType() == StatEdge.TYPE_BREAK) { Statement newclosure = getMaxBreakLift(stat, edge); if (newclosure != null) { newclosure.addLabeledEdge(edge); edge.labeled = isBreakEdgeLabeled(edge.getSource(), newclosure); found = true; break; } } } if (!found) { break; } } }
private static void lowBreakLabelsRec(Statement stat) { while (true) { boolean found = false; for (StatEdge edge : stat.getLabelEdges()) { if (edge.getType() == StatEdge.TYPE_BREAK) { Statement minclosure = getMinClosure(stat, edge.getSource()); if (minclosure != stat) { minclosure.addLabeledEdge(edge); edge.labeled = isBreakEdgeLabeled(edge.getSource(), minclosure); found = true; break; } } } if (!found) { break; } } for (Statement st : stat.getStats()) { lowBreakLabelsRec(st); } }
edge.closure.getLabelEdges().remove(edge); edge.closure = null; for (StatEdge edge : new HashSet<>(st.getLabelEdges())) { if (edge.getSource() != last) { last.addLabeledEdge(edge);
stat.getLabelEdges().isEmpty()) { Statement parent = stat.getParent(); if (stat != parent.getFirst() || (parent.type != Statement.TYPE_IF &&