case StatEdge.TYPE_CONTINUE: if (edge.getDestination() != edge.closure) { edge.getDestination().addLabeledEdge(edge); lst.get(i - 1).addLabeledEdge(edge); break;
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); } }
StatEdge edge = lst.get(i); if (edge.getSource() != newstat) { newstat.addLabeledEdge(edge); this.addLabeledEdge(edge);
public static void replaceContinueWithBreak(Statement stat) { if (stat.type == Statement.TYPE_DO) { List<StatEdge> lst = stat.getPredecessorEdges(StatEdge.TYPE_CONTINUE); for (StatEdge edge : lst) { if (edge.explicit) { Statement minclosure = getMinContinueClosure(edge); if (minclosure != edge.closure && !InlineSingleBlockHelper.isBreakEdgeLabeled(edge.getSource(), minclosure)) { edge.getSource().changeEdgeType(Statement.DIRECTION_FORWARD, edge, StatEdge.TYPE_BREAK); edge.labeled = false; minclosure.addLabeledEdge(edge); } } } } for (Statement st : stat.getStats()) { replaceContinueWithBreak(st); } }
if (i == lst.size() - 1) { if (edge.closure == st) { stat.addLabeledEdge(edge); last.addLabeledEdge(edge);
endedge.setSource(ifelsestat); if (endedge.closure != null) { ifelsestat.getParent().addLabeledEdge(endedge);
public static void lowContinueLabels(Statement stat, HashSet<StatEdge> edges) { boolean ok = (stat.type != Statement.TYPE_DO); if (!ok) { DoStatement dostat = (DoStatement)stat; ok = dostat.getLooptype() == DoStatement.LOOP_DO || dostat.getLooptype() == DoStatement.LOOP_WHILE || (dostat.getLooptype() == DoStatement.LOOP_FOR && dostat.getIncExprent() == null); } if (ok) { edges.addAll(stat.getPredecessorEdges(StatEdge.TYPE_CONTINUE)); } if (ok && stat.type == Statement.TYPE_DO) { for (StatEdge edge : edges) { if (stat.containsStatementStrict(edge.getSource())) { edge.getDestination().removePredecessor(edge); edge.getSource().changeEdgeNode(Statement.DIRECTION_FORWARD, edge, stat); stat.addPredecessor(edge); stat.addLabeledEdge(edge); } } } for (Statement st : stat.getStats()) { if (st == stat.getFirst()) { lowContinueLabels(st, edges); } else { lowContinueLabels(st, new HashSet<>()); } } }
ifEdge.closure.addLabeledEdge(edge);
if (stat.containsStatementStrict(edge.getSource())) { edge.getSource().changeEdgeType(DIRECTION_FORWARD, edge, StatEdge.TYPE_BREAK); stat.addLabeledEdge(edge); stat.containsStatementStrict(prededge.getSource())) { prededge.getSource().changeEdgeType(DIRECTION_FORWARD, prededge, StatEdge.TYPE_CONTINUE); stat.addLabeledEdge(prededge);
sucedge.closure.addLabeledEdge(edge);
source.addPredecessor(prededge); source.addLabeledEdge(prededge);
StatEdge newexitedge = new StatEdge(StatEdge.TYPE_BREAK, bstat, oldexitedge.getDestination()); bstat.addSuccessor(newexitedge); oldexitedge.closure.addLabeledEdge(newexitedge); ret = 1; StatEdge newexitedge = new StatEdge(StatEdge.TYPE_BREAK, bstat, oldexitedge.getDestination()); bstat.addSuccessor(newexitedge); oldexitedge.closure.addLabeledEdge(newexitedge); prededge.getSource().changeEdgeNode(Statement.DIRECTION_FORWARD, prededge, stat); stat.addPredecessor(prededge); stat.addLabeledEdge(prededge); stat.addLabeledEdge(edge);
case StatEdge.TYPE_CONTINUE: if (edge.getDestination() != edge.closure) { edge.getDestination().addLabeledEdge(edge); lst.get(i - 1).addLabeledEdge(edge); break;
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); } }
StatEdge edge = lst.get(i); if (edge.getSource() != newstat) { newstat.addLabeledEdge(edge); this.addLabeledEdge(edge);
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; } } }
public static void replaceContinueWithBreak(Statement stat) { if (stat.type == Statement.TYPE_DO) { List<StatEdge> lst = stat.getPredecessorEdges(StatEdge.TYPE_CONTINUE); for (StatEdge edge : lst) { if (edge.explicit) { Statement minclosure = getMinContinueClosure(edge); if (minclosure != edge.closure && !InlineSingleBlockHelper.isBreakEdgeLabeled(edge.getSource(), minclosure)) { edge.getSource().changeEdgeType(Statement.DIRECTION_FORWARD, edge, StatEdge.TYPE_BREAK); edge.labeled = false; minclosure.addLabeledEdge(edge); } } } } for (Statement st : stat.getStats()) { replaceContinueWithBreak(st); } }
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); } }
public static void lowContinueLabels(Statement stat, HashSet<StatEdge> edges) { boolean ok = (stat.type != Statement.TYPE_DO); if (!ok) { DoStatement dostat = (DoStatement)stat; ok = dostat.getLooptype() == DoStatement.LOOP_DO || dostat.getLooptype() == DoStatement.LOOP_WHILE || (dostat.getLooptype() == DoStatement.LOOP_FOR && dostat.getIncExprent() == null); } if (ok) { edges.addAll(stat.getPredecessorEdges(StatEdge.TYPE_CONTINUE)); } if (ok && stat.type == Statement.TYPE_DO) { for (StatEdge edge : edges) { if (stat.containsStatementStrict(edge.getSource())) { edge.getDestination().removePredecessor(edge); edge.getSource().changeEdgeNode(Statement.DIRECTION_FORWARD, edge, stat); stat.addPredecessor(edge); stat.addLabeledEdge(edge); } } } for (Statement st : stat.getStats()) { if (st == stat.getFirst()) { lowContinueLabels(st, edges); } else { lowContinueLabels(st, new HashSet<>()); } } }