diff --git a/CHANGELOG.md b/CHANGELOG.md index ec52ef485..ce0718e79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file. - [#1892] AS3 - Package internal custom namespaces - Unpin all context menu not clearing pins properly - AS3 - RegExp escaping +- Avoid Error Implicit coercion of a value of type XXX to an unrelated type YYY ## [17.0.2] - 2022-11-22 ### Fixed diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java index 656c1796b..7ebadfc87 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java @@ -128,7 +128,7 @@ public class FullMultinameAVM2Item extends AVM2Item { if (name instanceof IntegerValueAVM2Item) { name.toString(writer, localData); } else { - name.toStringString(writer, localData); + name.toString(writer, localData); } writer.append("]"); } else { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NameValuePair.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NameValuePair.java index 87693f548..cfc1dc732 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NameValuePair.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NameValuePair.java @@ -54,7 +54,7 @@ public class NameValuePair extends AVM2Item { if ((name instanceof ConvertAVM2Item) && ((ConvertAVM2Item)name).type.equals(TypeItem.STRING)) { name = name.value; } - name.toStringString(writer, localData); + name.toString(writer, localData); if (needsParents) { writer.append(")"); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java index 133ac8fbc..44df30e45 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java @@ -44,6 +44,7 @@ import com.jpexs.decompiler.graph.model.TrueItem; import com.jpexs.helpers.Reference; import java.io.Serializable; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -332,13 +333,26 @@ public abstract class GraphTargetItem implements Serializable, Cloneable { public GraphTextWriter appendTry(GraphTextWriter writer, LocalData localData, String implicitCoerce) throws InterruptedException { GraphTargetItem t = this; - /*if (!implicitCoerce.isEmpty()) { //if implicit coerce equals explicit - if (t instanceof ConvertAVM2Item) { + if (!implicitCoerce.isEmpty()) { //if implicit oerce equals explicit + /*if (t instanceof ConvertAVM2Item) { if (implicitCoerce.equals((((ConvertAVM2Item) t).type.toString()))) { t = t.value; } + }*/ + if (localData.abc != null) { //its AS3 + List numberTypes = Arrays.asList("int", "uint", "Number"); + String returnTypeStr = t.returnType().toString(); + + //To avoid Error: Implicit coercion of a value of type XXX to an unrelated type YYY + if (!t.returnType().equals(TypeItem.UNBOUNDED) && + !implicitCoerce.equals(returnTypeStr) && + !(numberTypes.contains(implicitCoerce) && numberTypes.contains(returnTypeStr)) && + !(implicitCoerce.equals("Boolean")) + ) { + t = new ConvertAVM2Item(null, null, t, new TypeItem(implicitCoerce)); + } } - }*/ + } if (!implicitCoerce.isEmpty() && Configuration.simplifyExpressions.get()) { t = t.simplify(implicitCoerce); } 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 7c2b51ade..4dc53ac18 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 @@ -1031,6 +1031,23 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile false); } + @Test + public void testImplicitCoerce() { + decompileMethod("classic_air", "testImplicitCoerce", "var j:int = 2;\r\n" + + "var i:int = 5;\r\n" + + "var r:* = Math.random();\r\n" + + "if(j & Number(r == 1) && 5)\r\n" + + "{\r\n" + + "trace(\"OK\");\r\n" + + "}\r\n" + + "var s:String = \"hello: \" + r;\r\n" + + "if(s)\r\n" + + "{\r\n" + + "trace(\"F\");\r\n" + + "}\r\n", + false); + } + @Test public void testImportedVar() { decompileMethod("classic_air", "testImportedVar", "trace(myvar);\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 6dc84b8a5..8da3b8bd6 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 @@ -1026,6 +1026,23 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes false); } + @Test + public void testImplicitCoerce() { + decompileMethod("classic", "testImplicitCoerce", "var j:int = 2;\r\n" + + "var i:int = 5;\r\n" + + "var r:* = Math.random();\r\n" + + "if(Boolean(j & Number(r == 1)) && Boolean(5))\r\n" + + "{\r\n" + + "trace(\"OK\");\r\n" + + "}\r\n" + + "var s:String = \"hello: \" + r;\r\n" + + "if(Boolean(s))\r\n" + + "{\r\n" + + "trace(\"F\");\r\n" + + "}\r\n", + false); + } + @Test public void testImportedVar() { decompileMethod("classic", "testImportedVar", "trace(myvar);\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 c7f8e86dc..44cfc950c 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 598b1864a..a2379aee2 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 e301b87ab..e505c17c0 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as @@ -66,6 +66,7 @@ package TestIfInIf; TestIfTry; TestIgnoreAndOr; + TestImplicitCoerce; TestImportedVar; TestInc2; TestIncDec; diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestImplicitCoerce.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestImplicitCoerce.as new file mode 100644 index 000000000..396c6f9be --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestImplicitCoerce.as @@ -0,0 +1,22 @@ +package tests +{ + + public class TestImplicitCoerce + { + public function run():void + { + var j:int = 2; + var i:int = 5; + var r:* = Math.random(); + + if (j & Number(r == 1) && 5) { + trace("OK"); + } + var s:String = "hello: " + r; + + if (s){ + trace("F"); + } + } + } +}