diff --git a/CHANGELOG.md b/CHANGELOG.md index f82a8feca..813916180 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ All notable changes to this project will be documented in this file. - Focused byte barely visible in hex view - AS3 P-code editation - only first try offset was saved when multiple try with same label - AS3 decompilation: try..catch..finally suborder when debugline info not present +- AS3 decompilation: increment/decrement on properties ### Changed - #1565, #1407, #1350 On BinaryData SWF save, parent SWF is saved diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetPropertyIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetPropertyIns.java index 4cc2cca66..7ad9ccff1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetPropertyIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetPropertyIns.java @@ -132,12 +132,81 @@ public class SetPropertyIns extends InstructionDefinition implements SetTypeIns return; } } + if (notCoerced instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) notCoerced; + if (((FullMultinameAVM2Item) getProp.propertyName).compareSame(multiname)) { + if (getProp.object instanceof DuplicateItem) { //assembled/TestIncrement3 + if (getProp.object.value == obj) { + getProp.object = obj; + } + } + + stack.pop(); + if (isIncrement) { + stack.push(new PostIncrementAVM2Item(ins, localData.lineStartInstruction, getProp)); + } else { + stack.push(new PostDecrementAVM2Item(ins, localData.lineStartInstruction, getProp)); + } + return; + } + } } } } } + if ((value instanceof IncrementAVM2Item) || (value instanceof DecrementAVM2Item)) { + boolean isIncrement = (value instanceof IncrementAVM2Item); + + boolean hasConvert = value.value instanceof ConvertAVM2Item; + if (value.value.getNotCoercedNoDup() instanceof GetLexAVM2Item) { + GetLexAVM2Item getLex = (GetLexAVM2Item) value.value.getNotCoercedNoDup(); + if (localData.abc.constants.getMultiname(multinameIndex).equals(getLex.propertyName)) { + if (hasConvert) { + if (isIncrement) { + output.add(new PostIncrementAVM2Item(ins, localData.lineStartInstruction, getLex)); + } else { + output.add(new PostDecrementAVM2Item(ins, localData.lineStartInstruction, getLex)); + } + } else { + if (isIncrement) { + output.add(new PreIncrementAVM2Item(ins, localData.lineStartInstruction, getLex)); + } else { + output.add(new PreDecrementAVM2Item(ins, localData.lineStartInstruction, getLex)); + } + } + return; + } + } + + if (value.value.getNotCoercedNoDup() instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) value.value.getNotCoercedNoDup(); + if (((FullMultinameAVM2Item) getProp.propertyName).compareSame(multiname)) { + + if (getProp.object instanceof DuplicateItem) { + if (getProp.object.value == obj) { + getProp.object = obj; + } + } + if (hasConvert) { + if (isIncrement) { + output.add(new PostIncrementAVM2Item(ins, localData.lineStartInstruction, getProp)); + } else { + output.add(new PostDecrementAVM2Item(ins, localData.lineStartInstruction, getProp)); + } + } else { + if (isIncrement) { + output.add(new PreIncrementAVM2Item(ins, localData.lineStartInstruction, getProp)); + } else { + output.add(new PreDecrementAVM2Item(ins, localData.lineStartInstruction, getProp)); + } + } + return; + } + } + } + //assembled/TestIncrement2 if (value instanceof DuplicateItem) { GraphTargetItem duplicated = value.value; @@ -158,29 +227,22 @@ public class SetPropertyIns extends InstructionDefinition implements SetTypeIns return; } } - } - } - } - } - //assembled/TestIncrement3 - if ((value instanceof IncrementAVM2Item) || (value instanceof DecrementAVM2Item)) { - boolean isIncrement = (value instanceof IncrementAVM2Item); - if (value.value.getNotCoerced() instanceof GetPropertyAVM2Item) { - GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) value.value.getNotCoerced(); - if (getProp.object instanceof DuplicateItem) { - if (getProp.object.value == obj) { - getProp.object = obj; - if (isIncrement) { - output.add(new PreIncrementAVM2Item(ins, localData.lineStartInstruction, getProp)); - } else { - output.add(new PreDecrementAVM2Item(ins, localData.lineStartInstruction, getProp)); + if (incrementedProp instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) incrementedProp; + if (((FullMultinameAVM2Item) getProp.propertyName).compareSame(multiname)) { + stack.pop(); + if (isIncrement) { + stack.push(new PreIncrementAVM2Item(ins, localData.lineStartInstruction, getProp)); + } else { + stack.push(new PreDecrementAVM2Item(ins, localData.lineStartInstruction, getProp)); + } + return; + } } - return; } } } } - if (value instanceof LocalRegAVM2Item) { LocalRegAVM2Item valueLocalReg = (LocalRegAVM2Item) value; LocalRegAVM2Item nameLocalReg = 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 a91795b3a..158c52711 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 @@ -127,7 +127,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT @Test public void testIncrement3() { - decompileMethod("assembled", "testIncrement3", "--_loc1_.length;\r\n", + decompileMethod("assembled", "testIncrement3", "_loc1_.length--;\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 53f20077e..dec573313 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 @@ -294,9 +294,9 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile public void testDotParent() { decompileMethod("classic_air", "testDotParent", "var d:* = new TestClass1();\r\n" + "var k:* = null;\r\n" - + "k.(++d.attrib, false);\r\n" + + "k.(d.attrib++, false);\r\n" + "trace(\"between\");\r\n" - + "var g:* = k.(++d.attrib, false);\r\n" + + "var g:* = k.(d.attrib++, false);\r\n" + "trace(\"end\");\r\n", false); } @@ -855,7 +855,19 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "var index:uint = 0;\r\n" + "chars[index++] = 5;\r\n" + "trace(\"arr[++e]\");\r\n" - + "chars[++index] = 5;\r\n", + + "chars[++index] = 5;\r\n" + + "trace(\"attr++\");\r\n" + + "trace(attrx++);\r\n" + + "attrx++;\r\n" + + "trace(\"attr--\");\r\n" + + "trace(attrx--);\r\n" + + "attrx--;\r\n" + + "trace(\"++attr\");\r\n" + + "trace(++attrx);\r\n" + + "++attrx;\r\n" + + "trace(\"--attr\");\r\n" + + "trace(--attrx);\r\n" + + "--attrx;\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 6aa8afd73..6297f6579 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 @@ -848,7 +848,19 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "chars[_loc7_] = 5;\r\n" + "trace(\"arr[++e]\");\r\n" + "var _loc8_:* = ++index;\r\n" - + "chars[_loc8_] = 5;\r\n", + + "chars[_loc8_] = 5;\r\n" + + "trace(\"attr++\");\r\n" + + "trace(this.attrx++);\r\n" + + "++this.attrx;\r\n" + + "trace(\"attr--\");\r\n" + + "trace(this.attrx--);\r\n" + + "--this.attrx;\r\n" + + "trace(\"++attr\");\r\n" + + "trace(++this.attrx);\r\n" + + "++this.attrx;\r\n" + + "trace(\"--attr\");\r\n" + + "trace(--this.attrx);\r\n" + + "--this.attrx;\r\n", false); } 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 7bc4db870..45e806404 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 4906a8a77..8b810703b 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/obj/as3_newConfig.old b/libsrc/ffdec_lib/testdata/as3_new/obj/as3_newConfig.old index 5c708a686..fc23fc482 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/obj/as3_newConfig.old +++ b/libsrc/ffdec_lib/testdata/as3_new/obj/as3_newConfig.old @@ -16,7 +16,7 @@ CONFIG::timeStamp - '16.02.2021' + '21.02.2021' CONFIG::air diff --git a/libsrc/ffdec_lib/testdata/as3_new/obj/as3_newConfig.xml b/libsrc/ffdec_lib/testdata/as3_new/obj/as3_newConfig.xml index 5c708a686..fc23fc482 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/obj/as3_newConfig.xml +++ b/libsrc/ffdec_lib/testdata/as3_new/obj/as3_newConfig.xml @@ -16,7 +16,7 @@ CONFIG::timeStamp - '16.02.2021' + '21.02.2021' CONFIG::air diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestIncDec.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestIncDec.as index 82989f87d..9e9d6e1d8 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestIncDec.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestIncDec.as @@ -3,6 +3,9 @@ package tests public class TestIncDec { + + private var attrx:int = 0; + public function run():* { var a:* = 5; @@ -39,6 +42,19 @@ package tests chars[index++] = 5; trace("arr[++e]"); chars[++index] = 5; + trace("attr++"); + trace(attrx++); + attrx++; + trace("attr--"); + trace(attrx--); + attrx--; + trace("++attr"); + trace(++attrx); + ++attrx; + trace("--attr"); + trace(--attrx); + --attrx; + } } }