From 0c109bc0eb55508ec62adba8fb6d18fb778636e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 25 Oct 2025 17:19:12 +0200 Subject: [PATCH] Fixed: #2546 AS3 findProperty vs temporary registers --- CHANGELOG.md | 2 + .../instructions/InstructionDefinition.java | 17 ++++ .../executing/CallPropVoidIns.java | 20 +++++ .../executing/CallPropertyIns.java | 20 +++++ .../ActionScript3AssembledDecompileTest.java | 15 +++- .../as3_assembled-0/as3_assembled-0.main.abc | Bin 10958 -> 11233 bytes .../as3_assembled-0.main.asasm | 1 + .../tests/TestFindPropertyTemp.class.asasm | 83 ++++++++++++++++++ .../tests/TestFindPropertyTemp.script.asasm | 29 ++++++ .../as3_assembled/bin/as3_assembled.swf | Bin 6304 -> 6462 bytes 10 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestFindPropertyTemp.class.asasm create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestFindPropertyTemp.script.asasm diff --git a/CHANGELOG.md b/CHANGELOG.md index f34019c79..4785aa78b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. - [#2537] AS1/2/3 direct editation - partial object literal causing lag - [#2540] AS3 getlocal after inclocal with different registers incorrectly merged - [PR224] Font CLI replace throwing NullPointer +- [#2546] AS3 findProperty vs temporary registers ## [24.1.0] - 2025-09-28 ### Added @@ -4023,6 +4024,7 @@ Major version of SWF to XML export changed to 2. [#2536]: https://www.free-decompiler.com/flash/issues/2536 [#2537]: https://www.free-decompiler.com/flash/issues/2537 [#2540]: https://www.free-decompiler.com/flash/issues/2540 +[#2546]: https://www.free-decompiler.com/flash/issues/2546 [#2477]: https://www.free-decompiler.com/flash/issues/2477 [#2478]: https://www.free-decompiler.com/flash/issues/2478 [#2485]: https://www.free-decompiler.com/flash/issues/2485 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java index 69ad99380..712b4068a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java @@ -1373,6 +1373,23 @@ public abstract class InstructionDefinition implements Serializable { } } + if (obj instanceof TemporaryItem) { + TemporaryItem temporaryItemObj = (TemporaryItem) obj; + if (temporaryItemObj.value instanceof FindPropertyAVM2Item) { + for (int i = output.size() - 1; i >= 0; i--) { + if (output.get(i) instanceof SetTemporaryItem) { + SetTemporaryItem setTemp = (SetTemporaryItem) output.get(i); + if (setTemp.getTempIndex() == temporaryItemObj.getTempIndex()) { + output.remove(i); + obj = temporaryItemObj.value; + break; + } + } + } + } + } + + Reference isStatic = new Reference<>(false); Reference type = new Reference<>(null); Reference callType = new Reference<>(null); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropVoidIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropVoidIns.java index c54644b8d..a05f7a59f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropVoidIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropVoidIns.java @@ -25,9 +25,12 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.GetPropertyIns; import com.jpexs.decompiler.flash.abc.avm2.model.CallPropertyAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.FindPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.SetTemporaryItem; +import com.jpexs.decompiler.graph.model.TemporaryItem; import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.List; @@ -85,6 +88,23 @@ public class CallPropVoidIns extends InstructionDefinition { FullMultinameAVM2Item multiname = resolveMultiname(localData, true, stack, localData.getConstants(), multinameIndex, ins, output); GraphTargetItem obj = stack.pop(); + + if (obj instanceof TemporaryItem) { + TemporaryItem temporaryItemObj = (TemporaryItem) obj; + if (temporaryItemObj.value instanceof FindPropertyAVM2Item) { + for (int i = output.size() - 1; i >= 0; i--) { + if (output.get(i) instanceof SetTemporaryItem) { + SetTemporaryItem setTemp = (SetTemporaryItem) output.get(i); + if (setTemp.getTempIndex() == temporaryItemObj.getTempIndex()) { + output.remove(i); + obj = temporaryItemObj.value; + break; + } + } + } + } + } + Reference isStatic = new Reference<>(false); Reference type = new Reference<>(null); Reference callType = new Reference<>(null); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropertyIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropertyIns.java index d522a31bc..fc5103826 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropertyIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropertyIns.java @@ -25,10 +25,13 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.GetPropertyIns; import com.jpexs.decompiler.flash.abc.avm2.model.CallPropertyAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.FindPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; import com.jpexs.decompiler.flash.ecma.NotCompileTime; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.SetTemporaryItem; +import com.jpexs.decompiler.graph.model.TemporaryItem; import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.List; @@ -85,6 +88,23 @@ public class CallPropertyIns extends InstructionDefinition { FullMultinameAVM2Item multiname = resolveMultiname(localData, true, stack, localData.getConstants(), multinameIndex, ins, output); GraphTargetItem obj = stack.pop(); + + if (obj instanceof TemporaryItem) { + TemporaryItem temporaryItemObj = (TemporaryItem) obj; + if (temporaryItemObj.value instanceof FindPropertyAVM2Item) { + for (int i = output.size() - 1; i >= 0; i--) { + if (output.get(i) instanceof SetTemporaryItem) { + SetTemporaryItem setTemp = (SetTemporaryItem) output.get(i); + if (setTemp.getTempIndex() == temporaryItemObj.getTempIndex()) { + output.remove(i); + obj = temporaryItemObj.value; + break; + } + } + } + } + } + Reference isStatic = new Reference<>(false); Reference type = new Reference<>(null); Reference callType = new Reference<>(null); 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 b7ef968e9..10b7acaf4 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 @@ -92,8 +92,8 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT @Test public void testCollidingPublicTraits() { - decompileMethod("assembled", "testCollidingPublicTraits", "trace(\"ns1 = \" + this.a#89);\r\n" - + "trace(\"ns2 = \" + this.a#90);\r\n", + decompileMethod("assembled", "testCollidingPublicTraits", "trace(\"ns1 = \" + this.a#90);\r\n" + + "trace(\"ns2 = \" + this.a#91);\r\n", false); } @@ -167,6 +167,17 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT false); } + @Test + public void testFindPropertyTemp() { + decompileMethod("assembled", "testFindPropertyTemp", "var _temp_1:* = _loc1_.target;\r\n" + + "_temp_1.method();\r\n" + + "testA = _temp_1;\r\n" + + "var _temp_3:* = _loc9_[_loc2_];\r\n" + + "testB(_temp_3,new (getDefinitionByName(\"Str_\" + _temp_3))().sub);\r\n" + + "_loc2_++;\r\n", + false); + } + @Test public void testForEach() { decompileMethod("assembled", "testForEach", "var _loc5_:* = undefined;\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 52d7d2259868ff0813b2e669a7ad1c4f1b9e3ba5..17f1b2d08ea25ef696164158737eeafc53572582 100644 GIT binary patch delta 4121 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 Jrd=&Y{sya46lVYc delta 3900 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 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 31eebceb2..ffcdba87c 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 @@ -43,5 +43,6 @@ program #include "tests/TestConstructDynamically.script.asasm" #include "tests/TestCollidingPublicTraits.script.asasm" #include "tests/TestSetGetLocalOnStack.script.asasm" + #include "tests/TestFindPropertyTemp.script.asasm" ; place to add next end ; program diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestFindPropertyTemp.class.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestFindPropertyTemp.class.asasm new file mode 100644 index 000000000..8397f1c4c --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestFindPropertyTemp.class.asasm @@ -0,0 +1,83 @@ +class + refid "tests:TestFindPropertyTemp" + instance QName(PackageNamespace("tests"), "TestFindPropertyTemp") + extends QName(PackageNamespace(""), "Object") + flag SEALED + flag PROTECTEDNS + protectedns ProtectedNamespace("tests:TestFindPropertyTemp") + iinit + refid "tests:TestFindPropertyTemp/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:TestFindPropertyTemp/instance/run" + returns QName(PackageNamespace(""), "void") + body + maxstack 2 + localcount 4 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + + findproperty QName(PackageNamespace(""),"testA") + getlocal1 + getproperty QName(PackageNamespace(""),"target") + dup + callpropvoid QName(PackageNamespace(""),"method"), 0 + setproperty QName(PackageNamespace(""),"testA") + findproperty QName(PackageNamespace(""),"testB") + getlocal 9 + getlocal2 + getproperty MultinameL([PackageNamespace("")]) + dup + pushstring "Str_" + swap + add + dup + findproperty MultinameL([PackageNamespace("")]) + swap + getproperty MultinameL([PackageNamespace("")]) + construct 0 + getproperty QName(PackageNamespace(""),"sub") + callpropvoid QName(PackageNamespace(""),"testB"), 2 + inclocal_i 2 + + returnvoid + end ; code + end ; body + end ; method + end ; trait + end ; instance + cinit + refid "tests:TestFindPropertyTemp/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/TestFindPropertyTemp.script.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestFindPropertyTemp.script.asasm new file mode 100644 index 000000000..984384f87 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestFindPropertyTemp.script.asasm @@ -0,0 +1,29 @@ +script + sinit + refid "tests:TestFindPropertyTemp/init" + body + maxstack 2 + localcount 1 + initscopedepth 1 + maxscopedepth 3 + code + getlocal0 + pushscope + + findpropstrict Multiname("TestFindPropertyTemp", [PackageNamespace("tests")]) + getlex QName(PackageNamespace(""), "Object") + pushscope + + getlex Multiname("Object", [PrivateNamespace(null, "tests:TestFindPropertyTemp"), PackageNamespace(""), PackageNamespace("tests"), PackageInternalNs("tests"), Namespace("http://adobe.com/AS3/2006/builtin")]) + newclass "tests:TestFindPropertyTemp" + popscope + initproperty QName(PackageNamespace("tests"), "TestFindPropertyTemp") + + returnvoid + end ; code + end ; body + end ; method + trait class QName(PackageNamespace("tests"), "TestFindPropertyTemp") + #include "TestFindPropertyTemp.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 f968761bde1c17775faadb075a6dc6376dfc9002..69818499f16c7976dee94f58f6c27dd24645753a 100644 GIT binary patch literal 6462 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