Fixed: #2519 AS1/2 avoid multi-level loops in cases where possible

This commit is contained in:
Jindra Petřík
2025-08-22 19:29:04 +02:00
parent fc3b4a378e
commit 4b48b8408a
4 changed files with 94 additions and 1 deletions

View File

@@ -496,4 +496,80 @@ public class ActionScript2AssemblerTest extends ActionScript2TestBase {
+ "trace(\"C\");\n"
+ "}");
}
@Test
public void testBreakReturnAsJumpAfterFunction2() {
String res = decompilePcode("ConstantPool \"a\", \"v\", \"b\", \"ret\"\n"
+ "DefineFunction \"f\", 0 {\n"
+ "Push \"a\"\n"
+ "Push 3\n"
+ "Push 2\n"
+ "Push 1\n"
+ "Push 3\n"
+ "InitArray\n"
+ "DefineLocal\n"
+ "Push \"a\"\n"
+ "GetVariable\n"
+ "Enumerate2\n"
+ "loc0046:StoreRegister 0\n"
+ "Push null\n"
+ "Equals2\n"
+ "If loc00cb\n"
+ "Push \"v\"\n"
+ "Push register0\n"
+ "SetVariable\n"
+ "Push \"v\"\n"
+ "GetVariable\n"
+ "Trace\n"
+ "Push \"b\"\n"
+ "Push 0\n"
+ "DefineLocal\n"
+ "loc0074:Push \"b\"\n"
+ "GetVariable\n"
+ "Push 10\n"
+ "Less2\n"
+ "Not\n"
+ "If loc00c6\n"
+ "Push \"b\"\n"
+ "GetVariable\n"
+ "Push 4\n"
+ "Equals2\n"
+ "Not\n"
+ "If loc00b4\n"
+ "Push \"ret\"\n"
+ "Trace\n"
+ "loc00a4:Push null\n"
+ "Equals2\n"
+ "Not\n"
+ "If loc00a4\n"
+ "Jump loc00cb\n"
+ "loc00b4:Push \"b\"\n"
+ "Push \"b\"\n"
+ "GetVariable\n"
+ "Increment\n"
+ "SetVariable\n"
+ "Jump loc0074\n"
+ "loc00c6:Jump loc0046\n"
+ "}\n"
+ "loc00cb:");
res = cleanPCode(res);
assertEquals(res, "function f()\n"
+ "{\n"
+ "var a = [1,2,3];\n"
+ "for(v in a)\n"
+ "{\n"
+ "trace(v);\n"
+ "var b = 0;\n"
+ "while(b < 10)\n"
+ "{\n"
+ "if(b == 4)\n"
+ "{\n"
+ "trace(\"ret\");\n"
+ "return;\n" //critical - no level2 break, but return
+ "}\n"
+ "b++;\n"
+ "}\n"
+ "}\n"
+ "}");
}
}