From 6b559cab3d433d719418df066da77895d0d69361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 1 Sep 2025 19:58:31 +0200 Subject: [PATCH] New Assembled TestSetGetLocalOnStack --- .../localregs/GetLocalTypeIns.java | 22 ++++- .../graph/model/SetTemporaryItem.java | 2 +- .../ActionScript3AssembledDecompileTest.java | 10 ++- .../as3_assembled-0/as3_assembled-0.main.abc | Bin 10716 -> 10958 bytes .../as3_assembled-0.main.asasm | 1 + .../tests/TestSetGetLocalOnStack.class.asasm | 78 ++++++++++++++++++ .../tests/TestSetGetLocalOnStack.script.asasm | 29 +++++++ .../as3_assembled/bin/as3_assembled.swf | Bin 6164 -> 6304 bytes 8 files changed, 136 insertions(+), 6 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSetGetLocalOnStack.class.asasm create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSetGetLocalOnStack.script.asasm diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java index 539d2fdb5..9137cbea2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java @@ -27,7 +27,6 @@ import com.jpexs.decompiler.flash.abc.avm2.model.CoerceAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.ConvertAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.DecLocalAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.DecrementAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.GetPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.IncLocalAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.IncrementAVM2Item; @@ -47,11 +46,10 @@ import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; -import com.jpexs.decompiler.graph.model.CommaExpressionItem; import com.jpexs.decompiler.graph.model.DuplicateItem; import com.jpexs.decompiler.graph.model.DuplicateSourceItem; +import com.jpexs.decompiler.graph.model.PushItem; import com.jpexs.decompiler.graph.model.SetTemporaryItem; -import com.jpexs.decompiler.graph.model.TemporaryItem; import java.util.List; /** @@ -126,6 +124,24 @@ public abstract class GetLocalTypeIns extends InstructionDefinition { stack.finishBlock(output); + if (!output.isEmpty()) { + if (output.get(output.size() - 1) instanceof SetLocalAVM2Item) { + SetLocalAVM2Item setLocal = (SetLocalAVM2Item) output.get(output.size() - 1); + if (setLocal.regIndex == regId) { + if (setLocal.getSrc() != null) { + if (localData.getSetLocalUsages(localData.code.adr2pos(setLocal.getSrc().getAddress())).size() == 1) { + if (output.size() >= 2 && output.get(output.size() - 2) instanceof PushItem) { + output.remove(output.size() - 1); + stack.moveToStack(output); + stack.push(setLocal.value); + return; + } + } + } + } + } + } + //TestIncDec7 AIR if (!output.isEmpty()) { GraphTargetItem lastOutput = output.get(output.size() - 1); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/SetTemporaryItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/SetTemporaryItem.java index 8913f4a83..874e76ca2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/SetTemporaryItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/SetTemporaryItem.java @@ -29,7 +29,7 @@ import java.util.List; import java.util.Set; /** - * Duplicate item. + * Set temporary item. * * @author JPEXS */ 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 d7762750c..b7ef968e9 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#87);\r\n" - + "trace(\"ns2 = \" + this.a#88);\r\n", + decompileMethod("assembled", "testCollidingPublicTraits", "trace(\"ns1 = \" + this.a#89);\r\n" + + "trace(\"ns2 = \" + this.a#90);\r\n", false); } @@ -363,6 +363,12 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT false); } + @Test + public void testSetGetLocalOnStack() { + decompileMethod("assembled", "testSetGetLocalOnStack", "this.arr[this.cnt++] = param1;\r\n", + false); + } + @Test public void testSetSlotDup() { decompileMethod("assembled", "testSetSlotDup", "var myslot:int;\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 0fab917859c34cc1aa3cb95f15db16da923d7e6c..52d7d2259868ff0813b2e669a7ad1c4f1b9e3ba5 100644 GIT binary patch delta 3270 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 I37;ta50sFZ)c^nh delta 3032 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 CDP*Yt 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 c12e584cb..31eebceb2 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 @@ -42,5 +42,6 @@ program #include "tests/TestPushPlacement.script.asasm" #include "tests/TestConstructDynamically.script.asasm" #include "tests/TestCollidingPublicTraits.script.asasm" + #include "tests/TestSetGetLocalOnStack.script.asasm" ; place to add next end ; program diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSetGetLocalOnStack.class.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSetGetLocalOnStack.class.asasm new file mode 100644 index 000000000..534768059 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSetGetLocalOnStack.class.asasm @@ -0,0 +1,78 @@ +class + refid "tests:TestSetGetLocalOnStack" + instance QName(PackageNamespace("tests"), "TestSetGetLocalOnStack") + extends QName(PackageNamespace(""), "Object") + flag SEALED + flag PROTECTEDNS + protectedns ProtectedNamespace("tests:TestSetGetLocalOnStack") + iinit + refid "tests:TestSetGetLocalOnStack/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:TestSetGetLocalOnStack/instance/run" + param QName(PackageNamespace(""),"Object") + returns QName(PackageNamespace(""), "void") + body + maxstack 2 + localcount 4 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + getlocal0 + getproperty QName(PackageNamespace(""),"arr") + getlocal0 + dup + setlocal3 + getproperty QName(PackageNamespace(""),"cnt") + dup + increment_i + setlocal 4 + getlocal3 + getlocal 4 + setproperty QName(PackageNamespace(""),"cnt") + kill 4 + kill 3 + setlocal2 + getlocal2 + getlocal1 + setproperty MultinameL([PackageNamespace(""), PackageNamespace("MyTest")]) + returnvoid + end ; code + end ; body + end ; method + end ; trait + end ; instance + cinit + refid "tests:TestSetGetLocalOnStack/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/TestSetGetLocalOnStack.script.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSetGetLocalOnStack.script.asasm new file mode 100644 index 000000000..c980b6f46 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestSetGetLocalOnStack.script.asasm @@ -0,0 +1,29 @@ +script + sinit + refid "tests:TestSetGetLocalOnStack/init" + body + maxstack 2 + localcount 1 + initscopedepth 1 + maxscopedepth 3 + code + getlocal0 + pushscope + + findpropstrict Multiname("TestSetGetLocalOnStack", [PackageNamespace("tests")]) + getlex QName(PackageNamespace(""), "Object") + pushscope + + getlex Multiname("Object", [PrivateNamespace(null, "tests:TestSetGetLocalOnStack"), PackageNamespace(""), PackageNamespace("tests"), PackageInternalNs("tests"), Namespace("http://adobe.com/AS3/2006/builtin")]) + newclass "tests:TestSetGetLocalOnStack" + popscope + initproperty QName(PackageNamespace("tests"), "TestSetGetLocalOnStack") + + returnvoid + end ; code + end ; body + end ; method + trait class QName(PackageNamespace("tests"), "TestSetGetLocalOnStack") + #include "TestSetGetLocalOnStack.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 8bdb6ef118f5f3eddff6d165fbbb8cd28e31c462..f968761bde1c17775faadb075a6dc6376dfc9002 100644 GIT binary patch literal 6304 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 literal 6164 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