Fixed - AS3: return in finally

This commit is contained in:
Jindra Petřík
2021-02-08 20:15:19 +01:00
parent 70e421ec06
commit 79cf2324f9
4 changed files with 55 additions and 60 deletions
@@ -180,12 +180,12 @@ public class Graph {
}
}
private void getReachableParts(GraphPart part, LinkedHashSet<GraphPart> ret, List<Loop> loops, List<GraphPartEdge> gotoParts) {
private void getReachableParts(BaseLocalData localData, GraphPart part, LinkedHashSet<GraphPart> ret, List<Loop> loops, List<GraphPartEdge> gotoParts) {
// use LinkedHashSet to preserve order
getReachableParts(part, ret, loops, true, gotoParts);
getReachableParts(localData, part, ret, loops, true, gotoParts);
}
private void getReachableParts(GraphPart part, LinkedHashSet<GraphPart> ret, List<Loop> loops, boolean first, List<GraphPartEdge> gotoParts) {
private void getReachableParts(BaseLocalData localData, GraphPart part, LinkedHashSet<GraphPart> ret, List<Loop> loops, boolean first, List<GraphPartEdge> gotoParts) {
// todo: honfika: why call with first = true parameter always?
Stack<GraphPartQueue> stack = new Stack<>();
GraphPartQueue queue = new GraphPartQueue();
@@ -239,7 +239,13 @@ public class Graph {
GraphPartQueue newParts = new GraphPartQueue();
loopnext:
for (GraphPart next : part.nextParts) {
for (GraphPart nextRaw : part.nextParts) {
GraphPart next = checkPart(null, localData, part, nextRaw, null);
if (next == null) {
continue;
}
if (gotoParts.contains(new GraphPartEdge(part, next))) {
continue;
}
@@ -314,19 +320,12 @@ public class Graph {
List<Set<GraphPart>> reachable = new ArrayList<>();
for (GraphPart p : parts) {
LinkedHashSet<GraphPart> r1 = new LinkedHashSet<>();
getReachableParts(p, r1, loops, gotoParts);
getReachableParts(localData, p, r1, loops, gotoParts);
r1.add(p);
reachable.add(r1);
}
Set<GraphPart> first = reachable.get(0);
for (GraphPart p : first) {
/*if (ignored.contains(p)) {
continue;
}*/
p = checkPart(null, localData, p, null);
if (p == null) {
continue;
}
boolean common = true;
for (Set<GraphPart> r : reachable) {
if (!r.contains(p)) {
@@ -392,7 +391,7 @@ public class Graph {
List<Set<GraphPart>> reachable = new ArrayList<>();
for (GraphPart p : parts) {
LinkedHashSet<GraphPart> r1 = new LinkedHashSet<>();
getReachableParts(p, r1, loops, gotoParts);
getReachableParts(localData, p, r1, loops, gotoParts);
Set<GraphPart> r2 = new LinkedHashSet<>();
r2.add(p);
r2.addAll(r1);
@@ -1745,7 +1744,7 @@ public class Graph {
return null;
}
protected GraphPart checkPart(TranslateStack stack, BaseLocalData localData, GraphPart part, Set<GraphPart> allParts) {
protected GraphPart checkPart(TranslateStack stack, BaseLocalData localData, GraphPart prev, GraphPart part, Set<GraphPart> allParts) {
return part;
}
@@ -1847,7 +1846,7 @@ public class Graph {
return;
}
part = checkPart(null, localData, part, null);
part = checkPart(null, localData, null, part, null);
if (part == null) {
return;
}
@@ -1984,7 +1983,7 @@ public class Graph {
do {
found = null;
for (int i = 0; i < currentLoop.breakCandidates.size(); i++) {
GraphPart ch = checkPart(null, localData, currentLoop.breakCandidates.get(i), null);
GraphPart ch = checkPart(null, localData, null, currentLoop.breakCandidates.get(i), null);
if (ch == null) {
currentLoop.breakCandidates.remove(i);
i--;
@@ -2150,7 +2149,7 @@ public class Graph {
if (part == null) {
return ret;
}
part = checkPart(stack, localData, part, allParts);
part = checkPart(stack, localData, parent, part, allParts);
if (part == null) {
return ret;
}
@@ -125,17 +125,17 @@ public class GraphPart implements Serializable {
return time;
}
private boolean leadsTo(BaseLocalData localData, Graph gr, GraphSource code, GraphPart part, HashSet<GraphPart> visited, List<Loop> loops) throws InterruptedException {
private boolean leadsTo(BaseLocalData localData, Graph gr, GraphSource code, GraphPart prev, GraphPart part, HashSet<GraphPart> visited, List<Loop> loops) throws InterruptedException {
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException();
}
GraphPart tpart = gr.checkPart(null, localData, this, null);
GraphPart tpart = gr.checkPart(null, localData, prev, this, null);
if (tpart == null) {
return false;
}
if (tpart != this) {
return tpart.leadsTo(localData, gr, code, part, visited, loops);
return tpart.leadsTo(localData, gr, code, null, part, visited, loops);
}
Loop currentLoop = null;
for (Loop l : loops) {
@@ -172,14 +172,14 @@ public class GraphPart implements Serializable {
for (GraphPart p : nextParts) {
if (p == part) {
return true;
} else if (p.leadsTo(localData, gr, code, part, visited, loops)) {
} else if (p.leadsTo(localData, gr, code, this, part, visited, loops)) {
return true;
}
}
for (GraphPart p : throwParts) {
if (p == part) {
return true;
} else if (p.leadsTo(localData, gr, code, part, visited, loops)) {
} else if (p.leadsTo(localData, gr, code, this, part, visited, loops)) {
return true;
}
}
@@ -193,7 +193,7 @@ public class GraphPart implements Serializable {
for (Loop l : loops) {
l.leadsToMark = 0;
}
return leadsTo(localData, gr, code, part, new HashSet<>(), loops);
return leadsTo(localData, gr, code, null /*???*/, part, new HashSet<>(), loops);
}
public GraphPart(int start, int end) {