diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java index f9f889692..a46059897 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java @@ -174,6 +174,14 @@ public class Multiname { public void setDisplayNamespace(boolean displayNamespace) { this.displayNamespace = displayNamespace; } + + /** + * Checks whether this multiname displays its namespace as #suffix + * @return True when displays + */ + public boolean doesDisplayNamespace() { + return displayNamespace; + } /** * Checks if the multiname kind is valid. diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/DependencyParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/DependencyParser.java index b2e7e5828..752811ff9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/DependencyParser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/DependencyParser.java @@ -140,7 +140,7 @@ public class DependencyParser { Namespace ns = m.getNamespace(abc.constants); String name = m.getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, true, true); NamespaceSet nss = m.getNamespaceSet(abc.constants); - if (ns != null) { + if (ns != null && !m.doesDisplayNamespace()) { parseDependenciesFromNS(abcIndex, ignoredCustom, abc, dependencies, m.namespace_index, ignorePackage, name, dependencyType, uses); } if (nss != null) { diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScriptTestBase.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScriptTestBase.java index adee3879d..3e9402522 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScriptTestBase.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScriptTestBase.java @@ -26,6 +26,8 @@ public class ActionScriptTestBase { pCode = pCode.replaceAll("\t", " ").trim(); pCode = pCode.replaceAll("( *[\r\n]+ *)+", "\n").trim(); pCode = pCode.replaceAll(" +", " ").trim(); + //replace ns suffixes, so testCollidingPublicTraits will work even when ns indices change + pCode = pCode.replaceAll("#[0-9]+", "#_"); return pCode; } } 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 717af5971..a0d3eef70 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 @@ -90,6 +90,13 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT false); } + @Test + public void testCollidingPublicTraits() { + decompileMethod("assembled", "testCollidingPublicTraits", "trace(\"ns1 = \" + this.a#87);\r\n" + + "trace(\"ns2 = \" + this.a#88);\r\n", + false); + } + @Test public void testDeclareReg() { decompileMethod("assembled", "testDeclareReg", "var other:XML;\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 b6b6498f0..0fab91785 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.abc and b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.abc differ 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 61760f42a..c12e584cb 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 @@ -41,5 +41,6 @@ program #include "tests/TestAlwaysBreak2.script.asasm" #include "tests/TestPushPlacement.script.asasm" #include "tests/TestConstructDynamically.script.asasm" + #include "tests/TestCollidingPublicTraits.script.asasm" ; place to add next end ; program diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestCollidingPublicTraits.class.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestCollidingPublicTraits.class.asasm new file mode 100644 index 000000000..8f0a5b775 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestCollidingPublicTraits.class.asasm @@ -0,0 +1,80 @@ +class + refid "tests:TestCollidingPublicTraits" + instance QName(PackageNamespace("tests"), "TestCollidingPublicTraits") + extends QName(PackageNamespace(""), "Object") + flag SEALED + flag PROTECTEDNS + protectedns ProtectedNamespace("tests:TestCollidingPublicTraits") + iinit + refid "tests:TestCollidingPublicTraits/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 slot QName(PackageNamespace("test1"),"a") + slotid 0 + type QName(PackageNamespace(""),"int") + value Integer(1) + end ; trait + trait slot QName(PackageNamespace("test2"),"a") + slotid 0 + type QName(PackageNamespace(""),"int") + value Integer(2) + end ; trait + trait method QName(PackageNamespace(""), "run") + method + refid "tests:TestCollidingPublicTraits/instance/run" + returns QName(PackageNamespace(""), "void") + body + maxstack 2 + localcount 4 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + findpropstrict QName(PackageNamespace(""),"trace") + pushstring "ns1 = " + getlocal0 + getproperty QName(PackageNamespace("test1"),"a") + add + callpropvoid QName(PackageNamespace(""),"trace"), 1 + findpropstrict QName(PackageNamespace(""),"trace") + pushstring "ns2 = " + getlocal0 + getproperty QName(PackageNamespace("test2"),"a") + add + callpropvoid QName(PackageNamespace(""),"trace"), 1 + returnvoid + end ; code + end ; body + end ; method + end ; trait + end ; instance + cinit + refid "tests:TestCollidingPublicTraits/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/TestCollidingPublicTraits.script.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestCollidingPublicTraits.script.asasm new file mode 100644 index 000000000..1d8c382ab --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestCollidingPublicTraits.script.asasm @@ -0,0 +1,29 @@ +script + sinit + refid "tests:TestCollidingPublicTraits/init" + body + maxstack 2 + localcount 1 + initscopedepth 1 + maxscopedepth 3 + code + getlocal0 + pushscope + + findpropstrict Multiname("TestCollidingPublicTraits", [PackageNamespace("tests")]) + getlex QName(PackageNamespace(""), "Object") + pushscope + + getlex Multiname("Object", [PrivateNamespace(null, "tests:TestCollidingPublicTraits"), PackageNamespace(""), PackageNamespace("tests"), PackageInternalNs("tests"), Namespace("http://adobe.com/AS3/2006/builtin")]) + newclass "tests:TestCollidingPublicTraits" + popscope + initproperty QName(PackageNamespace("tests"), "TestCollidingPublicTraits") + + returnvoid + end ; code + end ; body + end ; method + trait class QName(PackageNamespace("tests"), "TestCollidingPublicTraits") + #include "TestCollidingPublicTraits.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 1f3441cb9..8bdb6ef11 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_assembled/bin/as3_assembled.swf and b/libsrc/ffdec_lib/testdata/as3_assembled/bin/as3_assembled.swf differ