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;
+
}
}
}