diff --git a/CHANGELOG.md b/CHANGELOG.md index 9aa99d0da..78b646061 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - AS3 getslot/setslot in certain situations - #1185 AS3 Incorrect imports in obfuscated files - #1186 Missing import when item is fully qualified +- #1188 AS3 Static initializer - init slot/const only when not referencing other property ## [13.0.1] - 2021-02-09 ### Fixed diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index e814ce9aa..a83d54fb1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -252,6 +252,8 @@ import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.CoerceAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.ConvertAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.GetLexAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.GetPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.InitPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item; @@ -1945,6 +1947,17 @@ public class AVM2Code implements Cloneable { multinameIndex = ((FullMultinameAVM2Item) ((SetPropertyAVM2Item) ti).propertyName).multinameIndex; value = ((SetPropertyAVM2Item) ti).value; } + Set subItems = value.getAllSubItemsRecursively(); + subItems.add(value); + for (GraphTargetItem item : subItems) { + if ((item instanceof GetPropertyAVM2Item) || (item instanceof GetLexAVM2Item)) { //references other property + continue loopi; + } + + if (item instanceof LocalRegAVM2Item) { //it is surely in static initializer block, not in slot/const + continue loopi; + } + } Multiname m = abc.constants.getMultiname(multinameIndex); for (Traits ts : initTraits) { for (Trait t : ts.traits) { diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassTest.java index 67fe4b38d..62af11b8d 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassTest.java @@ -329,4 +329,38 @@ public class ActionScript3ClassTest extends ActionScript3DecompileTestBase { + " }\n" + "}"); } + + @Test + public void testInitializer() { + decompileScriptPack("standard", "tests_classes.TestInitializer", "package tests_classes\n" + + "{\n" + + " public class TestInitializer\n" + + " {\n" + + " public static var s_alpha:RegExp = /[a-z]+/;\n" + + " \n" + + " public static var s_regs:Array;\n" + + " \n" + + " public static var s_numbers:RegExp = /[0-9]+/;\n" + + " \n" + + " {\n" + + " s_regs = [s_alpha,s_numbers];\n" + + " }\n" + + " \n" + + " public var i_email:RegExp;\n" + + " \n" + + " public var i_link:RegExp;\n" + + " \n" + + " public var i_regs:Array;\n" + + " \n" + + " public function TestInitializer()\n" + + " {\n" + + " this.i_email = /.*@.*\\..*/;\n" + + " this.i_link = //;\n" + + " this.i_regs = [this.i_email,this.i_link];\n" + + " super();\n" + + " trace(s_regs[1]);\n" + + " }\n" + + " }\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 dde138f64..be151e140 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 e6592f93c..1e190bdbf 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 f1e52ac78..709bc9b8c 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as @@ -6,8 +6,7 @@ package import tests_classes.mypackage1.SetupMyPackage1; import tests_classes.mypackage2.SetupMyPackage2; import tests_classes.mypackage3.SetupMyPackage3; - import tests_classes.TestThisOutsideClass; - import tests_classes.TestImports; + import tests_classes.*; /** * ... @@ -102,9 +101,11 @@ package TestThisOutsideClass; TestImports; + TestInitializer; public function Main() { + new TestInitializer(); if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests_classes/TestInitializer.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests_classes/TestInitializer.as new file mode 100644 index 000000000..fcba561ff --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests_classes/TestInitializer.as @@ -0,0 +1,28 @@ +package tests_classes +{ + /** + * ... + * @author JPEXS + */ + public class TestInitializer + { + public static var s_alpha:RegExp = /[a-z]+/; + public static var s_regs:Array; + public static var s_numbers:RegExp = /[0-9]+/; + + public var i_email:RegExp = /.*@.*\..*/ + public var i_link:RegExp = //; + public var i_regs:Array = [i_email,i_link]; + + { + s_regs = [s_alpha, s_numbers]; + } + + public function TestInitializer() + { + trace(s_regs[1]); + } + + } + +} \ No newline at end of file