From b82c83c2ad758888e8123cd16c3f44741b0d1ed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 11 Feb 2021 19:10:09 +0100 Subject: [PATCH] Fixed #1360 Precedence of increment/decrement operations --- CHANGELOG.md | 1 + .../abc/avm2/model/DecrementAVM2Item.java | 11 ++- .../abc/avm2/model/IncrementAVM2Item.java | 11 ++- .../action/model/DecrementActionItem.java | 11 ++- .../action/model/IncrementActionItem.java | 11 ++- .../ActionScript3AssembledDecompileTest.java | 8 ++ .../as3_assembled-0/as3_assembled-0.main.abc | Bin 5900 -> 6084 bytes .../as3_assembled-0.main.asasm | 1 + .../tests/TestDecrementPrecedence.class.asasm | 74 ++++++++++++++++++ .../TestDecrementPrecedence.script.asasm | 29 +++++++ .../as3_assembled/bin/as3_assembled.swf | Bin 3620 -> 3710 bytes 11 files changed, 149 insertions(+), 8 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestDecrementPrecedence.class.asasm create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestDecrementPrecedence.script.asasm diff --git a/CHANGELOG.md b/CHANGELOG.md index 6edf183cc..672228a42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - #1114 Script search results dialogs closing on swf close - #1159 Regexp syntax hilight when not a regexp (only division) - #1227 AS3 avoid recursion (stackoverflow) caused by newfunction instruction +- #1360 Precedence of increment/decrement operations ## [13.0.2] - 2021-02-10 ### Changed diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/DecrementAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/DecrementAVM2Item.java index e4a5e1cdb..d68f322e7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/DecrementAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/DecrementAVM2Item.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; @@ -34,7 +35,13 @@ public class DecrementAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - value.toString(writer, localData); + if (value.getPrecedence() > precedence) { + writer.append("("); + value.toString(writer, localData); + writer.append(")"); + } else { + value.toString(writer, localData); + } return writer.append(" - 1"); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IncrementAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IncrementAVM2Item.java index cb6b92304..28d410027 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IncrementAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IncrementAVM2Item.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; @@ -34,7 +35,13 @@ public class IncrementAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - value.toString(writer, localData); + if (value.getPrecedence() > precedence) { + writer.append("("); + value.toString(writer, localData); + writer.append(")"); + } else { + value.toString(writer, localData); + } return writer.append(" + 1"); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DecrementActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DecrementActionItem.java index 54adb4705..ed469588f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DecrementActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DecrementActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -48,7 +49,13 @@ public class DecrementActionItem extends ActionItem { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - object.toString(writer, localData); + if (object.getPrecedence() > precedence) { + writer.append("("); + object.toString(writer, localData); + writer.append(")"); + } else { + object.toString(writer, localData); + } return writer.append(" - 1"); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/IncrementActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/IncrementActionItem.java index d2c81e98a..c9afc828d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/IncrementActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/IncrementActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -48,7 +49,13 @@ public class IncrementActionItem extends ActionItem { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - object.toString(writer, localData); + if (object.getPrecedence() > precedence) { + writer.append("("); + object.toString(writer, localData); + writer.append(")"); + } else { + object.toString(writer, localData); + } return writer.append(" + 1"); } 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 d1c84c8f1..d7541037d 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 @@ -27,6 +27,14 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT false); } + @Test + public void testDecrementPrecedence() { + decompileMethod("assembled", "testDecrementPrecedence", "var _loc2_:int = 10;\r\n" + + "var _loc1_:int = 5;\r\n" + + "var _loc3_:* = _loc2_ & (1 << _loc1_) - 1;\r\n", + false); + } + @Test public void testDeobfuscatorJumpsExceptionStart() { decompileMethod("assembled", "testDeobfuscatorJumpsExceptionStart", "try\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 45272181334e9756dde5f67bacf24b6ea6e0c136..abe150dee6bf8b5af120a454e4f09ff2a5924dd7 100644 GIT binary patch delta 2122 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 b*cf=C?U(Gd*DAUE{NwaW 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 qL-fe6q|=F5<~5zx>FH$5c