From e6fb646b1bb303b735cb136a9602d601deedd377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 29 Jun 2025 22:58:28 +0200 Subject: [PATCH] Fixed: #2474 Gotos incorrectly decompiled --- CHANGELOG.md | 3 + .../flash/abc/avm2/graph/AVM2Graph.java | 1 + .../src/com/jpexs/decompiler/graph/Graph.java | 59 +++++++-- .../decompiler/graph/model/ScriptEndItem.java | 3 +- .../ActionScript3AssembledDecompileTest.java | 5 +- .../as3decompile/ActionScript3ClassTest.java | 2 +- .../flash/generators/AS3Generator.java | 2 +- .../as3_assembled-0/as3_assembled-0.main.abc | Bin 8832 -> 10007 bytes .../as3_assembled-0.main.asasm | 4 + .../tests/TestAlwaysBreak.class.asasm | 101 +++++++++++++++ .../tests/TestAlwaysBreak.script.asasm | 29 +++++ .../tests/TestAlwaysBreak2.class.asasm | 100 +++++++++++++++ .../tests/TestAlwaysBreak2.script.asasm | 29 +++++ .../tests/TestGoto.class.asasm | 111 ++++++++++++++++ .../tests/TestGoto.script.asasm | 29 +++++ .../tests/TestGoto2.class.asasm | 121 ++++++++++++++++++ .../tests/TestGoto2.script.asasm | 29 +++++ .../as3_assembled/bin/as3_assembled.swf | Bin 5264 -> 5792 bytes 18 files changed, 612 insertions(+), 16 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak.class.asasm create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak.script.asasm create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak2.class.asasm create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak2.script.asasm create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto.class.asasm create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto.script.asasm create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto2.class.asasm create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto2.script.asasm diff --git a/CHANGELOG.md b/CHANGELOG.md index afeb9c7d7..be7a80b2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Fixed +- [#2474] Gotos incorrectly decompiled ## [24.0.1] - 2025-06-27 ### Fixed @@ -3874,6 +3876,7 @@ Major version of SWF to XML export changed to 2. [alpha 9]: https://github.com/jindrapetrik/jpexs-decompiler/compare/alpha8...alpha9 [alpha 8]: https://github.com/jindrapetrik/jpexs-decompiler/compare/alpha7...alpha8 [alpha 7]: https://github.com/jindrapetrik/jpexs-decompiler/releases/tag/alpha7 +[#2474]: https://www.free-decompiler.com/flash/issues/2474 [#2476]: https://www.free-decompiler.com/flash/issues/2476 [#2404]: https://www.free-decompiler.com/flash/issues/2404 [#1418]: https://www.free-decompiler.com/flash/issues/1418 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java index 70809a773..f4519b3ee 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java @@ -1391,6 +1391,7 @@ public class AVM2Graph extends Graph { List stopPart2 = new ArrayList<>(stopPart); List stopPartKind2 = new ArrayList<>(stopPartKind); stopPart2.add(exAfterPart); + stopPartKind2.add(StopPartKind.OTHER); if (defaultPart != null) { stopPart2.add(defaultPart); stopPartKind2.add(StopPartKind.OTHER); 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 9a95fe09b..598edea19 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -989,6 +989,7 @@ public class Graph { processIfGotos2(new ArrayList<>(), gotos, ret, ret); processIfGotos(gotos, ret, ret); + processScriptEnd(ret); Map usages = new HashMap<>(); Map lastUsage = new HashMap<>(); @@ -1673,6 +1674,26 @@ public class Graph { } } + private void processScriptEnd(List ret) { + if (!ret.isEmpty()) { + if (ret.get(ret.size() - 1) instanceof ScriptEndItem) { + ret.remove(ret.size() - 1); + processScriptEnd(ret); + return; + } + if (ret.get(ret.size() - 1) instanceof Block) { + Block blk = (Block) ret.get(ret.size() - 1); + if (blk instanceof SwitchItem) { + return; + } + + for (List sub : blk.getSubs()) { + processScriptEnd(sub); + } + } + } + } + /** * Processes ifs. * @@ -2879,9 +2900,9 @@ public class Graph { if (stopPart.contains(part)) { - /*boolean hasBlockClosesAfter = false; + boolean isRealStopPart = false; //this weird stuff handles some goto problems: - loopi: + /*loopi: for (int i = 0; i < stopPartKind.size(); i++) { if (stopPart.get(i) == part) { for (int j = i + 1; j < stopPartKind.size(); j++) { @@ -2893,17 +2914,31 @@ public class Graph { } } } + }*/ + + //isRealStopPart = stopPart.get(stopPart.size() - 1) == part; + for (int i = stopPartKind.size() - 1; i >= 0; i--) { + if (stopPartKind.get(i) == StopPartKind.OTHER && stopPart.get(i) == part) { + isRealStopPart = true; + break; + } + if (stopPartKind.get(i) == StopPartKind.BLOCK_CLOSE) { + if (stopPart.get(i) == part) { + isRealStopPart = true; + } + break; + } } - if (!hasBlockClosesAfter) {*/ - if (currentLoop != null) { - currentLoop.phase = 0; + if (isRealStopPart) { + if (currentLoop != null) { + currentLoop.phase = 0; + } + if (debugPrintGraph) { + System.err.println("Stopped on part " + part); + } + return ret; } - if (debugPrintGraph) { - System.err.println("Stopped on part " + part); - } - return ret; - //} } if (code.size() <= part.start) { @@ -2927,6 +2962,7 @@ public class Graph { if (firstCodePos == -1) { firstCodePos = firstCode.size(); } + ((GraphPartMarkedArrayList) firstCode).clearCurrentParts(); ((GraphPartMarkedArrayList) firstCode).startPart(part); } @@ -3308,7 +3344,8 @@ public class Graph { List stopPartKind2 = new ArrayList<>(stopPartKind); if ((!isEmpty) && (next != null)) { - if (!stopPart2.contains(next)) { //?? might be a break or something + //if (!stopPart2.contains(next)) + { //?? might be a break or something stopPart2.add(next); stopPartKind2.add(StopPartKind.BLOCK_CLOSE); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ScriptEndItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ScriptEndItem.java index e7ab428ef..3a9ccfc46 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ScriptEndItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ScriptEndItem.java @@ -39,6 +39,7 @@ public class ScriptEndItem extends GraphTargetItem implements ExitItem { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) { + writer.append("return;"); return writer; } @@ -49,7 +50,7 @@ public class ScriptEndItem extends GraphTargetItem implements ExitItem { @Override public boolean isEmpty() { - return true; + return false; } @Override diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java index 07fd458c6..5a4edbd15 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java @@ -283,12 +283,13 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "if(b)\r\n" + "{\r\n" + "trace(\"a\");\r\n" + + "addr39:\r\n" + + "trace(\"c\");\r\n" + "}\r\n" + "break;\r\n" + "}\r\n" + "trace(\"b\");\r\n" - + "trace(\"c\");\r\n" - + "break;\r\n" + + "§§goto(addr39);\r\n" + "case 2:\r\n" + "trace(\"case2\");\r\n" + "}\r\n", diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassTest.java index 39c640a89..743e18a40 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassTest.java @@ -726,7 +726,7 @@ public class ActionScript3ClassTest extends ActionScript3DecompileTestBase { public void testHaxeStaticVars() { /* Static vars in Haxe are initialized in script initializer (normal flash uses class initializer) - */ + */ decompileScriptPack("haxe", "tests_classes.TestStaticVars", "package tests_classes\n" + "{\n" + " public class TestStaticVars\n" diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java index 808b08290..9bf6b806c 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java @@ -61,7 +61,7 @@ public class AS3Generator { sortedPacks.put(pack.getClassPath().toRawString(), pack); } s.append("/*\r\n" - + " * Copyright (C) 2010-2024 JPEXS, All rights reserved.\r\n" + + " * Copyright (C) 2010-2025 JPEXS, All rights reserved.\r\n" + " * \r\n" + " * This library is free software; you can redistribute it and/or\r\n" + " * modify it under the terms of the GNU Lesser General Public\r\n" diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.abc b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.abc index b39578ba0911f4b622bcb33e4105a3852e2d6e8a..17a3ba11bbf88a144ddbf40f7e52fa8ab1804b9e 100644 GIT binary patch delta 4983 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 RCsHp-QZ|@%h7~|k{|nhKx>5iD delta 3969 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 CLfW7J diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.asasm index 6cbcdf71a..f3fd6eeea 100644 --- a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.asasm +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.asasm @@ -35,5 +35,9 @@ program #include "tests/TestSwitchMostCommon.script.asasm" #include "tests/TestXmlStar.script.asasm" #include "tests/TestLocalRegIf.script.asasm" + #include "tests/TestGoto.script.asasm" + #include "tests/TestGoto2.script.asasm" + #include "tests/TestAlwaysBreak.script.asasm" + #include "tests/TestAlwaysBreak2.script.asasm" ; place to add next end ; program diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak.class.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak.class.asasm new file mode 100644 index 000000000..8fedda177 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak.class.asasm @@ -0,0 +1,101 @@ +class + refid "tests:TestAlwaysBreak" + instance QName(PackageNamespace("tests"), "TestAlwaysBreak") + extends QName(PackageNamespace(""), "Object") + flag SEALED + flag PROTECTEDNS + protectedns ProtectedNamespace("tests:TestAlwaysBreak") + iinit + refid "tests:TestAlwaysBreak/instance/init" + body + maxstack 1 + localcount 1 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + + getlocal0 + constructsuper 0 + + returnvoid + end ; code + end ; body + end ; method + trait method QName(PackageNamespace(""), "run") + method + refid "tests:TestAlwaysBreak/instance/run" + returns QName(PackageNamespace(""), "void") + body + maxstack 2 + localcount 4 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + + debug 1, "v", 0, 15 + jump ofs0055 + ofs000c: + label + pushbyte 5 + coerce_a + setlocal1 + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]) + pushstring "a" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]), 1 + getlocal1 + pushbyte 4 + ifngt ofs0048 + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]) + pushstring "b" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]), 1 + getlocal1 + pushbyte 10 + ifngt ofs003e + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]) + pushstring "c" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]), 1 + jump ofs005a + ofs003e: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]) + pushstring "d" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]), 1 + ofs0048: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]) + pushstring "e" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]), 1 + jump ofs005a + ofs0055: + pushtrue + iftrue ofs000c + ofs005a: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]) + pushstring "f" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]), 1 + returnvoid + + returnvoid + end ; code + end ; body + end ; method + end ; trait + end ; instance + cinit + refid "tests:TestAlwaysBreak/class/init" + body + maxstack 1 + localcount 1 + initscopedepth 3 + maxscopedepth 4 + code + getlocal0 + pushscope + + returnvoid + end ; code + end ; body + end ; method +end ; class diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak.script.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak.script.asasm new file mode 100644 index 000000000..66341c64f --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak.script.asasm @@ -0,0 +1,29 @@ +script + sinit + refid "tests:TestAlwaysBreak/init" + body + maxstack 2 + localcount 1 + initscopedepth 1 + maxscopedepth 3 + code + getlocal0 + pushscope + + findpropstrict Multiname("TestAlwaysBreak", [PackageNamespace("tests")]) + getlex QName(PackageNamespace(""), "Object") + pushscope + + getlex Multiname("Object", [PrivateNamespace(null, "tests:TestAlwaysBreak"), PackageNamespace(""), PackageNamespace("tests"), PackageInternalNs("tests"), Namespace("http://adobe.com/AS3/2006/builtin")]) + newclass "tests:TestAlwaysBreak" + popscope + initproperty QName(PackageNamespace("tests"), "TestAlwaysBreak") + + returnvoid + end ; code + end ; body + end ; method + trait class QName(PackageNamespace("tests"), "TestAlwaysBreak") + #include "TestAlwaysBreak.class.asasm" + end ; trait +end ; script diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak2.class.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak2.class.asasm new file mode 100644 index 000000000..cef4d28b2 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak2.class.asasm @@ -0,0 +1,100 @@ +class + refid "tests:TestAlwaysBreak2" + instance QName(PackageNamespace("tests"), "TestAlwaysBreak2") + extends QName(PackageNamespace(""), "Object") + flag SEALED + flag PROTECTEDNS + protectedns ProtectedNamespace("tests:TestAlwaysBreak2") + iinit + refid "tests:TestAlwaysBreak2/instance/init" + body + maxstack 1 + localcount 1 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + + getlocal0 + constructsuper 0 + + returnvoid + end ; code + end ; body + end ; method + trait method QName(PackageNamespace(""), "run") + method + refid "tests:TestAlwaysBreak2/instance/run" + returns QName(PackageNamespace(""), "void") + body + maxstack 2 + localcount 4 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + + debug 1, "v", 0, 15 + jump ofs0055 + ofs000c: + label + pushbyte 5 + coerce_a + setlocal1 + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]) + pushstring "a" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]), 1 + getlocal1 + pushbyte 4 + ifngt ofs0048 + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]) + pushstring "b" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]), 1 + getlocal1 + pushbyte 10 + ifngt ofs003e + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]) + pushstring "c" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]), 1 + jump ofs005a + ofs003e: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]) + pushstring "d" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]), 1 + ofs0048: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]) + pushstring "e" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]), 1 + jump ofs005a + ofs0055: + jump ofs000c + ofs005a: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]) + pushstring "f" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestAlwaysBreak"),ProtectedNamespace("tests:TestAlwaysBreak"),StaticProtectedNs("tests:TestAlwaysBreak"),PrivateNamespace("TestAlwaysBreak.as$33")]), 1 + returnvoid + + returnvoid + end ; code + end ; body + end ; method + end ; trait + end ; instance + cinit + refid "tests:TestAlwaysBreak2/class/init" + body + maxstack 1 + localcount 1 + initscopedepth 3 + maxscopedepth 4 + code + getlocal0 + pushscope + + returnvoid + end ; code + end ; body + end ; method +end ; class diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak2.script.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak2.script.asasm new file mode 100644 index 000000000..efaff1824 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestAlwaysBreak2.script.asasm @@ -0,0 +1,29 @@ +script + sinit + refid "tests:TestAlwaysBreak2/init" + body + maxstack 2 + localcount 1 + initscopedepth 1 + maxscopedepth 3 + code + getlocal0 + pushscope + + findpropstrict Multiname("TestAlwaysBreak2", [PackageNamespace("tests")]) + getlex QName(PackageNamespace(""), "Object") + pushscope + + getlex Multiname("Object", [PrivateNamespace(null, "tests:TestAlwaysBreak2"), PackageNamespace(""), PackageNamespace("tests"), PackageInternalNs("tests"), Namespace("http://adobe.com/AS3/2006/builtin")]) + newclass "tests:TestAlwaysBreak2" + popscope + initproperty QName(PackageNamespace("tests"), "TestAlwaysBreak2") + + returnvoid + end ; code + end ; body + end ; method + trait class QName(PackageNamespace("tests"), "TestAlwaysBreak2") + #include "TestAlwaysBreak2.class.asasm" + end ; trait +end ; script diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto.class.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto.class.asasm new file mode 100644 index 000000000..742fe4f20 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto.class.asasm @@ -0,0 +1,111 @@ +class + refid "tests:TestGoto" + instance QName(PackageNamespace("tests"), "TestGoto") + extends QName(PackageNamespace(""), "Object") + flag SEALED + flag PROTECTEDNS + protectedns ProtectedNamespace("tests:TestGoto") + iinit + refid "tests:TestGoto/instance/init" + body + maxstack 1 + localcount 1 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + + getlocal0 + constructsuper 0 + + returnvoid + end ; code + end ; body + end ; method + trait method QName(PackageNamespace(""), "run") + method + refid "tests:TestGoto/instance/run" + returns QName(PackageNamespace(""), "void") + body + maxstack 2 + localcount 4 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + + debug 1, "v", 0, 13 + pushbyte 5 + coerce_a + setlocal1 + getlocal1 + pushbyte 1 + ifngt ofs003e + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]) + pushstring "a" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]), 1 + getlocal1 + pushbyte 2 + ifngt ofs0031 + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]) + pushstring "goto" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]), 1 + jump ofs0061 + ofs0031: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]) + pushstring "b" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]), 1 + jump ofs0047 + ofs003e: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]) + pushstring "c" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]), 1 + ofs0047: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]) + pushstring "d" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]), 1 + getlocal1 + pushbyte 3 + ifngt ofs006f + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]) + pushstring "e" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]), 1 + ofs0061: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]) + pushstring "f" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]), 1 + jump ofs0079 + ofs006f: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]) + pushstring "g" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]), 1 + ofs0079: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]) + pushstring "end" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto"),ProtectedNamespace("tests:TestGoto"),StaticProtectedNs("tests:TestGoto"),PrivateNamespace("TestGoto.as$31")]), 1 + returnvoid + + returnvoid + end ; code + end ; body + end ; method + end ; trait + end ; instance + cinit + refid "tests:TestGoto/class/init" + body + maxstack 1 + localcount 1 + initscopedepth 3 + maxscopedepth 4 + code + getlocal0 + pushscope + + returnvoid + end ; code + end ; body + end ; method +end ; class diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto.script.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto.script.asasm new file mode 100644 index 000000000..946165cc5 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto.script.asasm @@ -0,0 +1,29 @@ +script + sinit + refid "tests:TestGoto/init" + body + maxstack 2 + localcount 1 + initscopedepth 1 + maxscopedepth 3 + code + getlocal0 + pushscope + + findpropstrict Multiname("TestGoto", [PackageNamespace("tests")]) + getlex QName(PackageNamespace(""), "Object") + pushscope + + getlex Multiname("Object", [PrivateNamespace(null, "tests:TestGoto"), PackageNamespace(""), PackageNamespace("tests"), PackageInternalNs("tests"), Namespace("http://adobe.com/AS3/2006/builtin")]) + newclass "tests:TestGoto" + popscope + initproperty QName(PackageNamespace("tests"), "TestGoto") + + returnvoid + end ; code + end ; body + end ; method + trait class QName(PackageNamespace("tests"), "TestGoto") + #include "TestGoto.class.asasm" + end ; trait +end ; script diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto2.class.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto2.class.asasm new file mode 100644 index 000000000..7f01a6086 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto2.class.asasm @@ -0,0 +1,121 @@ +class + refid "tests:TestGoto2" + instance QName(PackageNamespace("tests"), "TestGoto2") + extends QName(PackageNamespace(""), "Object") + flag SEALED + flag PROTECTEDNS + protectedns ProtectedNamespace("tests:TestGoto2") + iinit + refid "tests:TestGoto2/instance/init" + body + maxstack 1 + localcount 1 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + + getlocal0 + constructsuper 0 + + returnvoid + end ; code + end ; body + end ; method + trait method QName(PackageNamespace(""), "run") + method + refid "tests:TestGoto2/instance/run" + returns QName(PackageNamespace(""), "void") + body + maxstack 2 + localcount 4 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + + debug 1, "v", 0, 13 + pushbyte 5 + coerce_a + setlocal1 + getlocal1 + pushbyte 1 + ifngt ofs003e + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]) + pushstring "a" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]), 1 + getlocal1 + pushbyte 2 + ifngt ofs0031 + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]) + pushstring "goto" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]), 1 + jump ofs0074 + ofs0031: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]) + pushstring "b" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]), 1 + jump ofs0047 + ofs003e: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]) + pushstring "c" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]), 1 + ofs0047: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]) + pushstring "d" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]), 1 + getlocal1 + pushbyte 3 + ifngt ofs008c + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]) + pushstring "e" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]), 1 + getlex Multiname("b",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]) + pushbyte 5 + ifngt ofs007e + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]) + pushstring "f" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]), 1 + ofs0074: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]) + pushstring "g" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]), 1 + ofs007e: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]) + pushstring "h" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]), 1 + jump ofs0096 + ofs008c: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]) + pushstring "i" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]), 1 + ofs0096: + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]) + pushstring "end" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageNamespace("tests"),PackageInternalNs("tests"),PrivateNamespace("tests:TestGoto2"),ProtectedNamespace("tests:TestGoto2"),StaticProtectedNs("tests:TestGoto2"),PrivateNamespace("TestGoto2.as$32")]), 1 + returnvoid + + returnvoid + end ; code + end ; body + end ; method + end ; trait + end ; instance + cinit + refid "tests:TestGoto2/class/init" + body + maxstack 1 + localcount 1 + initscopedepth 3 + maxscopedepth 4 + code + getlocal0 + pushscope + + returnvoid + end ; code + end ; body + end ; method +end ; class diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto2.script.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto2.script.asasm new file mode 100644 index 000000000..74ca55a71 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestGoto2.script.asasm @@ -0,0 +1,29 @@ +script + sinit + refid "tests:TestGoto2/init" + body + maxstack 2 + localcount 1 + initscopedepth 1 + maxscopedepth 3 + code + getlocal0 + pushscope + + findpropstrict Multiname("TestGoto2", [PackageNamespace("tests")]) + getlex QName(PackageNamespace(""), "Object") + pushscope + + getlex Multiname("Object", [PrivateNamespace(null, "tests:TestGoto2"), PackageNamespace(""), PackageNamespace("tests"), PackageInternalNs("tests"), Namespace("http://adobe.com/AS3/2006/builtin")]) + newclass "tests:TestGoto2" + popscope + initproperty QName(PackageNamespace("tests"), "TestGoto2") + + returnvoid + end ; code + end ; body + end ; method + trait class QName(PackageNamespace("tests"), "TestGoto2") + #include "TestGoto2.class.asasm" + end ; trait +end ; script diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/bin/as3_assembled.swf b/libsrc/ffdec_lib/testdata/as3_assembled/bin/as3_assembled.swf index a98b47fe1b341bdffe524dfe3a80b88b4113347c..692633add059ddcfccd1c32680b9b7dac984a9c3 100644 GIT binary patch literal 5792 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