diff --git a/CHANGELOG.md b/CHANGELOG.md index f04fd10ea..ca7686736 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ All notable changes to this project will be documented in this file. - [#1936] AS3 Direct editation - handling undefined variables - [#1936] AS3 Direct editation - colliding try..catch variable - [#1936] AS3 Direct editation - missing pop after call +- [#1936] AS3 Direct editation - slots increment, decrement ## [18.3.2] - 2023-01-10 ### Removed diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index aff42e513..4ffee7c07 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -1839,6 +1839,9 @@ public class AVM2Code implements Cloneable { GraphTargetItem value = null; if (item instanceof SetSlotAVM2Item) { SetSlotAVM2Item ss = (SetSlotAVM2Item) item; + if (ss.slotName == null) { + break; + } propNameStr = ss.slotName.getName(abc.constants, new ArrayList<>(), true, true); value = ss.value; } else if (item instanceof SetPropertyAVM2Item) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java index 9bbc44457..639329789 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java @@ -352,7 +352,6 @@ public class NameAVM2Item extends AssignableAVM2Item { } } return toSourceMerge(localData, generator, - slotNumber > -1 ? ins(AVM2Instructions.GetScopeObject, slotScope) : null, //Start get original generateGetLoc(regNumber), generateGetSlot(slotScope, slotNumber), //End get original @@ -363,7 +362,11 @@ public class NameAVM2Item extends AssignableAVM2Item { (post) ? (decrement ? ins(isInteger ? AVM2Instructions.DecrementI : AVM2Instructions.Decrement) : ins(isInteger ? AVM2Instructions.IncrementI : AVM2Instructions.Increment)) : null, generateCoerce(localData, generator, returnType()), generateSetLoc(regNumber), - slotNumber > -1 ? ins(AVM2Instructions.SetSlot, slotNumber) : null + slotNumber > -1 ? Arrays.asList( + ins(AVM2Instructions.GetScopeObject, slotScope), + ins(AVM2Instructions.Swap), + ins(AVM2Instructions.SetSlot, slotNumber) + ) : null ); } 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 d6bd85e02..f526b0f1a 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 @@ -1502,6 +1502,21 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile false); } + @Test + public void testSlots() { + decompileMethod("classic_air", "testSlots", "var i:int = 1;\r\n" + + "var f:* = function():void\r\n" + + "{\r\n" + + "trace(\"hello\");\r\n" + + "};\r\n" + + "i = 0;\r\n" + + "trace(i++);\r\n" + + "trace(i--);\r\n" + + "trace(++i);\r\n" + + "trace(--i);\r\n", + false); + } + @Test public void testStrictEquals() { decompileMethod("classic_air", "testStrictEquals", "var k:int = 6;\r\n" 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 75e4cb411..e22f908db 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 @@ -1494,6 +1494,21 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes false); } + @Test + public void testSlots() { + decompileMethod("classic", "testSlots", "var i:int = 1;\r\n" + + "var f:* = function():void\r\n" + + "{\r\n" + + "trace(\"hello\");\r\n" + + "};\r\n" + + "i = 0;\r\n" + + "trace(i++);\r\n" + + "trace(i--);\r\n" + + "trace(++i);\r\n" + + "trace(--i);\r\n", + false); + } + @Test public void testStrictEquals() { decompileMethod("classic", "testStrictEquals", "var k:int = 6;\r\n" 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 a16e2ebbe..e8bbbe361 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 42957d11c..5f757efec 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/Main.as b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as index 0bf978bae..a93b41a69 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as @@ -94,6 +94,7 @@ package TestProperty; TestRegExp; TestRest; + TestSlots; TestStrictEquals; TestStringConcat; TestStrings; diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestSlots.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestSlots.as new file mode 100644 index 000000000..62c403716 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestSlots.as @@ -0,0 +1,20 @@ +package tests +{ + + public class TestSlots + { + public function run():* + { + var i:int = 1; + var f = function():void + { + trace("hello"); + }; + i = 0; + trace(i++); + trace(i--); + trace(++i); + trace(--i); + } + } +} \ No newline at end of file