diff --git a/CHANGELOG.md b/CHANGELOG.md index 242aa0b70..647469bd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ All notable changes to this project will be documented in this file. - [#2077] AS3 recursion of deleting method with newfunction instruction - [#2077] AS3 direct editation - incorrect slot names - [#2077] AS3 direct editation - switch statement missing offset +- [#2077] AS3 allow star string as property name (XML access) ### Changed - [#2070] String values inside SWF to XML export are backslash escaped diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java index 2784c6399..e97669ba1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java @@ -135,7 +135,12 @@ public class FullMultinameAVM2Item extends AVM2Item { AVM2ConstantPool constants = localData.constantsAvm2; List fullyQualifiedNames = property ? new ArrayList<>() : localData.fullyQualifiedNames; if (multinameIndex > 0 && multinameIndex < constants.getMultinameCount()) { - writer.append(constants.getMultiname(multinameIndex).getNameWithCustomNamespace(localData.abc, fullyQualifiedNames, false, true)); + String simpleName = constants.getMultiname(multinameIndex).getName(constants, fullyQualifiedNames, true, false); + if ("*".equals(simpleName)) { + writer.append("*"); + } else { + writer.append(constants.getMultiname(multinameIndex).getNameWithCustomNamespace(localData.abc, fullyQualifiedNames, false, true)); + } } else { writer.append("§§multiname(").append(multinameIndex).append(")"); } 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 36d7c8be5..9e7f62611 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 @@ -466,4 +466,14 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "}\r\n", false); } + + @Test + public void testXmlStar() { + decompileMethod("assembled", "testXmlStar", "var _loc1_:XML = \r\n" + + "xxx\r\n" + + "yyy\r\n" + + ";\r\n" + + "var _loc2_:* = _loc1_.b.*;\r\n", + false); + } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java index cc5aa69db..feff1eae7 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java @@ -2315,7 +2315,8 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "\r\n" + "\r\n" + "\r\n" - + ";\r\n", + + ";\r\n" + + "var m:XMLList = myXML.*;\r\n", false); } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java index 0d4a703c4..d82c9a2a7 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java @@ -2178,6 +2178,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "var xattrval:String = null;\r\n" + "var xcontent:String = null;\r\n" + "var xxx:XML = null;\r\n" + + "var m:XMLList = null;\r\n" + "var name:String = \"ahoj\";\r\n" + "var myXML:XML = \r\n" + "\r\n" @@ -2314,7 +2315,8 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "-->\r\n" + "\r\n" + "\r\n" - + ";\r\n", + + ";\r\n" + + "m = myXML.*;\r\n", false); } } 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 dcd6565ef..486f97e2a 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 5f2dcc9d5..5c4ff8069 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 @@ -33,5 +33,6 @@ program #include "tests/TestSwapAssignment.script.asasm" #include "tests/TestMutatingSwitch.script.asasm" #include "tests/TestSwitchMostCommon.script.asasm" + #include "tests/TestXmlStar.script.asasm" ; place to add next end ; program diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestXmlStar.class.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestXmlStar.class.asasm new file mode 100644 index 000000000..abe581cdd --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestXmlStar.class.asasm @@ -0,0 +1,69 @@ +class + refid "tests:TestXmlStar" + instance QName(PackageNamespace("tests"), "TestXmlStar") + extends QName(PackageNamespace(""), "Object") + flag SEALED + flag PROTECTEDNS + protectedns ProtectedNamespace("tests:TestXmlStar") + iinit + refid "tests:TestXmlStar/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:TestXmlStar/instance/run" + returns QName(PackageNamespace(""), "void") + body + maxstack 2 + localcount 4 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + getlex QName(PackageNamespace(""),"XML") + pushstring "\r\n xxx\r\n yyy\r\n " + construct 1 + coerce QName(PackageNamespace(""),"XML") + setlocal1 + getlocal1 + getproperty Multiname("b",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageInternalNs(""),PrivateNamespace("Run"),ProtectedNamespace("Run"),StaticProtectedNs("Run"),PrivateNamespace("Run.as$0")]) + getproperty Multiname("*",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageInternalNs(""),PrivateNamespace("Run"),ProtectedNamespace("Run"),StaticProtectedNs("Run"),PrivateNamespace("Run.as$0")]) + setlocal2 + + returnvoid + end ; code + end ; body + end ; method + end ; trait + end ; instance + cinit + refid "tests:TestXmlStar/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/TestXmlStar.script.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestXmlStar.script.asasm new file mode 100644 index 000000000..e239f2776 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestXmlStar.script.asasm @@ -0,0 +1,29 @@ +script + sinit + refid "tests:TestXmlStar/init" + body + maxstack 2 + localcount 1 + initscopedepth 1 + maxscopedepth 3 + code + getlocal0 + pushscope + + findpropstrict Multiname("TestXmlStar", [PackageNamespace("tests")]) + getlex QName(PackageNamespace(""), "Object") + pushscope + + getlex Multiname("Object", [PrivateNamespace(null, "tests:TestXmlStar"), PackageNamespace(""), PackageNamespace("tests"), PackageInternalNs("tests"), Namespace("http://adobe.com/AS3/2006/builtin")]) + newclass "tests:TestXmlStar" + popscope + initproperty QName(PackageNamespace("tests"), "TestXmlStar") + + returnvoid + end ; code + end ; body + end ; method + trait class QName(PackageNamespace("tests"), "TestXmlStar") + #include "TestXmlStar.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 c02438b40..f4f0ef099 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 diff --git a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf index 252b4f360..368c2a0d6 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf and b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf index 256528108..878c2041f 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf and b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestXml.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestXml.as index 52ecb6ade..794daa4ae 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestXml.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestXml.as @@ -51,8 +51,11 @@ package tests ; //intentionally on new line + + + var m:XMLList = myXML.*; } } -} \ No newline at end of file +}