diff --git a/CHANGELOG.md b/CHANGELOG.md index c487915a8..2db0b8ef6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - [#1894] Switch inside loop - [#1801] AS3 - AIR/Flash switching - [#1892] AS3 - internal modifier after implicit namespace +- [#1888] AS3 - Coerce to string ## [18.3.2] - 2023-01-10 ### Removed @@ -2871,6 +2872,7 @@ All notable changes to this project will be documented in this file. [#1888]: https://www.free-decompiler.com/flash/issues/1888 [#1894]: https://www.free-decompiler.com/flash/issues/1894 [#1801]: https://www.free-decompiler.com/flash/issues/1801 +[#1892]: https://www.free-decompiler.com/flash/issues/1892 [#1935]: https://www.free-decompiler.com/flash/issues/1935 [#1931]: https://www.free-decompiler.com/flash/issues/1931 [#1934]: https://www.free-decompiler.com/flash/issues/1934 @@ -2927,7 +2929,6 @@ All notable changes to this project will be documented in this file. [#1769]: https://www.free-decompiler.com/flash/issues/1769 [#1810]: https://www.free-decompiler.com/flash/issues/1810 [#1891]: https://www.free-decompiler.com/flash/issues/1891 -[#1892]: https://www.free-decompiler.com/flash/issues/1892 [#1887]: https://www.free-decompiler.com/flash/issues/1887 [#1882]: https://www.free-decompiler.com/flash/issues/1882 [#1880]: https://www.free-decompiler.com/flash/issues/1880 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CoerceAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CoerceAVM2Item.java index 999c127ce..9d1cd0aa1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CoerceAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CoerceAVM2Item.java @@ -58,8 +58,47 @@ public class CoerceAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - //return hilight("(" + type + ")", highlight)+ - return value.toString(writer, localData); + //Same for ConvertAVM2Item + boolean displayCoerce = true; + GraphTargetItem valueReturnType = value.returnType(); + switch (typeObj.toString()) { + case "*": + displayCoerce = false; + break; + case "Boolean": + displayCoerce = !valueReturnType.equals(TypeItem.BOOLEAN) && + !valueReturnType.equals(TypeItem.UNBOUNDED); + break; + case "Number": + case "int": + case "uint": + displayCoerce = !valueReturnType.equals(TypeItem.INT) && + !valueReturnType.equals(TypeItem.NUMBER) && + !valueReturnType.equals(TypeItem.UINT) && + !valueReturnType.equals(TypeItem.UNBOUNDED); + break; + case "String": + displayCoerce = !valueReturnType.equals(TypeItem.STRING) && + !valueReturnType.equals(new TypeItem("XML")) && + !valueReturnType.equals(new TypeItem("XMLList")) && + !valueReturnType.equals(new TypeItem("null")) && + !valueReturnType.equals(TypeItem.UNBOUNDED); + break; + default: + displayCoerce = false; + break; + //default: + // there should be something like instanceof, or not, just comment it out... + // displayCoerce = !valueReturnType.equals(typeObj); + } + if (displayCoerce) { + typeObj.toString(writer, localData).append("("); + } + value.toString(writer, localData); + if (displayCoerce) { + writer.append(")"); + } + return writer; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ConvertAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ConvertAVM2Item.java index 940ce1d70..4af94ed2f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ConvertAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ConvertAVM2Item.java @@ -49,12 +49,9 @@ public class ConvertAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + //Same for CoerceAVM2Item boolean displayConvert = true; GraphTargetItem valueReturnType = value.returnType(); - /*if (valueReturnType instanceof TypeItem) { - TypeItem ti = (TypeItem)valueReturnType; - ti.fullTypeName.toRawString() - }*/ switch (type.toString()) { case "Boolean": displayConvert = !valueReturnType.equals(TypeItem.BOOLEAN) && @@ -70,6 +67,9 @@ public class ConvertAVM2Item extends AVM2Item { break; case "String": displayConvert = !valueReturnType.equals(TypeItem.STRING) && + !valueReturnType.equals(new TypeItem("XML")) && + !valueReturnType.equals(new TypeItem("XMLList")) && + !valueReturnType.equals(new TypeItem("null")) && !valueReturnType.equals(TypeItem.UNBOUNDED); break; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java index a363e0abd..ceb809ebf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java @@ -98,18 +98,7 @@ public class DeclarationAVM2Item extends AVM2Item { srcData.regIndex = lti.regIndex; GraphTargetItem val = lti.value; - GraphTargetItem coerType = TypeItem.UNBOUNDED; - if (lti.value instanceof CoerceAVM2Item) { - coerType = ((CoerceAVM2Item) lti.value).typeObj; - } - if (lti.value instanceof ConvertAVM2Item) { - coerType = ((ConvertAVM2Item) lti.value).type; - } - //strip coerce if its declared as this type - if ((lti.value instanceof CoerceAVM2Item) && coerType.equals(type) && !coerType.equals(TypeItem.UNBOUNDED)) { - val = val.value; - } - srcData.declaredType = (coerType instanceof TypeItem) ? ((TypeItem) coerType).fullTypeName : DottedChain.ALL; + srcData.declaredType = (type instanceof TypeItem) ? ((TypeItem) type).fullTypeName : DottedChain.ALL; writer.append("var "); writer.append(localName); writer.append(":"); @@ -126,19 +115,7 @@ public class DeclarationAVM2Item extends AVM2Item { srcData.localName = ssti.getNameAsStr(localData); srcData.declaration = true; - GraphTargetItem val = ssti.value; - GraphTargetItem coerType = TypeItem.UNBOUNDED; - if (ssti.value instanceof CoerceAVM2Item) { - coerType = ((CoerceAVM2Item) ssti.value).typeObj; - } - if (ssti.value instanceof ConvertAVM2Item) { - coerType = ((ConvertAVM2Item) ssti.value).type; - } - //strip coerce if its declared as this type - if ((ssti.value instanceof CoerceAVM2Item) && coerType.equals(type) && !coerType.equals(TypeItem.UNBOUNDED)) { - val = val.value; - } - + GraphTargetItem val = ssti.value; srcData.declaredType = (type instanceof TypeItem) ? ((TypeItem) type).fullTypeName : DottedChain.ALL; writer.append("var "); ssti.getName(writer, localData); @@ -158,19 +135,7 @@ public class DeclarationAVM2Item extends AVM2Item { srcData.localName = ((FullMultinameAVM2Item) spti.propertyName).resolvedMultinameName; srcData.declaration = true; - GraphTargetItem val = spti.value; - GraphTargetItem coerType = TypeItem.UNBOUNDED; - if (spti.value instanceof CoerceAVM2Item) { - coerType = ((CoerceAVM2Item) spti.value).typeObj; - } - if (spti.value instanceof ConvertAVM2Item) { - coerType = ((ConvertAVM2Item) spti.value).type; - } - //strip coerce if its declared as this type - if ((spti.value instanceof CoerceAVM2Item) && coerType.equals(type) && !coerType.equals(TypeItem.UNBOUNDED)) { - val = val.value; - } - + GraphTargetItem val = spti.value; srcData.declaredType = (type instanceof TypeItem) ? ((TypeItem) type).fullTypeName : DottedChain.ALL; writer.append("var "); writer.append(IdentifiersDeobfuscation.printIdentifier(true, ((FullMultinameAVM2Item) spti.propertyName).resolvedMultinameName)); 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 1c25077c6..e392bd267 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 @@ -292,7 +292,8 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "if(o)\r\n" + "{\r\n" + "trace(\"obj\");\r\n" - + "}\r\n", + + "}\r\n" + + "s = xlist;\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 d68685465..25a8b7f3e 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 @@ -291,7 +291,8 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "if(Boolean(o))\r\n" + "{\r\n" + "trace(\"obj\");\r\n" - + "}\r\n", + + "}\r\n" + + "s = xlist;\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 1bfc6a249..4e882cd39 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 8a02e425d..a82b31fdc 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/tests/TestConvert.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestConvert.as index 62ee1a15e..dad6f8c1b 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestConvert.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestConvert.as @@ -89,7 +89,8 @@ package tests if (o) { trace("obj"); - } + } + s = xlist; } } }