diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java index a9f47454f..8afd9267a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -3241,8 +3241,9 @@ public class Graph { } }*/ - //isRealStopPart = stopPart.get(stopPart.size() - 1) == part; - for (int i = stopPartKind.size() - 1; i >= 0; i--) { + + //This weird stuff also tries to handle some goto problems + for (int i = stopPartKind.size() - 1; i >= 0; i--) { if (stopPartKind.get(i) == StopPartKind.OTHER && stopPart.get(i) == part) { isRealStopPart = true; break; @@ -3250,11 +3251,13 @@ public class Graph { if (stopPartKind.get(i) == StopPartKind.BLOCK_CLOSE) { if (stopPart.get(i) == part) { isRealStopPart = true; + } else if (stopPart.get(i).start >= code.size()) { //end of as1/2 function + continue; } break; } } - + if (isRealStopPart) { if (currentLoop != null) { currentLoop.phase = 0; diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2AssemblerTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2AssemblerTest.java index 9a3d6e546..e56c52ffd 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2AssemblerTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2AssemblerTest.java @@ -378,4 +378,81 @@ public class ActionScript2AssemblerTest extends ActionScript2TestBase { + "}\n" + "trace(\"after\");"); } + + @Test + public void testStopPartEndFunction() { + String res = decompilePcode("DefineFunction \"test\", 1, \"param1\" {\n" + + "Push \"param1\"\n" + + "GetVariable\n" + + "StoreRegister 1\n" + + "Pop\n" + + "Push \"Start\"\n" + + "Trace\n" + + "Push register1, 1\n" + + "Equals\n" + + "Not\n" + + "If loc007a\n" + + "Push register1, 2\n" + + "Equals\n" + + "Not\n" + + "If loc0075\n" + + "Push register1, 3\n" + + "Equals\n" + + "Not\n" + + "If loc006e\n" + + "Push \"C\"\n" + + "Trace\n" + + "Jump loc00a5\n" + + "loc006e:Push \"B\"\n" + + "Trace\n" + + "loc0075:Jump loc0081\n" + + "loc007a:Push \"E\"\n" + + "Trace\n" + + "loc0081:Push register1, 4\n" + + "Equals\n" + + "Not\n" + + "If loc009e\n" + + "Push \"A\"\n" + + "Trace\n" + + "Jump loc00a5\n" + + "loc009e:Push \"D\"\n" + + "Trace\n" + + "}\n" + + "loc00a5:Push \"end\"\n" + + "Trace\n"); + res = cleanPCode(res); + assertEquals(res, "function test(param1)\n" + + "{\n" + + "var _loc1_ = param1;\n" + + "trace(\"Start\");\n" + + "if(_loc1_ == 1)\n" + + "{\n" + + "if(_loc1_ == 2)\n" + + "{\n" + + "if(_loc1_ == 3)\n" + + "{\n" + + "trace(\"C\");\n" + + "}\n" + + "else\n" + + "{\n" + + "trace(\"B\");\n" + + "}\n" + + "return;\n" + + "}\n" + + "}\n" + + "else\n" + + "{\n" + + "trace(\"E\");\n" + + "}\n" + + "if(_loc1_ == 4)\n" + + "{\n" + + "trace(\"A\");\n" + + "}\n" + + "else\n" + + "{\n" + + "trace(\"D\");\n" + + "}\n" + + "}\n" + + "trace(\"end\");"); + } }