diff --git a/CHANGELOG.md b/CHANGELOG.md index 330144543..e3a22d4d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ All notable changes to this project will be documented in this file. - [#2086] AS3 direct editation - Correct class order (instanceinfo,classinfo) respecting extends/implements - [#2086] AS3 direct editation - not deleting old nested methods when they have multiple usages - [#2009] Missing images in MacOs icon +- AS3 Initialization of var in script initializer ### Changed - [#2070] String values inside SWF to XML export are backslash escaped diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index 5aa004bf4..8fe163ac6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -40,6 +40,7 @@ import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.abc.types.traits.TraitClass; import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; +import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionGraphSource; import com.jpexs.decompiler.flash.action.ActionList; @@ -4345,7 +4346,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { try { List callStack = new ArrayList<>(); callStack.add(documentPack.abc.findBody(mi)); - documentPack.abc.findBody(mi).convert(callStack, getAbcIndex(), new ConvertData(), "??", ScriptExportMode.AS, true, mi, documentPack.scriptIndex, cindex, documentPack.abc, t, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new ArrayList<>(), true, new HashSet<>()); + documentPack.abc.findBody(mi).convert(callStack, getAbcIndex(), new ConvertData(), "??", ScriptExportMode.AS, true, mi, documentPack.scriptIndex, cindex, documentPack.abc, t, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>()); List infos = documentPack.abc.findBody(mi).convertedItems; if (!infos.isEmpty()) { if (infos.get(0) instanceof IfItem) { @@ -4423,7 +4424,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { int cinit = p.abc.class_info.get(ci).cinit_index; callStack = new ArrayList<>(); callStack.add(p.abc.findBody(cinit)); - p.abc.findBody(cinit).convert(callStack, getAbcIndex(), new ConvertData(), "??", ScriptExportMode.AS, true, cinit, p.scriptIndex, cindex, p.abc, t, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new ArrayList<>(), true, new HashSet<>()); + p.abc.findBody(cinit).convert(callStack, getAbcIndex(), new ConvertData(), "??", ScriptExportMode.AS, true, cinit, p.scriptIndex, cindex, p.abc, t, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>()); List cinitBody = p.abc.findBody(cinit).convertedItems; for (GraphTargetItem cit : cinitBody) { if (cit instanceof SetPropertyAVM2Item) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java index 64e3567c9..d09a102d4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java @@ -174,18 +174,16 @@ public class ScriptPack extends AS3ClassTreeItem { int sinit_index = abc.script_info.get(scriptIndex).init_index; int sinit_bodyIndex = abc.findBodyIndex(sinit_index); if (sinit_bodyIndex != -1) { - List ts = new ArrayList<>(); //initialize all classes traits - for (Trait t : traits) { + /*for (Trait t : traits) { if (t instanceof TraitClass) { ts.add(abc.class_info.get(((TraitClass) t).class_info).static_traits); } - } - ts.add(abc.script_info.get(scriptIndex).traits); + }*/ writer.mark(); List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(sinit_bodyIndex)); - abc.bodies.get(sinit_bodyIndex).convert(callStack, abcIndex, convertData, path +/*packageName +*/ "/.scriptinitializer", exportMode, true, sinit_index, scriptIndex, -1, abc, null, new ScopeStack(), GraphTextWriter.TRAIT_SCRIPT_INITIALIZER, writer, new ArrayList<>(), ts, true, new HashSet<>()); + abc.bodies.get(sinit_bodyIndex).convert(callStack, abcIndex, convertData, path +/*packageName +*/ "/.scriptinitializer", exportMode, true, sinit_index, scriptIndex, -1, abc, null, new ScopeStack(), GraphTextWriter.TRAIT_SCRIPT_INITIALIZER, writer, new ArrayList<>(), abc.script_info.get(scriptIndex).traits, true, new HashSet<>()); scriptInitializerIsEmpty = !writer.getMark(); } 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 c3b671641..7564b10e7 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 @@ -256,6 +256,7 @@ 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.GetSlotAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.GlobalAVM2Item; 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; @@ -2047,7 +2048,7 @@ public class AVM2Code implements Cloneable { }*/ } - public List toGraphTargetItems(List callStack, AbcIndexing abcIndex, boolean thisHasDefaultToPrimitive, ConvertData convertData, String path, int methodIndex, boolean isStatic, int scriptIndex, int classIndex, ABC abc, MethodBody body, HashMap localRegNames, ScopeStack scopeStack, int initializerType, List fullyQualifiedNames, List initTraits, int staticOperation, HashMap localRegAssigmentIps) throws InterruptedException { + public List toGraphTargetItems(List callStack, AbcIndexing abcIndex, boolean thisHasDefaultToPrimitive, ConvertData convertData, String path, int methodIndex, boolean isStatic, int scriptIndex, int classIndex, ABC abc, MethodBody body, HashMap localRegNames, ScopeStack scopeStack, int initializerType, List fullyQualifiedNames, Traits initTraits, int staticOperation, HashMap localRegAssigmentIps) throws InterruptedException { initToSource(); List list; HashMap localRegs = new HashMap<>(); @@ -2070,6 +2071,30 @@ public class AVM2Code implements Cloneable { loopi: for (int i = 0; i < list.size(); i++) { GraphTargetItem ti = list.get(i); + if (ti instanceof SetSlotAVM2Item) { + SetSlotAVM2Item ss = (SetSlotAVM2Item) ti; + if ((ss.slotObject instanceof GlobalAVM2Item) && (initializerType == GraphTextWriter.TRAIT_SCRIPT_INITIALIZER)) { + for (Trait t : initTraits.traits) { + if (t instanceof TraitSlotConst) { + TraitSlotConst tsc = (TraitSlotConst)t; + if (tsc.slot_id == ss.slotIndex) { + GraphTargetItem value = ss.value; + if (value != null && !convertData.assignedValues.containsKey(tsc)) { + if (value instanceof NewFunctionAVM2Item) { + NewFunctionAVM2Item f = (NewFunctionAVM2Item) value; + f.functionName = tsc.getName(abc).getName(abc.constants, fullyQualifiedNames, true, true); + } + AssignedValue av = new AssignedValue(value, initializerType, methodIndex); + convertData.assignedValues.put(tsc, av); + list.remove(i); + i--; + continue loopi; + } + } + } + } + } + } if ((ti instanceof InitPropertyAVM2Item) || (ti instanceof SetPropertyAVM2Item)) { int multinameIndex = 0; GraphTargetItem value = null; @@ -2082,63 +2107,61 @@ public class AVM2Code implements Cloneable { value = ((SetPropertyAVM2Item) ti).value; } Multiname m = abc.constants.getMultiname(multinameIndex); - for (Traits ts : initTraits) { - for (int j = 0; j < ts.traits.size(); j++) { - Trait t = ts.traits.get(j); - Multiname tm = abc.constants.getMultiname(t.name_index); - if (tm != null && tm.equals(m)) { - if ((t instanceof TraitSlotConst)) { - if (((TraitSlotConst) t).isConst() || initializerType == GraphTextWriter.TRAIT_CLASS_INITIALIZER || initializerType == GraphTextWriter.TRAIT_SCRIPT_INITIALIZER) { - TraitSlotConst tsc = (TraitSlotConst) t; - if (value != null && !convertData.assignedValues.containsKey(tsc)) { + for (int j = 0; j < initTraits.traits.size(); j++) { + Trait t = initTraits.traits.get(j); + Multiname tm = abc.constants.getMultiname(t.name_index); + if (tm != null && tm.equals(m)) { + if ((t instanceof TraitSlotConst)) { + if (((TraitSlotConst) t).isConst() || initializerType == GraphTextWriter.TRAIT_CLASS_INITIALIZER || initializerType == GraphTextWriter.TRAIT_SCRIPT_INITIALIZER) { + TraitSlotConst tsc = (TraitSlotConst) t; + if (value != null && !convertData.assignedValues.containsKey(tsc)) { - /*if (ti instanceof SetPropertyAVM2Item) { //only for slots - Set subItems = value.getAllSubItemsRecursively(); - subItems.add(value); - List laterMultinames = new ArrayList<>(); - for (int k = j + 1; k < ts.traits.size(); k++) { - int tMultinameIndex = ts.traits.get(k).name_index; - if (tMultinameIndex > 0) { - Multiname tMultiname = abc.constants.getMultiname(tMultinameIndex); - laterMultinames.add(tMultiname); - } + /*if (ti instanceof SetPropertyAVM2Item) { //only for slots + Set subItems = value.getAllSubItemsRecursively(); + subItems.add(value); + List laterMultinames = new ArrayList<>(); + for (int k = j + 1; k < ts.traits.size(); k++) { + int tMultinameIndex = ts.traits.get(k).name_index; + if (tMultinameIndex > 0) { + Multiname tMultiname = abc.constants.getMultiname(tMultinameIndex); + laterMultinames.add(tMultiname); } - for (GraphTargetItem item : subItems) { + } + for (GraphTargetItem item : subItems) { - //if later slot is referenced, we must add it as {} block instead of direct assignment - if (item instanceof GetPropertyAVM2Item) { - Multiname multiName = abc.constants.getMultiname(((FullMultinameAVM2Item) ((GetPropertyAVM2Item) item).propertyName).multinameIndex); - if (laterMultinames.contains(multiName)) { - continue loopi; - } - } - if (item instanceof GetLexAVM2Item) { - Multiname multiName = ((GetLexAVM2Item) item).propertyName; - if (laterMultinames.contains(multiName)) { - continue loopi; - } - } - - if (item instanceof LocalRegAVM2Item) { //it is surely in static initializer block, not in slot/const + //if later slot is referenced, we must add it as {} block instead of direct assignment + if (item instanceof GetPropertyAVM2Item) { + Multiname multiName = abc.constants.getMultiname(((FullMultinameAVM2Item) ((GetPropertyAVM2Item) item).propertyName).multinameIndex); + if (laterMultinames.contains(multiName)) { continue loopi; } } - }*/ - if (value instanceof NewFunctionAVM2Item) { - NewFunctionAVM2Item f = (NewFunctionAVM2Item) value; - f.functionName = tsc.getName(abc).getName(abc.constants, fullyQualifiedNames, true, true); + if (item instanceof GetLexAVM2Item) { + Multiname multiName = ((GetLexAVM2Item) item).propertyName; + if (laterMultinames.contains(multiName)) { + continue loopi; + } + } + + if (item instanceof LocalRegAVM2Item) { //it is surely in static initializer block, not in slot/const + continue loopi; + } } - AssignedValue av = new AssignedValue(value, initializerType, methodIndex); - convertData.assignedValues.put(tsc, av); - list.remove(i); - i--; - continue; + }*/ + if (value instanceof NewFunctionAVM2Item) { + NewFunctionAVM2Item f = (NewFunctionAVM2Item) value; + f.functionName = tsc.getName(abc).getName(abc.constants, fullyQualifiedNames, true, true); } + AssignedValue av = new AssignedValue(value, initializerType, methodIndex); + convertData.assignedValues.put(tsc, av); + list.remove(i); + i--; + continue loopi; } - break; } + break; } - } + } } } else { // In obfuscated code, SetLocal instructions comes first diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index e397d1f10..b6548542a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -1312,12 +1312,10 @@ public class AVM2SourceGenerator implements SourceGenerator { MethodBody pcinit = ci.abc.findBody(mi); ConvertData d = new ConvertData(); - List initt = new ArrayList<>(); - initt.add(ci.abc.class_info.get(ci.index).static_traits); List callStack = new ArrayList<>(); callStack.add(pcinit); try { - pcinit.convert(callStack, null, d, "-", ScriptExportMode.AS, true, mi, -1, ci.index, ci.abc, null, new ScopeStack(), GraphTextWriter.TRAIT_CLASS_INITIALIZER, new NulWriter(), new ArrayList<>(), initt, false, new HashSet<>()); + pcinit.convert(callStack, null, d, "-", ScriptExportMode.AS, true, mi, -1, ci.index, ci.abc, null, new ScopeStack(), GraphTextWriter.TRAIT_CLASS_INITIALIZER, new NulWriter(), new ArrayList<>(), ci.abc.class_info.get(ci.index).static_traits, false, new HashSet<>()); //FIXME! Add skinparts from _skinParts attribute of parent class!!! } catch (InterruptedException ex) { Logger.getLogger(AVM2SourceGenerator.class.getName()).log(Level.SEVERE, "Getting parent skinparts interrupted", ex); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java index 9db86ee37..06ce22ce0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java @@ -285,7 +285,7 @@ public final class MethodBody implements Cloneable { return ret; } - public void convert(List callStack, AbcIndexing abcIndex, final ConvertData convertData, final String path, ScriptExportMode exportMode, final boolean isStatic, final int methodIndex, final int scriptIndex, final int classIndex, final ABC abc, final Trait trait, final ScopeStack scopeStack, final int initializerType, final NulWriter writer, final List fullyQualifiedNames, final List initTraits, boolean firstLevel, Set seenMethods) throws InterruptedException { + public void convert(List callStack, AbcIndexing abcIndex, final ConvertData convertData, final String path, ScriptExportMode exportMode, final boolean isStatic, final int methodIndex, final int scriptIndex, final int classIndex, final ABC abc, final Trait trait, final ScopeStack scopeStack, final int initializerType, final NulWriter writer, final List fullyQualifiedNames, Traits initTraits, boolean firstLevel, Set seenMethods) throws InterruptedException { seenMethods.add(this.method_info); if (debugMode) { System.err.println("Decompiling " + path); @@ -422,7 +422,7 @@ public final class MethodBody implements Cloneable { ConvertData convertData = new ConvertData(); convertData.deobfuscationMode = 0; try { - convert(callStack, abcIndex, convertData, "", ScriptExportMode.AS, false, method_info, 0, 0, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new ArrayList<>(), true, seenMethods); + convert(callStack, abcIndex, convertData, "", ScriptExportMode.AS, false, method_info, 0, 0, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, seenMethods); HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false); writer.indent().indent().indent(); toString(callStack, abcIndex, "", ScriptExportMode.AS, abc, null, writer, new ArrayList<>(), seenMethods); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java index 175f6cfef..6f938a568 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java @@ -280,8 +280,6 @@ public class TraitClass extends Trait implements TraitWithSlot { int bodyIndex = abc.findBodyIndex(classInfo.cinit_index); if (bodyIndex != -1) { writer.mark(); - List ts = new ArrayList<>(); - ts.add(classInfo.static_traits); List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(bodyIndex)); @@ -298,7 +296,7 @@ public class TraitClass extends Trait implements TraitWithSlot { } } - abc.bodies.get(bodyIndex).convert(callStack, abcIndex, convertData, path +/*packageName +*/ "/" + instanceInfoName + ".staticinitializer", exportMode, true, classInfo.cinit_index, scriptIndex, class_info, abc, this, newScopeStack, GraphTextWriter.TRAIT_CLASS_INITIALIZER, writer, fullyQualifiedNames, ts, true, new HashSet<>()); + abc.bodies.get(bodyIndex).convert(callStack, abcIndex, convertData, path +/*packageName +*/ "/" + instanceInfoName + ".staticinitializer", exportMode, true, classInfo.cinit_index, scriptIndex, class_info, abc, this, newScopeStack, GraphTextWriter.TRAIT_CLASS_INITIALIZER, writer, fullyQualifiedNames, classInfo.static_traits, true, new HashSet<>()); newScopeStack.push(new ClassAVM2Item(abc.instance_info.get(class_info).getName(abc.constants))); classInitializerIsEmpty = !writer.getMark(); @@ -308,12 +306,10 @@ public class TraitClass extends Trait implements TraitWithSlot { if (!instanceInfo.isInterface()) { bodyIndex = abc.findBodyIndex(instanceInfo.iinit_index); if (bodyIndex != -1) { - List ts = new ArrayList<>(); - ts.add(instanceInfo.instance_traits); MethodBody constructorBody = abc.bodies.get(bodyIndex); List callStack = new ArrayList<>(); callStack.add(constructorBody); - constructorBody.convert(callStack, abcIndex, convertData, path +/*packageName +*/ "/" + instanceInfoName + ".initializer", exportMode, false, instanceInfo.iinit_index, scriptIndex, class_info, abc, this, new ScopeStack(), GraphTextWriter.TRAIT_INSTANCE_INITIALIZER, writer, fullyQualifiedNames, ts, true, new HashSet<>()); + constructorBody.convert(callStack, abcIndex, convertData, path +/*packageName +*/ "/" + instanceInfoName + ".initializer", exportMode, false, instanceInfo.iinit_index, scriptIndex, class_info, abc, this, new ScopeStack(), GraphTextWriter.TRAIT_INSTANCE_INITIALIZER, writer, fullyQualifiedNames, instanceInfo.instance_traits, true, new HashSet<>()); if (convertData.ignoreFrameScripts) { //find all addFrameScript(xx,this.method) in constructor diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/AS3ScriptExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/AS3ScriptExporter.java index 136af561b..18a14c762 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/AS3ScriptExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/AS3ScriptExporter.java @@ -42,6 +42,7 @@ import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.abc.types.traits.TraitClass; import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; +import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.flash.exporters.BinaryDataExporter; @@ -126,7 +127,7 @@ public class AS3ScriptExporter { try { List callStack = new ArrayList<>(); callStack.add(pack.abc.findBody(method)); - pack.abc.findBody(method).convert(callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, method, pack.scriptIndex, cindex, pack.abc, t, new ScopeStack(), 0/*?*/, new NulWriter(), new ArrayList<>(), new ArrayList<>(), true, new HashSet<>()); + pack.abc.findBody(method).convert(callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, method, pack.scriptIndex, cindex, pack.abc, t, new ScopeStack(), 0/*?*/, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>()); List ci = pack.abc.findBody(method).convertedItems; if (!ci.isEmpty()) { @@ -201,7 +202,7 @@ public class AS3ScriptExporter { try { List callStack = new ArrayList<>(); callStack.add(pack.abc.findBody(method)); - pack.abc.findBody(method).convert(callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, method, pack.scriptIndex, cindex, pack.abc, t, new ScopeStack(), 0/*?*/, new NulWriter(), new ArrayList<>(), new ArrayList<>(), true, new HashSet<>()/*??*/); + pack.abc.findBody(method).convert(callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, method, pack.scriptIndex, cindex, pack.abc, t, new ScopeStack(), 0/*?*/, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>()/*??*/); List ci = pack.abc.findBody(method).convertedItems; if (!ci.isEmpty() && (ci.get(0) instanceof DeclarationAVM2Item)) { @@ -294,7 +295,7 @@ public class AS3ScriptExporter { try { List callStack = new ArrayList<>(); callStack.add(pack.abc.findBody(iinit)); - pack.abc.findBody(iinit).convert(callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, iinit, pack.scriptIndex, cindex, pack.abc, t, new ScopeStack(), 0/*?*/, new NulWriter(), new ArrayList<>(), new ArrayList<>(), true, new HashSet<>()); + pack.abc.findBody(iinit).convert(callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, iinit, pack.scriptIndex, cindex, pack.abc, t, new ScopeStack(), 0/*?*/, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>()); List iinitBody = pack.abc.findBody(iinit).convertedItems; for (GraphTargetItem it : iinitBody) { if (it instanceof InitPropertyAVM2Item) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java index a2fdb8de4..e77b8081c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java @@ -51,6 +51,7 @@ import com.jpexs.decompiler.flash.abc.types.ScriptInfo; import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.abc.types.traits.TraitClass; import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; +import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionTreeOperation; import com.jpexs.decompiler.flash.action.model.CallMethodActionItem; @@ -2685,7 +2686,7 @@ public class XFLConverter { try { List callStack = new ArrayList<>(); callStack.add(constructorBody); - constructorBody.convert(callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), GraphTextWriter.TRAIT_INSTANCE_INITIALIZER, new NulWriter(), new ArrayList<>(), new ArrayList<>(), true, new HashSet<>()); + constructorBody.convert(callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), GraphTextWriter.TRAIT_INSTANCE_INITIALIZER, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>()); Map frameToTraitMultiname = new HashMap<>(); @@ -2753,7 +2754,7 @@ public class XFLConverter { StringBuilder scriptBuilder = new StringBuilder(); callStack = new ArrayList<>(); callStack.add(frameBody); - frameBody.convert(callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, methodIndex, pack.scriptIndex, classIndex, abc, methodTrait, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new ArrayList<>(), true, new HashSet<>()); + frameBody.convert(callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, methodIndex, pack.scriptIndex, classIndex, abc, methodTrait, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>()); StringBuilderTextWriter writer = new StringBuilderTextWriter(Configuration.getCodeFormatting(), scriptBuilder); frameBody.toString(callStack, abcIndex, "??", ScriptExportMode.AS, abc, methodTrait, writer, new ArrayList<>(), new HashSet<>()); diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DecompileTestBase.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DecompileTestBase.java index ae3495024..ba71eecbf 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DecompileTestBase.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DecompileTestBase.java @@ -104,14 +104,11 @@ public abstract class ActionScript3DecompileTestBase extends ActionScriptTestBas assertTrue(bodyIndex > -1); HighlightedTextWriter writer; try { - List ts = new ArrayList<>(); - ts.add(abc.instance_info.get(clsIndex).instance_traits); - Configuration.autoDeobfuscate.set(methodName.toLowerCase().contains("obfus")); List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(bodyIndex)); - abc.bodies.get(bodyIndex).convert(callStack, swf.getAbcIndex(), new ConvertData(), "run", ScriptExportMode.AS, isStatic, abc.bodies.get(bodyIndex).method_info, scriptIndex, clsIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), ts, true, new HashSet<>()); + abc.bodies.get(bodyIndex).convert(callStack, swf.getAbcIndex(), new ConvertData(), "run", ScriptExportMode.AS, isStatic, abc.bodies.get(bodyIndex).method_info, scriptIndex, clsIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), abc.instance_info.get(clsIndex).instance_traits, true, new HashSet<>()); writer = new HighlightedTextWriter(new CodeFormatting(), false); abc.bodies.get(bodyIndex).toString(callStack, swf.getAbcIndex(), "run", ScriptExportMode.AS, abc, null, writer, new ArrayList<>(), new HashSet<>()); } catch (InterruptedException ex) { 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 9caecd142..af0826c49 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 @@ -558,4 +558,28 @@ public class ActionScript3ClassTest extends ActionScript3DecompileTestBase { + " }\n" + "}"); } + + @Test + public void testInitializedVar() { + decompileScriptPack("standard", "tests_classes.initializedvar", "package tests_classes\n" + + "{\n" + + " public var initializedvar:Object = {\n" + + " \"a\":1,\n" + + " \"b\":2,\n" + + " \"c\":3\n" + + " };\n" + + "}"); + } + + @Test + public void testInitializedConst() { + decompileScriptPack("standard", "tests_classes.initializedconst", "package tests_classes\n" + + "{\n" + + " public const initializedconst:Object = {\n" + + " \"a\":1,\n" + + " \"b\":2,\n" + + " \"c\":3\n" + + " };\n" + + "}"); + } } 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 ee70974bd..de2dbce6d 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 @@ -1182,6 +1182,12 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile false); } + @Test + public void testImportedConst() { + decompileMethod("classic_air", "testImportedConst", "trace(29);\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 e9e8e4d2d..984cd54ac 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 @@ -1178,6 +1178,12 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes false); } + @Test + public void testImportedConst() { + decompileMethod("classic", "testImportedConst", "trace(myconst);\r\n", + false); + } + @Test public void testImportedVar() { decompileMethod("classic", "testImportedVar", "trace(myvar);\r\n" diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java index 572ec557b..a1bd59140 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java @@ -156,14 +156,11 @@ public class AS3Generator { s.append("\", "); HighlightedTextWriter src = new HighlightedTextWriter(new CodeFormatting(), false); MethodBody b = abc.findBody(((TraitMethodGetterSetter) t).method_info); - List ts = new ArrayList<>(); - ts.add(abc.instance_info.get(classId).instance_traits); - Configuration.autoDeobfuscate.set(clsName.toLowerCase().contains("obfus")); List callStack = new ArrayList<>(); callStack.add(b); - b.convert(callStack, swf.getAbcIndex(), new ConvertData(), "", ScriptExportMode.AS, false, ((TraitMethodGetterSetter) t).method_info, pack.scriptIndex, classId, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), ts, true, new HashSet<>()); + b.convert(callStack, swf.getAbcIndex(), new ConvertData(), "", ScriptExportMode.AS, false, ((TraitMethodGetterSetter) t).method_info, pack.scriptIndex, classId, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), abc.instance_info.get(classId).instance_traits, true, new HashSet<>()); b.toString(callStack, swf.getAbcIndex(), "", ScriptExportMode.AS, abc, null, src, new ArrayList<>(), new HashSet<>()); String[] srcs = src.toString().split("[\r\n]+"); for (int i = 0; i < srcs.length; i++) {