SequenceStatement block = new SequenceStatement(Arrays.asList(loop, target)); loop.getParent().replaceStatement(loop, block); block.setAllParent(); for (StatEdge edge : new ArrayList<>(block.getLabelEdges())) { if (edge.getType() == StatEdge.TYPE_CONTINUE || edge == ifedge) { loop.addLabeledEdge(edge); for (StatEdge edge : block.getPredecessorEdges(StatEdge.TYPE_CONTINUE)) { if (loop.containsStatementStrict(edge.getSource())) { block.removePredecessor(edge); edge.getSource().changeEdgeNode(Statement.DIRECTION_FORWARD, edge, loop); loop.addPredecessor(edge);
SequenceStatement sequence = new SequenceStatement(lstStatements); sequence.setAllParent(); for (int i = 0; i < sequence.getStats().size() - 1; i++) { sequence.getStats().get(i).addSuccessor(new StatEdge(StatEdge.TYPE_REGULAR, sequence.getStats().get(i), sequence.getStats().get(i + 1))); StatEdge endedge = lstSuccs.get(0); if (endedge.closure == stat) { sequence.addLabeledEdge(endedge);
if ((res = SequenceStatement.isHead2Block(head)) != null) { return res;
private static void inlineBlock(SequenceStatement seq, int index) { Statement first = seq.getStats().get(index); Statement pre = seq.getStats().get(index - 1); pre.removeSuccessor(pre.getAllSuccessorEdges().get(0)); // single regular edge for (int i = seq.getStats().size() - 1; i >= index; i--) { lst.add(0, seq.getStats().remove(i)); source == parent.getFirst()) { IfStatement ifparent = (IfStatement)parent; SequenceStatement block = new SequenceStatement(lst); block.setAllParent(); block.setParent(ifparent); SequenceStatement block = new SequenceStatement(lst); block.setAllParent(); for (StatEdge prededge : block.getPredecessorEdges(StatEdge.TYPE_CONTINUE)) { block.removePredecessor(prededge); prededge.getSource().changeEdgeNode(Statement.DIRECTION_FORWARD, prededge, source); source.addPredecessor(prededge);
for (int i = sequence.getStats().size() - 1; i >= 0; i--) { Statement sttemp = sequence.getStats().get(i); if (sttemp == ifstat) { break; for (int i = sequence.getStats().size() - 1; i >= 0; i--) { Statement sttemp = sequence.getStats().get(i); if (sttemp == ifstat) { break; stelse = new SequenceStatement(lst); stelse.setAllParent(); sequence.getStats().removeWithKey(st.id); SequenceStatement newseq = new SequenceStatement(Arrays.asList(ifstat, ifbranch)); newseq.setAllParent(); for (int i = sequence.getStats().size() - 1; i >= 0; i--) { Statement sttemp = sequence.getStats().get(i); if (sttemp == ifstat) { break; stelse = new SequenceStatement(lst); stelse.setAllParent(); sequence.getStats().removeWithKey(st.id);
private static Statement getNextStatement(Statement stat) { Statement parent = stat.getParent(); switch (parent.type) { case Statement.TYPE_ROOT: return ((RootStatement)parent).getDummyExit(); case Statement.TYPE_DO: return parent; case Statement.TYPE_SEQUENCE: SequenceStatement sequence = (SequenceStatement)parent; if (sequence.getStats().getLast() != stat) { for (int i = sequence.getStats().size() - 1; i >= 0; i--) { if (sequence.getStats().get(i) == stat) { return sequence.getStats().get(i + 1); } } } } return getNextStatement(parent); }
SequenceStatement sequence = new SequenceStatement(lst); sequence.setAllParent();
@Override public Statement getSimpleCopy() { return new SequenceStatement(); } }
@Override public TextBuffer toJava(int indent, BytecodeMappingTracer tracer) { TextBuffer buf = new TextBuffer(); boolean islabeled = isLabeled(); buf.append(ExprProcessor.listToJava(varDefinitions, indent, tracer)); if (islabeled) { buf.appendIndent(indent++).append("label").append(this.id.toString()).append(": {").appendLineSeparator(); tracer.incrementCurrentSourceLine(); } boolean notempty = false; for (int i = 0; i < stats.size(); i++) { Statement st = stats.get(i); if (i > 0 && notempty) { buf.appendLineSeparator(); tracer.incrementCurrentSourceLine(); } TextBuffer str = ExprProcessor.jmpWrapper(st, indent, false, tracer); buf.append(str); notempty = !str.containsOnlyWhitespaces(); } if (islabeled) { buf.appendIndent(indent-1).append("}").appendLineSeparator(); tracer.incrementCurrentSourceLine(); } return buf; }
private static void inlineBlock(SequenceStatement seq, int index) { Statement first = seq.getStats().get(index); Statement pre = seq.getStats().get(index - 1); pre.removeSuccessor(pre.getAllSuccessorEdges().get(0)); // single regular edge for (int i = seq.getStats().size() - 1; i >= index; i--) { lst.add(0, seq.getStats().remove(i)); source == parent.getFirst()) { IfStatement ifparent = (IfStatement)parent; SequenceStatement block = new SequenceStatement(lst); block.setAllParent(); block.setParent(ifparent); SequenceStatement block = new SequenceStatement(lst); block.setAllParent(); for (StatEdge prededge : block.getPredecessorEdges(StatEdge.TYPE_CONTINUE)) { block.removePredecessor(prededge); prededge.getSource().changeEdgeNode(Statement.DIRECTION_FORWARD, prededge, source); source.addPredecessor(prededge);
for (int i = sequence.getStats().size() - 1; i >= 0; i--) { Statement sttemp = sequence.getStats().get(i); if (sttemp == ifstat) { break; for (int i = sequence.getStats().size() - 1; i >= 0; i--) { Statement sttemp = sequence.getStats().get(i); if (sttemp == ifstat) { break; stelse = new SequenceStatement(lst); stelse.setAllParent(); sequence.getStats().removeWithKey(st.id); SequenceStatement newseq = new SequenceStatement(Arrays.asList(ifstat, ifbranch)); newseq.setAllParent(); for (int i = sequence.getStats().size() - 1; i >= 0; i--) { Statement sttemp = sequence.getStats().get(i); if (sttemp == ifstat) { break; stelse = new SequenceStatement(lst); stelse.setAllParent(); sequence.getStats().removeWithKey(st.id);
int sequence_stats_number = sequence.getStats().size(); sequence.getStats().getLast() == stat && sequence.getStats().get(sequence_stats_number - 2).type == Statement.TYPE_IF) { IfStatement ifstat = (IfStatement)sequence.getStats().get(sequence_stats_number - 2); Exprent if_condition = ifstat.getHeadexprent().getCondition(); sequence.getStats().removeWithKey(ifstat.id); sequence.setFirst(sequence.getStats().get(0));
private static boolean isInlineable(SequenceStatement seq, int index) { Statement first = seq.getStats().get(index); Statement pre = seq.getStats().get(index - 1); if (pre.hasBasicSuccEdge()) { return false; } List<StatEdge> lst = first.getPredecessorEdges(StatEdge.TYPE_BREAK); if (lst.size() == 1) { StatEdge edge = lst.get(0); if (sameCatchRanges(edge)) { if (!edge.explicit) { for (int i = index; i < seq.getStats().size(); i++) { if (!noExitLabels(seq.getStats().get(i), seq)) { return false; } } } return true; } // FIXME: count labels properly } return false; }
SequenceStatement sequence = new SequenceStatement(lst); sequence.setAllParent();
public static Statement isHead2Block(Statement head) { if (head.getLastBasicType() != Statement.LASTBASICTYPE_GENERAL) { return null; } // at most one outgoing edge StatEdge edge = null; List<StatEdge> lstSuccs = head.getSuccessorEdges(STATEDGE_DIRECT_ALL); if (!lstSuccs.isEmpty()) { edge = lstSuccs.get(0); } if (edge != null && edge.getType() == StatEdge.TYPE_REGULAR) { Statement stat = edge.getDestination(); if (stat != head && stat.getPredecessorEdges(StatEdge.TYPE_REGULAR).size() == 1 && !stat.isMonitorEnter()) { if (stat.getLastBasicType() == Statement.LASTBASICTYPE_GENERAL) { if (DecHelper.checkStatementExceptions(Arrays.asList(head, stat))) { return new SequenceStatement(head, stat); } } } } return null; }
public TextBuffer toJava(int indent, BytecodeMappingTracer tracer) { TextBuffer buf = new TextBuffer(); boolean islabeled = isLabeled(); buf.append(ExprProcessor.listToJava(varDefinitions, indent, tracer)); if (islabeled) { buf.appendIndent(indent++).append("label").append(this.id.toString()).append(": {").appendLineSeparator(); tracer.incrementCurrentSourceLine(); } boolean notempty = false; for (int i = 0; i < stats.size(); i++) { Statement st = stats.get(i); if (i > 0 && notempty) { buf.appendLineSeparator(); tracer.incrementCurrentSourceLine(); } TextBuffer str = ExprProcessor.jmpWrapper(st, indent, false, tracer); buf.append(str); notempty = !str.containsOnlyWhitespaces(); } if (islabeled) { buf.appendIndent(indent-1).append("}").appendLineSeparator(); tracer.incrementCurrentSourceLine(); } return buf; }
oldexitedge.closure.addLabeledEdge(newexitedge); SequenceStatement block = new SequenceStatement(Arrays.asList(stat, bstat)); block.setAllParent(); for (StatEdge prededge : block.getPredecessorEdges(StatEdge.TYPE_CONTINUE)) { block.removePredecessor(prededge); prededge.getSource().changeEdgeNode(Statement.DIRECTION_FORWARD, prededge, stat); stat.addPredecessor(prededge);
SequenceStatement sequence = new SequenceStatement(lstStatements); sequence.setAllParent(); for (int i = 0; i < sequence.getStats().size() - 1; i++) { sequence.getStats().get(i).addSuccessor(new StatEdge(StatEdge.TYPE_REGULAR, sequence.getStats().get(i), sequence.getStats().get(i + 1))); StatEdge endedge = lstSuccs.get(0); if (endedge.closure == stat) { sequence.addLabeledEdge(endedge);