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); }
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; }
private static void mergeFlatStatements(SequenceStatement sequence) { while (true) { Statement next; Statement current = null; boolean found = false; for (int i = sequence.getStats().size() - 1; i >= 0; i--) { next = current; current = sequence.getStats().get(i); if (next != null && current.getExprents() != null && !current.getExprents().isEmpty()) { if (next.getExprents() != null) { next.getExprents().addAll(0, current.getExprents()); current.getExprents().clear(); found = true; } else { Statement first = getFirstExprentlist(next); if (first != null) { first.getExprents().addAll(0, current.getExprents()); current.getExprents().clear(); found = true; } } } } if (!found) { break; } } }
private static boolean inlineSingleBlocksRec(Statement stat) { boolean res = false; for (Statement st : stat.getStats()) { res |= inlineSingleBlocksRec(st); } if (stat.type == Statement.TYPE_SEQUENCE) { SequenceStatement seq = (SequenceStatement)stat; for (int i = 1; i < seq.getStats().size(); i++) { if (isInlineable(seq, i)) { inlineBlock(seq, i); return true; } } } 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));
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));
SequenceStatement sequence = (SequenceStatement)parent; 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; sequence.getStats().removeWithKey(st.id); for (int i = sequence.getStats().size() - 1; i >= 0; i--) { Statement sttemp = sequence.getStats().get(i); if (sttemp == ifstat) { break; sequence.getStats().removeWithKey(st.id); sequence.getStats().addWithKey(ifbranch, ifbranch.id); ifbranch.setParent(sequence);
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); }
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) { return true; } else { 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; }
private static void mergeFlatStatements(SequenceStatement sequence) { while (true) { Statement next; Statement current = null; boolean found = false; for (int i = sequence.getStats().size() - 1; i >= 0; i--) { next = current; current = sequence.getStats().get(i); if (next != null && current.getExprents() != null && !current.getExprents().isEmpty()) { if (next.getExprents() != null) { next.getExprents().addAll(0, current.getExprents()); current.getExprents().clear(); found = true; } else { Statement first = getFirstExprentlist(next); if (first != null) { first.getExprents().addAll(0, current.getExprents()); current.getExprents().clear(); found = true; } } } } if (!found) { break; } } }
private static boolean inlineSingleBlocksRec(Statement stat) { boolean res = false; for (Statement st : stat.getStats()) { res |= inlineSingleBlocksRec(st); } if (stat.type == Statement.TYPE_SEQUENCE) { SequenceStatement seq = (SequenceStatement)stat; for (int i = 1; i < seq.getStats().size(); i++) { if (isInlineable(seq, i)) { inlineBlock(seq, i); return true; } } } 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));
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));
SequenceStatement sequence = (SequenceStatement)parent; 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; sequence.getStats().removeWithKey(st.id); for (int i = sequence.getStats().size() - 1; i >= 0; i--) { Statement sttemp = sequence.getStats().get(i); if (sttemp == ifstat) { break; sequence.getStats().removeWithKey(st.id); sequence.getStats().addWithKey(ifbranch, ifbranch.id); ifbranch.setParent(sequence);