diff --git a/trunk/src/com/jpexs/decompiler/flash/graph/Graph.java b/trunk/src/com/jpexs/decompiler/flash/graph/Graph.java index 46baf4180..d852a3093 100644 --- a/trunk/src/com/jpexs/decompiler/flash/graph/Graph.java +++ b/trunk/src/com/jpexs/decompiler/flash/graph/Graph.java @@ -752,7 +752,7 @@ public class Graph { } } } - part.level = level; + if (!visited.contains(part)) { visited.add(part); } @@ -840,11 +840,11 @@ public class Graph { private void getLoops(GraphPart part, List loops, List stopPart) { clearLoops(loops); - getLoops(part, loops, stopPart, true); + getLoops(part, loops, stopPart, true,1); clearLoops(loops); } - private void getLoops(GraphPart part, List loops, List stopPart, boolean first) { + private void getLoops(GraphPart part, List loops, List stopPart, boolean first,int level) { boolean debugMode = false; if (stopPart == null) { @@ -853,6 +853,7 @@ public class Graph { if (part == null) { return; } + if (debugMode) { System.err.println("getloops: " + part); } @@ -870,6 +871,7 @@ public class Graph { if (lastP1 != null) { if (lastP1.breakCandidates.contains(part)) { lastP1.breakCandidates.add(part); + lastP1.breakCandidatesLevels.add(level); return; } else { List loopContinues2 = new ArrayList<>(loopContinues); @@ -878,6 +880,7 @@ public class Graph { loops2.remove(lastP1); if (!part.leadsTo(code, lastP1.loopContinue, loops2)) { lastP1.breakCandidates.add(part); + lastP1.breakCandidatesLevels.add(level); return; } } @@ -892,6 +895,7 @@ public class Graph { if (stopPart.contains(part)) { return; } + part.level = level; boolean isLoop = part.leadsTo(code, part, loops); Loop currentLoop = null; @@ -909,13 +913,13 @@ public class Graph { stopPart2.add(next); } if (next != part.nextParts.get(0)) { - getLoops(part.nextParts.get(0), loops, stopPart2, false); + getLoops(part.nextParts.get(0), loops, stopPart2, false,level+1); } if (next != part.nextParts.get(1)) { - getLoops(part.nextParts.get(1), loops, stopPart2, false); + getLoops(part.nextParts.get(1), loops, stopPart2, false,level+1); } if (next != null) { - getLoops(next, loops, stopPart, false); + getLoops(next, loops, stopPart, false,level); } } if (part.nextParts.size() > 2) { @@ -936,15 +940,15 @@ public class Graph { } } if (next != p) { - getLoops(p, loops, stopPart2, false); + getLoops(p, loops, stopPart2, false,level+1); } } if (next != null) { - getLoops(next, loops, stopPart, false); + getLoops(next, loops, stopPart, false,level); } } if (part.nextParts.size() == 1) { - getLoops(part.nextParts.get(0), loops, stopPart, false); + getLoops(part.nextParts.get(0), loops, stopPart, false,level); } @@ -958,6 +962,7 @@ public class Graph { } for (int i = currentLoop.breakCandidates.size() - 1; i >= 0; i--) { if (spcheck.contains(currentLoop.breakCandidates.get(i))) { + currentLoop.breakCandidatesLevels.remove(i); backupCandidates.add(currentLoop.breakCandidates.remove(i)); } } @@ -991,14 +996,36 @@ public class Graph { /*if (cand.path.equals(cand2.path)) { found = cand2; } else {*/ - found = cand; + int lev1=Integer.MAX_VALUE; + int lev2=Integer.MAX_VALUE; + for(int i=0;i breakCandidates = new ArrayList<>(); + public List breakCandidatesLevels = new ArrayList<>(); public long id; public boolean used = false; public boolean finished = false;