Fixed #2418 AS3 - initialization of class static vars in script initializer (Haxe)

This commit is contained in:
Jindra Petřík
2025-04-13 00:08:10 +02:00
parent c45eb35120
commit 58bd04698e
21 changed files with 197 additions and 87 deletions

View File

@@ -5921,7 +5921,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable {
if (documentPack.getOpenable() instanceof SWF) {
swfVersion = ((SWF) documentPack.getOpenable()).version;
}
documentPack.abc.findBody(mi).convert(swfVersion, 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<>());
documentPack.abc.findBody(mi).convert(swfVersion, 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<>(), new ArrayList<>());
List<GraphTargetItem> infos = documentPack.abc.findBody(mi).convertedItems;
if (!infos.isEmpty()) {
if (infos.get(0) instanceof IfItem) {
@@ -5999,7 +5999,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(swfVersion, 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<>());
p.abc.findBody(cinit).convert(swfVersion, 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<>(), new ArrayList<>());
List<GraphTargetItem> cinitBody = p.abc.findBody(cinit).convertedItems;
for (GraphTargetItem cit : cinitBody) {
if (cit instanceof SetPropertyAVM2Item) {

View File

@@ -265,16 +265,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 && (isSimple || traitIndices.isEmpty())) {
//initialize all classes traits
/*for (Trait t : traits) {
List<Integer> initClasses = new ArrayList<>();
for (Trait t : traits) {
if (t instanceof TraitClass) {
ts.add(abc.class_info.get(((TraitClass) t).class_info).static_traits);
initClasses.add(((TraitClass) t).class_info);
}
}*/
}
writer.mark();
List<MethodBody> callStack = new ArrayList<>();
callStack.add(abc.bodies.get(sinit_bodyIndex));
abc.bodies.get(sinit_bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path + "/.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<>());
abc.bodies.get(sinit_bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path + "/.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<>(), initClasses);
scriptInitializerIsEmpty = !writer.getMark();
}

View File

@@ -2542,10 +2542,11 @@ public class AVM2Code implements Cloneable {
* @param initTraits Initialized traits
* @param staticOperation Static operation
* @param localRegAssignmentIps Local register assignment IPs
* @param initTraitClasses Class ids which traits to init
* @return List of GraphTargetItems
* @throws InterruptedException On interrupt
*/
public List<GraphTargetItem> toGraphTargetItems(int swfVersion, List<MethodBody> callStack, AbcIndexing abcIndex, boolean thisHasDefaultToPrimitive, ConvertData convertData, String path, int methodIndex, boolean isStatic, int scriptIndex, int classIndex, ABC abc, MethodBody body, HashMap<Integer, String> localRegNames, ScopeStack scopeStack, int initializerType, List<DottedChain> fullyQualifiedNames, Traits initTraits, int staticOperation, HashMap<Integer, Integer> localRegAssignmentIps) throws InterruptedException {
public List<GraphTargetItem> toGraphTargetItems(int swfVersion, List<MethodBody> callStack, AbcIndexing abcIndex, boolean thisHasDefaultToPrimitive, ConvertData convertData, String path, int methodIndex, boolean isStatic, int scriptIndex, int classIndex, ABC abc, MethodBody body, HashMap<Integer, String> localRegNames, ScopeStack scopeStack, int initializerType, List<DottedChain> fullyQualifiedNames, Traits initTraits, int staticOperation, HashMap<Integer, Integer> localRegAssignmentIps, List<Integer> initTraitClasses) throws InterruptedException {
initToSource();
List<GraphTargetItem> list;
HashMap<Integer, GraphTargetItem> localRegs = new HashMap<>();
@@ -2564,7 +2565,18 @@ public class AVM2Code implements Cloneable {
} catch (SecondPassException spe) {
list = AVM2Graph.translateViaGraph(swfVersion, spe.getData(), callStack, abcIndex, path, this, abc, body, isStatic, scriptIndex, classIndex, localRegs, scopeStack, localRegNames, localRegTypes, fullyQualifiedNames, staticOperation, localRegAssignmentIps, thisHasDefaultToPrimitive);
}
if (initTraits != null) {
if (initTraits != null) {
Map<Integer, Traits> initClassMultinames = new LinkedHashMap<>();
if (initializerType == GraphTextWriter.TRAIT_SCRIPT_INITIALIZER) {
for (int c : initTraitClasses) {
initClassMultinames.put(abc.instance_info.get(c).name_index, abc.class_info.get(c).static_traits);
}
}
initClassMultinames.put(-1, initTraits);
loopi:
for (int i = 0; i < list.size(); i++) {
GraphTargetItem ti = list.get(i);
@@ -2600,71 +2612,87 @@ public class AVM2Code implements Cloneable {
if ((ti instanceof InitPropertyAVM2Item) || (ti instanceof SetPropertyAVM2Item)) {
int multinameIndex = 0;
GraphTargetItem value = null;
if (ti instanceof InitPropertyAVM2Item) {
GraphTargetItem obj = null;
if (ti instanceof InitPropertyAVM2Item) {
multinameIndex = ((InitPropertyAVM2Item) ti).propertyName.multinameIndex;
value = ((InitPropertyAVM2Item) ti).value;
obj = ((InitPropertyAVM2Item) ti).object;
}
if (ti instanceof SetPropertyAVM2Item) {
multinameIndex = ((FullMultinameAVM2Item) ((SetPropertyAVM2Item) ti).propertyName).multinameIndex;
value = ((SetPropertyAVM2Item) ti).value;
obj = ((SetPropertyAVM2Item) ti).object;
}
Multiname m = abc.constants.getMultiname(multinameIndex);
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)) {
Multiname om = null;
if (obj instanceof GetPropertyAVM2Item) {
om = abc.constants.getMultiname(((FullMultinameAVM2Item) ((GetPropertyAVM2Item) obj).propertyName).multinameIndex);
}
if (obj instanceof GetLexAVM2Item) {
om = ((GetLexAVM2Item) obj).propertyName;
}
for (int classMultiname : initClassMultinames.keySet()) {
Traits ts = initClassMultinames.get(classMultiname);
Multiname cm = classMultiname == -1 ? null : abc.constants.getMultiname(classMultiname);
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) && (classMultiname == -1 || Objects.equals(om, cm))) {
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 (!isStatic) {
Set<GraphTargetItem> subItems = value.getAllSubItemsRecursively();
subItems.add(value);
List<Multiname> laterMultinames = new ArrayList<>();
for (int k = j + 1; k < initTraits.traits.size(); k++) {
int tMultinameIndex = initTraits.traits.get(k).name_index;
if (tMultinameIndex > 0) {
Multiname tMultiname = abc.constants.getMultiname(tMultinameIndex);
laterMultinames.add(tMultiname);
if (!isStatic) {
Set<GraphTargetItem> subItems = value.getAllSubItemsRecursively();
subItems.add(value);
List<Multiname> laterMultinames = new ArrayList<>();
for (int k = j + 1; k < initTraits.traits.size(); k++) {
int tMultinameIndex = initTraits.traits.get(k).name_index;
if (tMultinameIndex > 0) {
Multiname tMultiname = abc.constants.getMultiname(tMultinameIndex);
laterMultinames.add(tMultiname);
}
}
for (GraphTargetItem item : subItems) {
//if later slot is referenced, we must add it in constructor 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 constructor block, not in slot/const
continue loopi;
}
}
}
for (GraphTargetItem item : subItems) {
//if later slot is referenced, we must add it in constructor 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 constructor block, not in slot/const
continue loopi;
}
}
if (value instanceof NewFunctionAVM2Item) {
NewFunctionAVM2Item f = (NewFunctionAVM2Item) value;
f.functionName = tsc.getName(abc).getName(abc.constants, fullyQualifiedNames, true, true);
}
AssignedValue av = new AssignedValue(classMultiname == -1 ? ti : null, value, initializerType, methodIndex);
convertData.assignedValues.put(tsc, av);
if (!isStatic) {
list.remove(i);
i--;
}
continue loopi;
}
if (value instanceof NewFunctionAVM2Item) {
NewFunctionAVM2Item f = (NewFunctionAVM2Item) value;
f.functionName = tsc.getName(abc).getName(abc.constants, fullyQualifiedNames, true, true);
}
AssignedValue av = new AssignedValue(ti, value, initializerType, methodIndex);
convertData.assignedValues.put(tsc, av);
if (!isStatic) {
list.remove(i);
i--;
}
continue loopi;
}
break;
}
break;
}
}
}
@@ -2700,14 +2728,34 @@ public class AVM2Code implements Cloneable {
}
}
if (initializerType == GraphTextWriter.TRAIT_CLASS_INITIALIZER || initializerType == GraphTextWriter.TRAIT_SCRIPT_INITIALIZER) {
Map<GraphTargetItem, AssignedValue> commandToAssigned = new IdentityHashMap<>();
Map<GraphTargetItem, TraitSlotConst> commandToTrait = new IdentityHashMap<>();
for (TraitSlotConst tsc : convertData.assignedValues.keySet()) {
//if on script, do not use traits that belong to class and vice-versa
if (initTraits != null && !initTraits.traits.contains(tsc)) {
continue;
}
AssignedValue asv = convertData.assignedValues.get(tsc);
commandToAssigned.put(asv.command, asv);
commandToTrait.put(asv.command, tsc);
if (asv.command == null) {
TraitSlotConstAVM2Item item = new TraitSlotConstAVM2Item(
null,
null,
tsc,
asv.value,
true,
scriptIndex,
classIndex,
GraphTextWriter.TRAIT_SCRIPT_INITIALIZER,
abc.script_info.get(scriptIndex).init_index,
initTraits.traits.indexOf(tsc)
);
list.add(item);
} else {
commandToAssigned.put(asv.command, asv);
commandToTrait.put(asv.command, tsc);
}
}
for (int i = 0; i < list.size(); i++) {

View File

@@ -130,7 +130,7 @@ public class NewFunctionAVM2Item extends AVM2Item {
if (body != null) {
List<MethodBody> callStack = new ArrayList<>(localData.callStack);
callStack.add(body);
body.convert(localData.swfVersion, callStack, localData.abcIndex, new ConvertData(), path + "/inner", ScriptExportMode.AS, isStatic, methodIndex, scriptIndex, classIndex, abc, null, scopeStack, 0, new NulWriter(), localData.fullyQualifiedNames, null, false, new HashSet<>(localData.seenMethods));
body.convert(localData.swfVersion, callStack, localData.abcIndex, new ConvertData(), path + "/inner", ScriptExportMode.AS, isStatic, methodIndex, scriptIndex, classIndex, abc, null, scopeStack, 0, new NulWriter(), localData.fullyQualifiedNames, null, false, new HashSet<>(localData.seenMethods), new ArrayList<>());
body.toString(localData.swfVersion, callStack, localData.abcIndex, path + "/inner", ScriptExportMode.AS, abc, null, writer, localData.fullyQualifiedNames, new HashSet<>(localData.seenMethods));
}
writer.endBlock();

View File

@@ -706,7 +706,7 @@ public class AVM2SourceGenerator implements SourceGenerator {
List<MethodBody> callStack = new ArrayList<>();
callStack.add(pcinit);
try {
pcinit.convert(-1 /*FIXME??*/, 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<>());
pcinit.convert(-1 /*FIXME??*/, 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<>(), new ArrayList<>());
//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);

View File

@@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.abc.types;
import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst;
import com.jpexs.decompiler.flash.configuration.Configuration;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
@@ -30,7 +31,7 @@ public class ConvertData {
public int deobfuscationMode;
public Map<TraitSlotConst, AssignedValue> assignedValues = new HashMap<>();
public Map<TraitSlotConst, AssignedValue> assignedValues = new LinkedHashMap<>();
public boolean thisHasDefaultToPrimitive;

View File

@@ -447,9 +447,10 @@ public final class MethodBody implements Cloneable {
* @param initTraits Initial traits
* @param firstLevel First level
* @param seenMethods Seen methods
* @param initTraitClasses Class ids which traits to init
* @throws InterruptedException On interrupt
*/
public void convert(int swfVersion, List<MethodBody> 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<DottedChain> fullyQualifiedNames, Traits initTraits, boolean firstLevel, Set<Integer> seenMethods) throws InterruptedException {
public void convert(int swfVersion, List<MethodBody> 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<DottedChain> fullyQualifiedNames, Traits initTraits, boolean firstLevel, Set<Integer> seenMethods, List<Integer> initTraitClasses) throws InterruptedException {
seenMethods.add(this.method_info);
if (debugMode) {
System.err.println("Decompiling " + path);
@@ -472,7 +473,7 @@ public final class MethodBody implements Cloneable {
HashMap<Integer, String> localRegNames = getLocalRegNames(abc);
List<GraphTargetItem> convertedItems1;
try (Statistics s = new Statistics("AVM2Code.toGraphTargetItems")) {
convertedItems1 = converted.getCode().toGraphTargetItems(swfVersion, callStack, abcIndex, convertData.thisHasDefaultToPrimitive, convertData, path, methodIndex, isStatic, scriptIndex, classIndex, abc, converted, localRegNames, scopeStack, initializerType, fullyQualifiedNames, initTraits, 0, new HashMap<>()); //converted.getCode().visitCode(converted)
convertedItems1 = converted.getCode().toGraphTargetItems(swfVersion, callStack, abcIndex, convertData.thisHasDefaultToPrimitive, convertData, path, methodIndex, isStatic, scriptIndex, classIndex, abc, converted, localRegNames, scopeStack, initializerType, fullyQualifiedNames, initTraits, 0, new HashMap<>(), initTraitClasses); //converted.getCode().visitCode(converted)
}
try (Statistics s = new Statistics("Graph.graphToString")) {
Graph.graphToString(convertedItems1, writer, LocalData.create(callStack, abcIndex, abc, localRegNames, fullyQualifiedNames, seenMethods, exportMode, swfVersion));
@@ -660,7 +661,7 @@ public final class MethodBody implements Cloneable {
ConvertData convertData = new ConvertData();
convertData.deobfuscationMode = 0;
try {
convert(swfVersion, callStack, abcIndex, convertData, "", ScriptExportMode.AS, false, method_info, 0, 0, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, seenMethods);
convert(swfVersion, callStack, abcIndex, convertData, "", ScriptExportMode.AS, false, method_info, 0, 0, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, seenMethods, new ArrayList<>());
HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false);
writer.indent().indent().indent();
toString(swfVersion, callStack, abcIndex, "", ScriptExportMode.AS, abc, null, writer, new ArrayList<>(), seenMethods);

View File

@@ -395,7 +395,7 @@ public class TraitClass extends Trait implements TraitWithSlot {
}
}
abc.bodies.get(bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path + "/" + 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<>());
abc.bodies.get(bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path + "/" + 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<>(), new ArrayList<>());
newScopeStack.push(new ClassAVM2Item(abc.instance_info.get(class_info).getName(abc.constants)));
classInitializerIsEmpty = !writer.getMark();
@@ -408,7 +408,7 @@ public class TraitClass extends Trait implements TraitWithSlot {
MethodBody constructorBody = abc.bodies.get(bodyIndex);
List<MethodBody> callStack = new ArrayList<>();
callStack.add(constructorBody);
constructorBody.convert(swfVersion, callStack, abcIndex, convertData, path + "/" + 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<>());
constructorBody.convert(swfVersion, callStack, abcIndex, convertData, path + "/" + 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<>(), new ArrayList<>());
if (convertData.ignoreFrameScripts) {
//find all addFrameScript(xx,this.method) in constructor

View File

@@ -139,7 +139,7 @@ public class TraitFunction extends Trait implements TraitWithSlot {
if (bodyIndex != -1) {
List<MethodBody> callStack = new ArrayList<>();
callStack.add(abc.bodies.get(bodyIndex));
abc.bodies.get(bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path + "." + abc.constants.getMultiname(name_index).getName(abc.constants, fullyQualifiedNames, false, true), exportMode, isStatic, method_info, scriptIndex, classIndex, abc, this, scopeStack, 0, writer, fullyQualifiedNames, null, true, new HashSet<>());
abc.bodies.get(bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path + "." + abc.constants.getMultiname(name_index).getName(abc.constants, fullyQualifiedNames, false, true), exportMode, isStatic, method_info, scriptIndex, classIndex, abc, this, scopeStack, 0, writer, fullyQualifiedNames, null, true, new HashSet<>(), new ArrayList<>());
}
writer.endMethod();
}

View File

@@ -147,7 +147,7 @@ public class TraitMethodGetterSetter extends Trait {
if (bodyIndex != -1) {
List<MethodBody> callStack = new ArrayList<>();
callStack.add(abc.bodies.get(bodyIndex));
abc.bodies.get(bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path, exportMode, isStatic, method_info, scriptIndex, classIndex, abc, this, scopeStack, 0, writer, fullyQualifiedNames, null, true, new HashSet<>());
abc.bodies.get(bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path, exportMode, isStatic, method_info, scriptIndex, classIndex, abc, this, scopeStack, 0, writer, fullyQualifiedNames, null, true, new HashSet<>(), new ArrayList<>());
}
}
}

View File

@@ -141,7 +141,7 @@ public class AS3ScriptExporter {
try {
List<MethodBody> callStack = new ArrayList<>();
callStack.add(pack.abc.findBody(method));
pack.abc.findBody(method).convert(swfVersion, 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<>());
pack.abc.findBody(method).convert(swfVersion, 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<>(), new ArrayList<>());
List<GraphTargetItem> ci = pack.abc.findBody(method).convertedItems;
if (!ci.isEmpty()) {
@@ -216,7 +216,7 @@ public class AS3ScriptExporter {
try {
List<MethodBody> callStack = new ArrayList<>();
callStack.add(pack.abc.findBody(method));
pack.abc.findBody(method).convert(swfVersion, 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<>()/*??*/);
pack.abc.findBody(method).convert(swfVersion, 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<>()/*??*/, new ArrayList<>());
List<GraphTargetItem> ci = pack.abc.findBody(method).convertedItems;
if (!ci.isEmpty() && (ci.get(0) instanceof DeclarationAVM2Item)) {
@@ -309,7 +309,7 @@ public class AS3ScriptExporter {
try {
List<MethodBody> callStack = new ArrayList<>();
callStack.add(pack.abc.findBody(iinit));
pack.abc.findBody(iinit).convert(swfVersion, 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<>());
pack.abc.findBody(iinit).convert(swfVersion, 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<>(), new ArrayList<>());
List<GraphTargetItem> iinitBody = pack.abc.findBody(iinit).convertedItems;
for (GraphTargetItem it : iinitBody) {
if (it instanceof InitPropertyAVM2Item) {

View File

@@ -2845,7 +2845,7 @@ public class XFLConverter {
try {
List<MethodBody> callStack = new ArrayList<>();
callStack.add(constructorBody);
constructorBody.convert(swfVersion, 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<>());
constructorBody.convert(swfVersion, 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<>(), new ArrayList<>());
if (constructorBody.convertedItems != null) {
for (int j = 0; j < constructorBody.convertedItems.size(); j++) {
GraphTargetItem ti = constructorBody.convertedItems.get(j);
@@ -3039,7 +3039,7 @@ public class XFLConverter {
try {
List<MethodBody> callStack = new ArrayList<>();
callStack.add(constructorBody);
constructorBody.convert(swfVersion, 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<>());
constructorBody.convert(swfVersion, 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<>(), new ArrayList<>());
List<String> allFramesAccessibilityTraitNames = new ArrayList<>();
List<String> frameTraitNames = new ArrayList<>();
if (constructorBody.convertedItems != null) {
@@ -3093,7 +3093,7 @@ public class XFLConverter {
MethodBody traitBody = abc.findBody(tm.method_info);
List<MethodBody> traitCallStack = new ArrayList<>();
traitCallStack.add(traitBody);
traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>());
traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>());
if (traitBody.convertedItems == null) {
continue;
}
@@ -3120,7 +3120,7 @@ public class XFLConverter {
MethodBody traitBody = abc.findBody(tm.method_info);
List<MethodBody> traitCallStack = new ArrayList<>();
traitCallStack.add(traitBody);
traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>());
traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>());
if (traitBody.convertedItems != null) {
for (int j = 0; j < traitBody.convertedItems.size(); j++) {
GraphTargetItem ti = traitBody.convertedItems.get(j);
@@ -3150,7 +3150,7 @@ public class XFLConverter {
MethodBody traitBody = abc.findBody(tm.method_info);
List<MethodBody> traitCallStack = new ArrayList<>();
traitCallStack.add(traitBody);
traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>());
traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>());
if (traitBody.convertedItems != null) {
if (!traitBody.convertedItems.isEmpty()) {
if (traitBody.convertedItems.get(0) instanceof IfItem) {
@@ -3252,7 +3252,7 @@ public class XFLConverter {
MethodBody traitBody = abc.findBody(tm.method_info);
List<MethodBody> traitCallStack = new ArrayList<>();
traitCallStack.add(traitBody);
traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>());
traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>());
if (traitBody.convertedItems != null) {
if (!traitBody.convertedItems.isEmpty()) {
if (traitBody.convertedItems.get(0) instanceof IfItem) {
@@ -3373,7 +3373,7 @@ public class XFLConverter {
MethodBody traitBody = abc.findBody(tm.method_info);
List<MethodBody> traitCallStack = new ArrayList<>();
traitCallStack.add(traitBody);
traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>());
traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>());
if (traitBody.convertedItems != null) {
for (int j = 0; j < traitBody.convertedItems.size(); j++) {
GraphTargetItem ti = traitBody.convertedItems.get(j);
@@ -3479,7 +3479,7 @@ public class XFLConverter {
try {
List<MethodBody> callStack = new ArrayList<>();
callStack.add(constructorBody);
constructorBody.convert(swfVersion, 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<>());
constructorBody.convert(swfVersion, 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<>(), new ArrayList<>());
Map<Integer, String> frameToTraitName = new HashMap<>();
@@ -3547,7 +3547,7 @@ public class XFLConverter {
callStack = new ArrayList<>();
callStack.add(frameBody);
frameBody.convert(swfVersion, 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<>());
frameBody.convert(swfVersion, 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<>(), new ArrayList<>());
if (frameBody.convertedItems != null) {
for (int i = 0; i < frameBody.convertedItems.size(); i++) {