Fixed: #2636 ActionScript - Incorrect always-break detection causing insertion of while(true)

Fixed: #2636 ActionScript 3 - Incorrect switch detection
This commit is contained in:
Jindra Petřík
2026-02-18 03:41:28 +01:00
parent bf01716f0c
commit ad727716fa
3 changed files with 29 additions and 17 deletions

View File

@@ -1905,38 +1905,39 @@ public class AVM2Graph extends Graph {
//determine whether local register are on left or on right side of === operator
// -1 = there's no register,
// -2 = there are mixed registers,
// -3 = there is missing register in some cases
// N = there is always register number N
int leftReg = -1;
int rightReg = -1;
for (int cv = 0; cv < caseValuesMapLeft.size(); cv++) {
if (caseValuesMapLeft.get(cv) instanceof LocalRegAVM2Item) {
if (leftReg != -3 && caseValuesMapLeft.get(cv) instanceof LocalRegAVM2Item) {
int reg = ((LocalRegAVM2Item) caseValuesMapLeft.get(cv)).regIndex;
if (leftReg == -1) {
leftReg = reg;
} else {
if (leftReg != reg) {
leftReg = -2;
}
} else if (leftReg != reg) {
leftReg = -2;
}
} else {
leftReg = -3;
}
if (caseValuesMapRight.get(cv) instanceof LocalRegAVM2Item) {
if (rightReg != -3 && caseValuesMapRight.get(cv) instanceof LocalRegAVM2Item) {
int reg = ((LocalRegAVM2Item) caseValuesMapRight.get(cv)).regIndex;
if (rightReg == -1) {
rightReg = reg;
} else {
if (rightReg != reg) {
rightReg = -2;
}
} else if (rightReg != reg) {
rightReg = -2;
}
} else {
rightReg = -3;
}
}
List<GraphTargetItem> otherSide = new ArrayList<>();
if (leftReg > 0) {
if (leftReg >= 0) {
switchedObject = new LocalRegAVM2Item(null, null, leftReg, null, TypeItem.UNBOUNDED /*?*/);
caseValuesMap = caseValuesMapRight;
otherSide = caseValuesMapLeft;
} else if (rightReg > 0) {
} else if (rightReg >= 0) {
switchedObject = new LocalRegAVM2Item(null, null, rightReg, null, TypeItem.UNBOUNDED /*?*/);
otherSide = caseValuesMapRight;
}

View File

@@ -3865,12 +3865,15 @@ public class Graph {
/*
Detect forward jumps (breaks) in always-break loops.
FIXME!!!
*/
if (localData.secondPassData != null) {
if (next != null) {
Set<GraphPart> ig = new HashSet<>();
Set<GraphPartEdge> backEdges = new HashSet<>();
for (Loop el : loops) {
for (GraphPart be : el.backEdges) {
backEdges.add(new GraphPartEdge(be, el.loopContinue));
}
if (el.phase == 1) {
if (el.loopContinue != null) {
ig.add(el.loopContinue);
@@ -3891,12 +3894,17 @@ public class Graph {
if (p == part) {
continue;
}
for (GraphPart r : p.refs) {
// #2636, it has no test
if (!part.leadsTo(localData, this, code, r, loops, throwStates)) {
//System.err.println("Part " + part + " do not lead");
for (GraphPart r : p.refs) {
// #2636
GraphPartEdge edge = new GraphPartEdge(r, p);
if (backEdges.contains(edge)) {
continue;
}
// also #2636
if (!part.leadsTo(localData, this, code, r, loops, throwStates)) {
continue;
}
if (r == part) {
continue;
}