diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABCInputStream.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABCInputStream.java index cd7c6bc31..0c516651a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABCInputStream.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABCInputStream.java @@ -296,38 +296,39 @@ public class ABCInputStream implements AutoCloseable { public Multiname readMultiname(String name) throws IOException { int kind = readU8("kind"); - int namespace_index = 0; - int name_index = 0; - int namespace_set_index = 0; - int qname_index = 0; - int[] params = null; + Multiname result = null; newDumpLevel(name, "Multiname"); if ((kind == Multiname.QNAME) || (kind == Multiname.QNAMEA)) { - namespace_index = readU30("namespace_index"); - name_index = readU30("name_index"); + int namespace_index = readU30("namespace_index"); + int name_index = readU30("name_index"); + result = Multiname.createQName(kind == Multiname.QNAMEA, name_index, namespace_index); } else if ((kind == Multiname.RTQNAME) || (kind == Multiname.RTQNAMEA)) { - name_index = readU30("name_index"); + int name_index = readU30("name_index"); + result = Multiname.createRTQName(kind == Multiname.RTQNAMEA, name_index); } else if ((kind == Multiname.RTQNAMEL) || (kind == Multiname.RTQNAMELA)) { - + result = Multiname.createRTQNameL(kind == Multiname.RTQNAMELA); } else if ((kind == Multiname.MULTINAME) || (kind == Multiname.MULTINAMEA)) { - name_index = readU30("name_index"); - namespace_set_index = readU30("namespace_set_index"); + int name_index = readU30("name_index"); + int namespace_set_index = readU30("namespace_set_index"); + result = Multiname.createMultiname(kind == Multiname.MULTINAMEA, name_index, namespace_set_index); } else if ((kind == Multiname.MULTINAMEL) || (kind == Multiname.MULTINAMELA)) { - namespace_set_index = readU30("namespace_set_index"); + int namespace_set_index = readU30("namespace_set_index"); + result = Multiname.createMultinameL(kind == Multiname.MULTINAMELA, namespace_set_index); } else if (kind == Multiname.TYPENAME) { - qname_index = readU30("qname_index"); // Multiname index!!! + int qname_index = readU30("qname_index"); // Multiname index!!! int paramsLength = readU30("paramsLength"); - params = new int[paramsLength]; + int[] params = new int[paramsLength]; for (int i = 0; i < paramsLength; i++) { params[i] = readU30("param"); // multiname indices! } + result = Multiname.createTypeName(qname_index, params); } else { throw new IOException("Unknown kind of Multiname:0x" + Integer.toHexString(kind)); } endDumpLevel(); - return new Multiname(kind, name_index, namespace_index, namespace_set_index, qname_index, params); + return result; } public MethodInfo readMethodInfo(String name) throws IOException { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2ConstantPool.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2ConstantPool.java index 6952aebb8..9d8b74c0e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2ConstantPool.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2ConstantPool.java @@ -396,7 +396,7 @@ public class AVM2ConstantPool implements Cloneable { } public int getQnameId(String name, int namespaceKind, String namespaceName, boolean add) { - return getMultinameId(new Multiname(Multiname.QNAME, getStringId(name, add), getNamespaceId(namespaceKind, namespaceName, 0, add), 0), add); + return getMultinameId(Multiname.createQName(false, getStringId(name, add), getNamespaceId(namespaceKind, namespaceName, 0, add)), add); } public int getPublicQnameId(String name, boolean add) { @@ -438,17 +438,17 @@ public class AVM2ConstantPool implements Cloneable { return id; } - private int getNamespaceSetId(NamespaceSet val) { + private int getNamespaceSetId(int[] namespaces) { loopi: for (int i = 1; i < constant_namespace_set.size(); i++) { NamespaceSet ts = constant_namespace_set.get(i); - if (ts.namespaces.length != val.namespaces.length) { + if (ts.namespaces.length != namespaces.length) { continue; } - for (int j = 0; j < val.namespaces.length; j++) { + for (int j = 0; j < namespaces.length; j++) { boolean found = false; - for (int k = 0; k < val.namespaces.length; k++) { - if (ts.namespaces[j] == val.namespaces[k]) { + for (int k = 0; k < namespaces.length; k++) { + if (ts.namespaces[j] == namespaces[k]) { found = true; break; } @@ -462,10 +462,10 @@ public class AVM2ConstantPool implements Cloneable { return -1; } - public int getNamespaceSetId(NamespaceSet val, boolean add) { - int id = getNamespaceSetId(val); + public int getNamespaceSetId(int[] namespaces, boolean add) { + int id = getNamespaceSetId(namespaces); if (add && id == -1) { - id = addNamespaceSet(val); + id = addNamespaceSet(new NamespaceSet(namespaces)); } return id; } @@ -498,7 +498,6 @@ public class AVM2ConstantPool implements Cloneable { } public void dump(Utf8PrintWriter writer) { - String s = ""; for (int i = 1; i < constant_int.size(); i++) { writer.println("INT[" + i + "]=" + constant_int.get(i)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/InitVectorAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/InitVectorAVM2Item.java index 858d4ae6d..e5ee8cd2f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/InitVectorAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/InitVectorAVM2Item.java @@ -18,12 +18,12 @@ package com.jpexs.decompiler.flash.abc.avm2.model; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions; import com.jpexs.decompiler.flash.abc.avm2.parser.script.AVM2SourceGenerator; import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.Namespace; -import com.jpexs.decompiler.flash.abc.types.NamespaceSet; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.DottedChain; @@ -61,11 +61,8 @@ public class InitVectorAVM2Item extends AVM2Item { List openedNamespaces; private int allNsSet(ABC abc) { - int[] nssa = new int[openedNamespaces.size()]; - for (int i = 0; i < openedNamespaces.size(); i++) { - nssa[i] = openedNamespaces.get(i); - } - return abc.constants.getNamespaceSetId(new NamespaceSet(nssa), true); + int[] nssa = Helper.toIntArray(openedNamespaces); + return abc.constants.getNamespaceSetId(nssa, true); } public InitVectorAVM2Item(AVM2Instruction ins, GraphTargetItem subtype, List arguments) { @@ -112,9 +109,11 @@ public class InitVectorAVM2Item extends AVM2Item { @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { AVM2SourceGenerator g = (AVM2SourceGenerator) generator; + ABC abc = g.abcIndex.getSelectedAbc(); + AVM2ConstantPool constants = abc.constants; List ret = toSourceMerge(localData, generator, - ins(AVM2Instructions.FindPropertyStrict, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.MULTINAME, g.abcIndex.getSelectedAbc().constants.getStringId("Vector", true), 0, g.abcIndex.getSelectedAbc().constants.getNamespaceSetId(new NamespaceSet(new int[]{g.abcIndex.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PACKAGE, "__AS3__.vec", 0, true)}), true)), true)), - ins(AVM2Instructions.GetProperty, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.MULTINAME, g.abcIndex.getSelectedAbc().constants.getStringId("Vector", true), 0, allNsSet(g.abcIndex.getSelectedAbc())), true)), + ins(AVM2Instructions.FindPropertyStrict, constants.getMultinameId(Multiname.createMultiname(false, constants.getStringId("Vector", true), constants.getNamespaceSetId(new int[]{constants.getNamespaceId(Namespace.KIND_PACKAGE, "__AS3__.vec", 0, true)}, true)), true)), + ins(AVM2Instructions.GetProperty, constants.getMultinameId(Multiname.createMultiname(false, constants.getStringId("Vector", true), allNsSet(abc)), true)), subtype, ins(AVM2Instructions.ApplyType, 1), new IntegerValueAVM2Item(null, (long) arguments.size()), @@ -127,7 +126,7 @@ public class InitVectorAVM2Item extends AVM2Item { ins(AVM2Instructions.Dup), new IntegerValueAVM2Item(null, (long) i), arguments.get(i), - ins(AVM2Instructions.SetProperty, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, g.abcIndex.getSelectedAbc().constants.getNamespaceSetId(new NamespaceSet(new int[]{g.abcIndex.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PACKAGE, "", 0, true)}), true)), true)) + ins(AVM2Instructions.SetProperty, constants.getMultinameId(Multiname.createMultinameL(false, constants.getNamespaceSetId(new int[]{constants.getNamespaceId(Namespace.KIND_PACKAGE, "", 0, true)}, true)), true)) )); } return ret; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/ASM3Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/ASM3Parser.java index ab6942e7c..1f95351c5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/ASM3Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/ASM3Parser.java @@ -260,11 +260,6 @@ public class ASM3Parser { private static int parseMultiName(AVM2ConstantPool constants, Flasm3Lexer lexer) throws AVM2ParseException, IOException { ParsedSymbol s = lexer.lex(); int kind = 0; - int name_index = 0; - int namespace_index = 0; - int namespace_set_index = 0; - int qname_index = 0; - int[] params = null; switch (s.type) { case ParsedSymbol.TYPE_KEYWORD_NULL: @@ -306,13 +301,15 @@ public class ASM3Parser { throw new AVM2ParseException("Name expected", lexer.yyline()); } - switch (s.type) { - case ParsedSymbol.TYPE_KEYWORD_QNAME: - case ParsedSymbol.TYPE_KEYWORD_QNAMEA: + Multiname multiname = null; + switch (kind) { + case Multiname.QNAME: + case Multiname.QNAMEA: { expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); - namespace_index = parseNamespace(constants, lexer); + int namespace_index = parseNamespace(constants, lexer); expected(ParsedSymbol.TYPE_COMMA, ",", lexer); ParsedSymbol name = lexer.lex(); + int name_index; if (name.type == ParsedSymbol.TYPE_KEYWORD_NULL) { name_index = 0; } else { @@ -320,11 +317,14 @@ public class ASM3Parser { name_index = constants.getStringId((String) name.value, true); } expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + multiname = Multiname.createQName(kind == Multiname.QNAMEA, name_index, namespace_index); break; - case ParsedSymbol.TYPE_KEYWORD_RTQNAME: - case ParsedSymbol.TYPE_KEYWORD_RTQNAMEA: + } + case Multiname.RTQNAME: + case Multiname.RTQNAMEA: { expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); ParsedSymbol rtqName = lexer.lex(); + int name_index; if (rtqName.type == ParsedSymbol.TYPE_KEYWORD_NULL) { name_index = 0; } else { @@ -332,16 +332,21 @@ public class ASM3Parser { name_index = constants.getStringId((String) rtqName.value, true); } expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + multiname = Multiname.createRTQName(kind == Multiname.RTQNAMEA, name_index); break; - case ParsedSymbol.TYPE_KEYWORD_RTQNAMEL: - case ParsedSymbol.TYPE_KEYWORD_RTQNAMELA: + } + case Multiname.RTQNAMEL: + case Multiname.RTQNAMELA: { expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + multiname = Multiname.createRTQNameL(kind == Multiname.RTQNAMELA); break; - case ParsedSymbol.TYPE_KEYWORD_MULTINAME: - case ParsedSymbol.TYPE_KEYWORD_MULTINAMEA: + } + case Multiname.MULTINAME: + case Multiname.MULTINAMEA: { expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); ParsedSymbol mName = lexer.lex(); + int name_index; if (mName.type == ParsedSymbol.TYPE_KEYWORD_NULL) { name_index = 0; } else { @@ -349,18 +354,22 @@ public class ASM3Parser { name_index = constants.getStringId((String) mName.value, true); } expected(ParsedSymbol.TYPE_COMMA, ",", lexer); - namespace_set_index = parseNamespaceSet(constants, lexer); + int namespace_set_index = parseNamespaceSet(constants, lexer); expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + multiname = Multiname.createMultiname(kind == Multiname.MULTINAMEA, name_index, namespace_set_index); break; - case ParsedSymbol.TYPE_KEYWORD_MULTINAMEL: - case ParsedSymbol.TYPE_KEYWORD_MULTINAMELA: + } + case Multiname.MULTINAMEL: + case Multiname.MULTINAMELA: { expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); - namespace_set_index = parseNamespaceSet(constants, lexer); + int namespace_set_index = parseNamespaceSet(constants, lexer); expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + multiname = Multiname.createMultinameL(kind == Multiname.MULTINAMELA, namespace_set_index); break; - case ParsedSymbol.TYPE_KEYWORD_TYPENAME: + } + case Multiname.TYPENAME: { expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); - qname_index = parseMultiName(constants, lexer); + int qname_index = parseMultiName(constants, lexer); expected(ParsedSymbol.TYPE_LOWERTHAN, "<", lexer); List paramsList = new ArrayList<>(); paramsList.add(parseMultiName(constants, lexer)); @@ -369,13 +378,15 @@ public class ASM3Parser { paramsList.add(parseMultiName(constants, lexer)); nt = lexer.lex(); } - params = Helper.toIntArray(paramsList); + int[] params = Helper.toIntArray(paramsList); expected(nt, ParsedSymbol.TYPE_GREATERTHAN, ">"); expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + multiname = Multiname.createTypeName(qname_index, params); break; + } } - return constants.getMultinameId(new Multiname(kind, name_index, namespace_index, namespace_set_index, qname_index, params), true); + return constants.getMultinameId(multiname, true); } public static ValueKind parseValue(AVM2ConstantPool constants, Flasm3Lexer lexer) throws IOException, AVM2ParseException { 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 924c552a7..f00b3db41 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 @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; @@ -56,7 +57,6 @@ import com.jpexs.decompiler.flash.abc.types.MethodBody; import com.jpexs.decompiler.flash.abc.types.MethodInfo; import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.Namespace; -import com.jpexs.decompiler.flash.abc.types.NamespaceSet; import com.jpexs.decompiler.flash.abc.types.ScriptInfo; import com.jpexs.decompiler.flash.abc.types.ValueKind; import com.jpexs.decompiler.flash.abc.types.traits.Trait; @@ -91,6 +91,7 @@ import com.jpexs.decompiler.graph.model.TernarOpItem; import com.jpexs.decompiler.graph.model.TrueItem; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; import com.jpexs.decompiler.graph.model.WhileItem; +import com.jpexs.helpers.Helper; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -142,11 +143,13 @@ public class AVM2SourceGenerator implements SourceGenerator { for (int i = 0; i < item.openedNamespaces.size(); i++) { nssa[i] = item.openedNamespaces.get(i); } - int nsset = abcIndex.getSelectedAbc().constants.getNamespaceSetId(new NamespaceSet(nssa), true); + + AVM2ConstantPool constants = abcIndex.getSelectedAbc().constants; + int nsset = constants.getNamespaceSetId(nssa, true); return GraphTargetItem.toSourceMerge(localData, this, item.object, - ins(AVM2Instructions.GetDescendants, abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.MULTINAME, abcIndex.getSelectedAbc().constants.getStringId(item.nameStr, true), 0, nsset), true)) + ins(AVM2Instructions.GetDescendants, constants.getMultinameId(Multiname.createMultiname(false, constants.getStringId(item.nameStr, true), nsset), true)) ); } @@ -282,6 +285,7 @@ public class AVM2SourceGenerator implements SourceGenerator { final Reference collectionReg = new Reference<>(0); final Reference xmlListReg = new Reference<>(0); List xmlListSetTemp = AssignableAVM2Item.setTemp(localData, this, xmlListReg); + AVM2ConstantPool constants = abcIndex.getSelectedAbc().constants; ret.addAll(GraphTargetItem.toSourceMerge(localData, this, ins(AVM2Instructions.PushByte, 0), AssignableAVM2Item.setTemp(localData, this, counterReg), @@ -289,8 +293,8 @@ public class AVM2SourceGenerator implements SourceGenerator { ins(AVM2Instructions.CheckFilter), NameAVM2Item.generateCoerce(localData, this, TypeItem.UNBOUNDED), AssignableAVM2Item.setTemp(localData, this, collectionReg), - ins(AVM2Instructions.GetLex, abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.QNAME, abcIndex.getSelectedAbc().constants.getStringId("XMLList", true), abcIndex.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PACKAGE, "", 0, true), 0), true)), - ins(AVM2Instructions.PushString, abcIndex.getSelectedAbc().constants.getStringId("", true)), + ins(AVM2Instructions.GetLex, constants.getMultinameId(Multiname.createQName(false, constants.getStringId("XMLList", true), constants.getNamespaceId(Namespace.KIND_PACKAGE, "", 0, true)), true)), + ins(AVM2Instructions.PushString, constants.getStringId("", true)), ins(AVM2Instructions.Construct, 1), xmlListSetTemp )); @@ -312,11 +316,8 @@ public class AVM2SourceGenerator implements SourceGenerator { trueBody.addAll(toInsList(AssignableAVM2Item.getTemp(localData, this, xmlListReg))); trueBody.addAll(toInsList(AssignableAVM2Item.getTemp(localData, this, counterReg))); trueBody.addAll(toInsList(AssignableAVM2Item.getTemp(localData, this, tempVal1))); - int[] nss = new int[item.openedNamespaces.size()]; - for (int i = 0; i < item.openedNamespaces.size(); i++) { - nss[i] = item.openedNamespaces.get(i); - } - trueBody.add(ins(AVM2Instructions.SetProperty, abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, abcIndex.getSelectedAbc().constants.getNamespaceSetId(new NamespaceSet(nss), true)), true))); + int[] nss = Helper.toIntArray(item.openedNamespaces); + trueBody.add(ins(AVM2Instructions.SetProperty, constants.getMultinameId(Multiname.createMultinameL(false, constants.getNamespaceSetId(nss, true)), true))); forBody.add(ins(AVM2Instructions.IfFalse, insToBytes(trueBody).length)); forBody.addAll(trueBody); forBody.add(ins(AVM2Instructions.PopScope)); @@ -689,12 +690,13 @@ public class AVM2SourceGenerator implements SourceGenerator { scope = localData.scopeStack.size(); localData.scopeStack.add(new PropertyAVM2Item(null, item.functionName, abcIndex, new ArrayList<>(), localData.callStack)); } - ret.add(ins(AVM2Instructions.NewFunction, method(false, abcIndex.getSelectedAbc().constants.getStringId(item.functionName, true), true, false, localData.callStack, localData.pkg, item.needsActivation, item.subvariables, 0 /*Set later*/, item.hasRest, item.line, localData.currentClass, null, false, localData, item.paramTypes, item.paramNames, item.paramValues, item.body, item.retType))); + AVM2ConstantPool constants = abcIndex.getSelectedAbc().constants; + ret.add(ins(AVM2Instructions.NewFunction, method(false, constants.getStringId(item.functionName, true), true, false, localData.callStack, localData.pkg, item.needsActivation, item.subvariables, 0 /*Set later*/, item.hasRest, item.line, localData.currentClass, null, false, localData, item.paramTypes, item.paramNames, item.paramValues, item.body, item.retType))); if (!item.functionName.isEmpty()) { ret.add(ins(AVM2Instructions.Dup)); ret.add(ins(AVM2Instructions.GetScopeObject, scope)); ret.add(ins(AVM2Instructions.Swap)); - ret.add(ins(AVM2Instructions.SetProperty, abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.QNAME, abcIndex.getSelectedAbc().constants.getStringId(item.functionName, true), abcIndex.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PACKAGE, localData.pkg, 0, true), 0), true))); + ret.add(ins(AVM2Instructions.SetProperty, constants.getMultinameId(Multiname.createQName(false, constants.getStringId(item.functionName, true), constants.getNamespaceId(Namespace.KIND_PACKAGE, localData.pkg, 0, true)), true))); ret.add(ins(AVM2Instructions.PopScope)); localData.scopeStack.remove(localData.scopeStack.size() - 1); } @@ -716,7 +718,7 @@ public class AVM2SourceGenerator implements SourceGenerator { int finallyEx = -1; for (NameAVM2Item e : item.catchExceptions2) { ABCException aex = new ABCException(); - aex.name_index = abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.QNAME, abcIndex.getSelectedAbc().constants.getStringId(e.getVariableName(), true), abcIndex.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PACKAGE, "", 0, true), 0), true); + aex.name_index = abcIndex.getSelectedAbc().constants.getMultinameId(Multiname.createQName(false, abcIndex.getSelectedAbc().constants.getStringId(e.getVariableName(), true), abcIndex.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PACKAGE, "", 0, true)), true); aex.type_index = typeName(localData, e.type); newex.add(aex); } @@ -1289,7 +1291,7 @@ public class AVM2SourceGenerator implements SourceGenerator { } public int traitName(int namespace, String var) { - return abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.QNAME, str(var), namespace, 0), true); + return abcIndex.getSelectedAbc().constants.getMultinameId(Multiname.createQName(false, str(var), namespace), true); } public int typeName(SourceGeneratorLocalData localData, GraphTargetItem type) throws CompilationException { @@ -1338,7 +1340,7 @@ public class AVM2SourceGenerator implements SourceGenerator { public int propertyName(GraphTargetItem name) { if (name instanceof NameAVM2Item) { NameAVM2Item va = (NameAVM2Item) name; - return abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.QNAME, str(va.getVariableName()), namespace(Namespace.KIND_PACKAGE, ""), 0), true); + return abcIndex.getSelectedAbc().constants.getMultinameId(Multiname.createQName(false, str(va.getVariableName()), namespace(Namespace.KIND_PACKAGE, "")), true); } throw new RuntimeException("no prop"); //FIXME } @@ -1639,7 +1641,7 @@ public class AVM2SourceGenerator implements SourceGenerator { for (int i = 1; i < slotNames.size(); i++) { TraitSlotConst tsc = new TraitSlotConst(); tsc.slot_id = slotId++; - tsc.name_index = abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.QNAME, abcIndex.getSelectedAbc().constants.getStringId(slotNames.get(i), true), abcIndex.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PACKAGE_INTERNAL, pkg, 0, true), 0), true); + tsc.name_index = abcIndex.getSelectedAbc().constants.getMultinameId(Multiname.createQName(false, abcIndex.getSelectedAbc().constants.getStringId(slotNames.get(i), true), abcIndex.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PACKAGE_INTERNAL, pkg, 0, true)), true); tsc.type_index = typeName(localData, new TypeItem(slotTypes.get(i))); mbody.traits.traits.add(tsc); } @@ -1905,15 +1907,15 @@ public class AVM2SourceGenerator implements SourceGenerator { InstanceInfo instanceInfo = abcIndex.getSelectedAbc().instance_info.get(((TraitClass) traits[k]).class_info); instanceInfo.name_index = abcIndex.getSelectedAbc().constants.getMultinameId( - new Multiname( - Multiname.QNAME, + Multiname.createQName( + false, abcIndex.getSelectedAbc().constants.getStringId(((ClassAVM2Item) item).className, true), - ((ClassAVM2Item) item).namespace, 0), true); + ((ClassAVM2Item) item).namespace), true); if (((ClassAVM2Item) item).extendsOp != null) { instanceInfo.super_index = typeName(localData, ((ClassAVM2Item) item).extendsOp); } else { - instanceInfo.super_index = abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.QNAME, str("Object"), namespace(Namespace.KIND_PACKAGE, ""), 0), true); + instanceInfo.super_index = abcIndex.getSelectedAbc().constants.getMultinameId(Multiname.createQName(false, str("Object"), namespace(Namespace.KIND_PACKAGE, "")), true); } instanceInfo.interfaces = new int[((ClassAVM2Item) item).implementsOp.size()]; for (int i = 0; i < ((ClassAVM2Item) item).implementsOp.size(); i++) { @@ -1921,9 +1923,11 @@ public class AVM2SourceGenerator implements SourceGenerator { } } if (item instanceof InterfaceAVM2Item) { - InstanceInfo instanceInfo = abcIndex.getSelectedAbc().instance_info.get(((TraitClass) traits[k]).class_info); - instanceInfo.name_index = abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.QNAME, abcIndex.getSelectedAbc().constants.getStringId(((InterfaceAVM2Item) item).name, true), - abcIndex.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PACKAGE, ((InterfaceAVM2Item) item).pkg, 0, true), 0), true); + ABC abc = abcIndex.getSelectedAbc(); + AVM2ConstantPool constants = abc.constants; + InstanceInfo instanceInfo = abc.instance_info.get(((TraitClass) traits[k]).class_info); + instanceInfo.name_index = constants.getMultinameId(Multiname.createQName(false, constants.getStringId(((InterfaceAVM2Item) item).name, true), + constants.getNamespaceId(Namespace.KIND_PACKAGE, ((InterfaceAVM2Item) item).pkg, 0, true)), true); instanceInfo.interfaces = new int[((InterfaceAVM2Item) item).superInterfaces.size()]; for (int i = 0; i < ((InterfaceAVM2Item) item).superInterfaces.size(); i++) { @@ -1945,7 +1949,7 @@ public class AVM2SourceGenerator implements SourceGenerator { TypeItem sup = (TypeItem) un; int propId = resolveType(localData, sup, abcIndex); int[] nss = new int[]{abcIndex.getSelectedAbc().constants.getMultiname(propId).namespace_index}; - return abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.MULTINAME, abcIndex.getSelectedAbc().constants.getMultiname(propId).name_index, 0, abcIndex.getSelectedAbc().constants.getNamespaceSetId(new NamespaceSet(nss), true)), true); + return abcIndex.getSelectedAbc().constants.getMultinameId(Multiname.createMultiname(false, abcIndex.getSelectedAbc().constants.getMultiname(propId).name_index, abcIndex.getSelectedAbc().constants.getNamespaceSetId(nss, true)), true); } @@ -2145,9 +2149,11 @@ public class AVM2SourceGenerator implements SourceGenerator { abcIndex.refreshSelected(); - MethodInfo mi = new MethodInfo(new int[0], 0, abcIndex.getSelectedAbc().constants.getStringId("", true), 0, new ValueKind[0], new int[0]); - MethodBody mb = new MethodBody(abcIndex.getSelectedAbc(), new Traits(), new byte[0], new ABCException[0]); - mb.method_info = abcIndex.getSelectedAbc().addMethodInfo(mi); + ABC abc = abcIndex.getSelectedAbc(); + AVM2ConstantPool constants = abc.constants; + MethodInfo mi = new MethodInfo(new int[0], 0, constants.getStringId("", true), 0, new ValueKind[0], new int[0]); + MethodBody mb = new MethodBody(abc, new Traits(), new byte[0], new ABCException[0]); + mb.method_info = abc.addMethodInfo(mi); mb.setCode(new AVM2Code()); List mbCode = mb.getCode().code; mbCode.add(ins(AVM2Instructions.GetLocal0)); @@ -2165,23 +2171,25 @@ public class AVM2SourceGenerator implements SourceGenerator { mbCode.add(ins(AVM2Instructions.GetScopeObject, 0)); traitScope++; } else { - NamespaceSet nsset = new NamespaceSet(new int[]{abcIndex.getSelectedAbc().constants.getMultiname(tc.name_index).namespace_index}); - mbCode.add(ins(AVM2Instructions.FindPropertyStrict, abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.MULTINAME, abcIndex.getSelectedAbc().constants.getMultiname(tc.name_index).name_index, 0, abcIndex.getSelectedAbc().constants.getNamespaceSetId(nsset, true)), true))); + int[] nsset = new int[]{constants.getMultiname(tc.name_index).namespace_index}; + mbCode.add(ins(AVM2Instructions.FindPropertyStrict, constants.getMultinameId(Multiname.createMultiname(false, constants.getMultiname(tc.name_index).name_index, constants.getNamespaceSetId(nsset, true)), true))); } - if (abcIndex.getSelectedAbc().instance_info.get(tc.class_info).isInterface()) { + if (abc.instance_info.get(tc.class_info).isInterface()) { mbCode.add(ins(AVM2Instructions.PushNull)); } else { - AbcIndexing.ClassIndex ci = abcIndex.findClass(AbcIndexing.multinameToType(abcIndex.getSelectedAbc().instance_info.get(tc.class_info).name_index, abcIndex.getSelectedAbc().constants)); + AbcIndexing.ClassIndex ci = abcIndex.findClass(AbcIndexing.multinameToType(abc.instance_info.get(tc.class_info).name_index, constants)); while (ci != null && ci.parent != null) { ci = ci.parent; Multiname origM = ci.abc.constants.getMultiname(ci.abc.instance_info.get(ci.index).name_index); Namespace origNs = ci.abc.constants.getNamespace(origM.namespace_index); - parents.add(abcIndex.getSelectedAbc().constants.getMultinameId( - new Multiname(origM.kind, - abcIndex.getSelectedAbc().constants.getStringId(ci.abc.constants.getString(origM.name_index), true), - abcIndex.getSelectedAbc().constants.getNamespaceId(origNs.kind, - ci.abc.constants.getString(origNs.name_index), 0, true), 0), true)); + if (origM.kind == Multiname.QNAME || origM.kind == Multiname.QNAMEA) { + parents.add(constants.getMultinameId( + Multiname.createQName(origM.kind == Multiname.QNAMEA, + constants.getStringId(ci.abc.constants.getString(origM.name_index), true), + constants.getNamespaceId(origNs.kind, + ci.abc.constants.getString(origNs.name_index), 0, true)), true)); + } } //add all parent objects to scopestack @@ -2205,8 +2213,8 @@ public class AVM2SourceGenerator implements SourceGenerator { } mbCode.add(ins(AVM2Instructions.ReturnVoid)); - mb.autoFillStats(abcIndex.getSelectedAbc(), 1, false); - abcIndex.getSelectedAbc().addMethodBody(mb); + mb.autoFillStats(abc, 1, false); + abc.addMethodBody(mb); si.init_index = mb.method_info; localData.pkg = DottedChain.EMPTY; //FIXME: pkg.packageName; generateTraitsPhase3(1/*??*/, false, null, null, true, localData, commands, si.traits, traitArr, initScopes, class_index); @@ -2228,9 +2236,9 @@ public class AVM2SourceGenerator implements SourceGenerator { Multiname superName = a.constants.getMultiname(m); indices.add( abc.getSelectedAbc().constants.getMultinameId( - new Multiname(Multiname.QNAME, + Multiname.createQName(false, abc.getSelectedAbc().constants.getStringId(superName.getName(a.constants, null, true), true), - abc.getSelectedAbc().constants.getNamespaceId(superName.getNamespace(a.constants).kind, superName.getNamespace(a.constants).getName(a.constants), 0, true), 0), true) + abc.getSelectedAbc().constants.getNamespaceId(superName.getNamespace(a.constants).kind, superName.getNamespace(a.constants).getName(a.constants), 0, true)), true) ); } } @@ -2352,13 +2360,13 @@ public class AVM2SourceGenerator implements SourceGenerator { } } - public static int resolveType(SourceGeneratorLocalData localData, GraphTargetItem item, AbcIndexing abc) throws CompilationException { + public static int resolveType(SourceGeneratorLocalData localData, GraphTargetItem item, AbcIndexing abcIndex) throws CompilationException { int name_index = 0; GraphTargetItem typeItem = null; if (item instanceof UnresolvedAVM2Item) { String fullClass = localData.getFullClass(); - item = ((UnresolvedAVM2Item) item).resolve(new TypeItem(fullClass), new ArrayList<>(), new ArrayList<>(), abc, new ArrayList<>(), new ArrayList<>()); + item = ((UnresolvedAVM2Item) item).resolve(new TypeItem(fullClass), new ArrayList<>(), new ArrayList<>(), abcIndex, new ArrayList<>(), new ArrayList<>()); } if (item instanceof TypeItem) { typeItem = item; @@ -2369,7 +2377,7 @@ public class AVM2SourceGenerator implements SourceGenerator { } if (typeItem instanceof UnresolvedAVM2Item) { String fullClass = localData.getFullClass(); - typeItem = ((UnresolvedAVM2Item) typeItem).resolve(new TypeItem(fullClass), new ArrayList<>(), new ArrayList<>(), abc, new ArrayList<>(), new ArrayList<>()); + typeItem = ((UnresolvedAVM2Item) typeItem).resolve(new TypeItem(fullClass), new ArrayList<>(), new ArrayList<>(), abcIndex, new ArrayList<>(), new ArrayList<>()); } if (!(typeItem instanceof TypeItem)) { @@ -2391,24 +2399,26 @@ public class AVM2SourceGenerator implements SourceGenerator { } } }*/ - AbcIndexing.ClassIndex ci = abc.findClass(new TypeItem(dname)); + ABC abc = abcIndex.getSelectedAbc(); + AVM2ConstantPool constants = abc.constants; + AbcIndexing.ClassIndex ci = abcIndex.findClass(new TypeItem(dname)); if (ci != null) { Multiname m = ci.abc.instance_info.get(ci.index).getName(ci.abc.constants); if (m != null) { Namespace ns = ci.abc.instance_info.get(ci.index).getName(ci.abc.constants).getNamespace(ci.abc.constants); String n = m.getName(ci.abc.constants, new ArrayList<>(), true); String nsn = ns == null ? null : ns.getName(ci.abc.constants).toRawString(); - name_index = abc.getSelectedAbc().constants.getQnameId( + name_index = constants.getQnameId( n, ns == null ? Namespace.KIND_PACKAGE : ns.kind, nsn, true); } } - for (int i = 1; i < abc.getSelectedAbc().constants.getMultinameCount(); i++) { - Multiname mname = abc.getSelectedAbc().constants.getMultiname(i); - if (mname != null && name.equals(mname.getName(abc.getSelectedAbc().constants, null, true))) { - if (mname.getNamespace(abc.getSelectedAbc().constants) != null && pkg.equals(mname.getNamespace(abc.getSelectedAbc().constants).getName(abc.getSelectedAbc().constants))) { + for (int i = 1; i < constants.getMultinameCount(); i++) { + Multiname mname = constants.getMultiname(i); + if (mname != null && name.equals(mname.getName(constants, null, true))) { + if (mname.getNamespace(constants) != null && pkg.equals(mname.getNamespace(constants).getName(constants))) { name_index = i; break; } @@ -2417,14 +2427,14 @@ public class AVM2SourceGenerator implements SourceGenerator { if (name_index == 0) { if (pkg.isEmpty() && localData.currentScript != null /*FIXME!*/) { for (Trait t : localData.currentScript.traits.traits) { - if (t.getName(abc.getSelectedAbc()).getName(abc.getSelectedAbc().constants, null, true).equals(name)) { + if (t.getName(abc).getName(constants, null, true).equals(name)) { name_index = t.name_index; break; } } } if (name_index == 0) { - name_index = abc.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.QNAME, abc.getSelectedAbc().constants.getStringId(name, true), abc.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PACKAGE, pkg, 0, true), 0), true); + name_index = constants.getMultinameId(Multiname.createQName(false, constants.getStringId(name, true), constants.getNamespaceId(Namespace.KIND_PACKAGE, pkg, 0, true)), true); } } @@ -2433,9 +2443,9 @@ public class AVM2SourceGenerator implements SourceGenerator { int[] params = new int[atype.params.size()]; int i = 0; for (GraphTargetItem s : atype.params) { - params[i++] = resolveType(localData, s, abc); + params[i++] = resolveType(localData, s, abcIndex); } - return abc.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.TYPENAME, 0, 0, 0, name_index, params), true); + return constants.getMultinameId(Multiname.createTypeName(name_index, params), true); } return name_index; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java index 8bb72e016..abab27bc6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.SWC; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.abc.avm2.model.ApplyTypeAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.BooleanAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.CoerceAVM2Item; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ConstructSomethingAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ConstructSomethingAVM2Item.java index d98acbfbf..dcc71bdc0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ConstructSomethingAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ConstructSomethingAVM2Item.java @@ -21,7 +21,6 @@ import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions; import com.jpexs.decompiler.flash.abc.types.Namespace; -import com.jpexs.decompiler.flash.abc.types.NamespaceSet; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -53,7 +52,7 @@ public class ConstructSomethingAVM2Item extends CallAVM2Item { nssa[i] = openedNamespaces.get(i); } nssa[nssa.length - 1] = abc.constants.getNamespaceId(Namespace.KIND_PACKAGE, "__AS3__.vec", 0, true); - return abc.constants.getNamespaceSetId(new NamespaceSet(nssa), true); + return abc.constants.getNamespaceSetId(nssa, true); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/IndexAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/IndexAVM2Item.java index e6e5ff312..cf7f24bc9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/IndexAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/IndexAVM2Item.java @@ -20,7 +20,6 @@ import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions; import com.jpexs.decompiler.flash.abc.types.Multiname; -import com.jpexs.decompiler.flash.abc.types.NamespaceSet; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -28,6 +27,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; +import com.jpexs.helpers.Helper; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -55,11 +55,8 @@ public class IndexAVM2Item extends AssignableAVM2Item { } private int allNsSet(ABC abc) { - int[] nssa = new int[openedNamespaces.size()]; - for (int i = 0; i < openedNamespaces.size(); i++) { - nssa[i] = openedNamespaces.get(i); - } - return abc.constants.getNamespaceSetId(new NamespaceSet(nssa), true); + int[] nssa = Helper.toIntArray(openedNamespaces); + return abc.constants.getNamespaceSetId(nssa, true); } @Override @@ -88,7 +85,7 @@ public class IndexAVM2Item extends AssignableAVM2Item { Reference index_temp = new Reference<>(-1); Reference val_temp = new Reference<>(-1); AVM2SourceGenerator g = (AVM2SourceGenerator) generator; - int indexPropIndex = g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(attr ? Multiname.MULTINAMELA : Multiname.MULTINAMEL, 0, 0, allNsSet(g.abcIndex.getSelectedAbc())), true); + int indexPropIndex = g.abcIndex.getSelectedAbc().constants.getMultinameId(Multiname.createMultinameL(attr, allNsSet(g.abcIndex.getSelectedAbc())), true); return toSourceMerge(localData, generator, object, dupSetTemp(localData, generator, obj_temp), @@ -110,7 +107,7 @@ public class IndexAVM2Item extends AssignableAVM2Item { public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator, boolean needsReturn, boolean call, List callargs, boolean delete, boolean construct) throws CompilationException { AVM2SourceGenerator g = (AVM2SourceGenerator) generator; - int indexPropIndex = g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(attr ? Multiname.MULTINAMELA : Multiname.MULTINAMEL, 0, 0, allNsSet(g.abcIndex.getSelectedAbc())), true); + int indexPropIndex = g.abcIndex.getSelectedAbc().constants.getMultinameId(Multiname.createMultinameL(attr, allNsSet(g.abcIndex.getSelectedAbc())), true); Reference ret_temp = new Reference<>(-1); if (assignedValue != null) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java index f66cc89a2..201850ac6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java @@ -17,14 +17,12 @@ package com.jpexs.decompiler.flash.abc.avm2.parser.script; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; -import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions; import com.jpexs.decompiler.flash.abc.avm2.model.IntegerValueAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NanAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NullAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.UndefinedAVM2Item; -import com.jpexs.decompiler.flash.abc.types.NamespaceSet; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -152,14 +150,6 @@ public class NameAVM2Item extends AssignableAVM2Item { return writer; } - private int allNsSet(ABC abc) { - int[] nssa = new int[openedNamespaces.size()]; - for (int i = 0; i < openedNamespaces.size(); i++) { - nssa[i] = openedNamespaces.get(i); - } - return abc.constants.getNamespaceSetId(new NamespaceSet(nssa), true); - } - public static GraphTargetItem getDefaultValue(String type) { switch (type) { case "*": diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespacedAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespacedAVM2Item.java index 23606b40f..11efea864 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespacedAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespacedAVM2Item.java @@ -18,9 +18,9 @@ package com.jpexs.decompiler.flash.abc.avm2.parser.script; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions; import com.jpexs.decompiler.flash.abc.types.Multiname; -import com.jpexs.decompiler.flash.abc.types.NamespaceSet; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.DottedChain; @@ -29,6 +29,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; +import com.jpexs.helpers.Helper; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -62,11 +63,8 @@ public class NamespacedAVM2Item extends AssignableAVM2Item { } private int allNsSet(ABC abc) { - int[] nssa = new int[openedNamespaces.size()]; - for (int i = 0; i < openedNamespaces.size(); i++) { - nssa[i] = openedNamespaces.get(i); - } - return abc.constants.getNamespaceSetId(new NamespaceSet(nssa), true); + int[] nssa = Helper.toIntArray(openedNamespaces); + return abc.constants.getNamespaceSetId(nssa, true); } @Override @@ -102,17 +100,19 @@ public class NamespacedAVM2Item extends AssignableAVM2Item { killTemp(localData, generator, Arrays.asList(ret_temp, name_temp, ns_temp))); } else */ + ABC abc = g.abcIndex.getSelectedAbc(); + AVM2ConstantPool constants = abc.constants; if (name != null) { return toSourceMerge(localData, generator, ns, NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)), - ins(AVM2Instructions.FindPropertyStrict, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abcIndex.getSelectedAbc().constants.getStringId(name, true), 0, 0), true)), + ins(AVM2Instructions.FindPropertyStrict, constants.getMultinameId(Multiname.createRTQName(false, constants.getStringId(name, true)), true)), dupSetTemp(localData, generator, name_temp), ns, NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)), dupSetTemp(localData, generator, ns_temp), //Start get original //getTemp(localData, generator, ns_temp), generateCoerce(generator, "Namespace"), ins(AVM2Instructions.FindPropertyStrict, g.abc.getLastAbc().constants.getMultinameId(new Multiname(Multiname.RTQNAME, g.abc.getLastAbc().constants.getStringId(variableName, true), 0, 0, 0, new ArrayList()), true)), //getTemp(localData, generator, ns_temp), generateCoerce(generator, "Namespace"), - ins(AVM2Instructions.GetProperty, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, allNsSet(g.abcIndex.getSelectedAbc())), true)), + ins(AVM2Instructions.GetProperty, constants.getMultinameId(Multiname.createMultinameL(false, allNsSet(abc)), true)), !isInteger ? ins(AVM2Instructions.ConvertD) : null, //End get original (!post) ? (decrement ? ins(isInteger ? AVM2Instructions.DecrementI : AVM2Instructions.Decrement) : ins(isInteger ? AVM2Instructions.IncrementI : AVM2Instructions.Increment)) : null, @@ -122,7 +122,7 @@ public class NamespacedAVM2Item extends AssignableAVM2Item { getTemp(localData, generator, name_temp), getTemp(localData, generator, ns_temp), getTemp(localData, generator, ret_temp), - ins(AVM2Instructions.SetProperty, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.MULTINAMEL, 0, 0, allNsSet(g.abcIndex.getSelectedAbc())), true)), + ins(AVM2Instructions.SetProperty, constants.getMultinameId(Multiname.createMultinameL(false, allNsSet(abc)), true)), killTemp(localData, generator, Arrays.asList(ret_temp, name_temp, ns_temp)) ); } else { @@ -153,23 +153,24 @@ public class NamespacedAVM2Item extends AssignableAVM2Item { Reference obj_temp = new Reference<>(-1); + AVM2ConstantPool constants = g.abcIndex.getSelectedAbc().constants; if (name == null) { if (assignedValue != null) { return toSourceMerge(localData, generator, - obj == null ? ns : null, obj == null ? NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)) : null, nameItem, ins(AVM2Instructions.ConvertS), obj != null ? obj : ins(AVM2Instructions.FindPropertyStrict, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0), true)), + obj == null ? ns : null, obj == null ? NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)) : null, nameItem, ins(AVM2Instructions.ConvertS), obj != null ? obj : ins(AVM2Instructions.FindPropertyStrict, constants.getMultinameId(Multiname.createRTQNameL(false), true)), ns, NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)), nameItem, ins(AVM2Instructions.ConvertS), assignedValue, needsReturn ? dupSetTemp(localData, generator, ret_temp) : null, - ins(AVM2Instructions.SetProperty, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0), true)), + ins(AVM2Instructions.SetProperty, constants.getMultinameId(Multiname.createRTQNameL(false), true)), needsReturn ? getTemp(localData, generator, ret_temp) : null, killTemp(localData, generator, Arrays.asList(ns_temp, index_temp, ret_temp)) ); } else { return toSourceMerge(localData, generator, - obj == null ? ns : null, obj == null ? NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)) : null, nameItem, ins(AVM2Instructions.ConvertS), obj != null ? obj : ins(AVM2Instructions.FindPropertyStrict, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0), true)), + obj == null ? ns : null, obj == null ? NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)) : null, nameItem, ins(AVM2Instructions.ConvertS), obj != null ? obj : ins(AVM2Instructions.FindPropertyStrict, constants.getMultinameId(Multiname.createRTQNameL(false), true)), call ? dupSetTemp(localData, generator, obj_temp) : null, ns, NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)), nameItem, ins(AVM2Instructions.ConvertS), construct ? callargs : null, - ins(construct ? AVM2Instructions.ConstructProp : delete ? AVM2Instructions.DeleteProperty : AVM2Instructions.GetProperty, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.RTQNAMEL, 0, 0, 0), true), construct ? callargs.size() : null), + ins(construct ? AVM2Instructions.ConstructProp : delete ? AVM2Instructions.DeleteProperty : AVM2Instructions.GetProperty, constants.getMultinameId(Multiname.createRTQNameL(false), true), construct ? callargs.size() : null), call ? getTemp(localData, generator, obj_temp) : null, call ? callargs : null, call ? ins(AVM2Instructions.Call, callargs.size()) : null, @@ -180,20 +181,20 @@ public class NamespacedAVM2Item extends AssignableAVM2Item { } else { if (assignedValue != null) { return toSourceMerge(localData, generator, - obj == null ? ns : null, obj == null ? NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)) : null, obj != null ? obj : ins(AVM2Instructions.FindPropertyStrict, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(attr ? Multiname.RTQNAMEA : Multiname.RTQNAME, g.abcIndex.getSelectedAbc().constants.getStringId(name, true), 0, 0), true)), + obj == null ? ns : null, obj == null ? NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)) : null, obj != null ? obj : ins(AVM2Instructions.FindPropertyStrict, constants.getMultinameId(Multiname.createRTQName(attr, constants.getStringId(name, true)), true)), ns, NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)), assignedValue, needsReturn ? dupSetTemp(localData, generator, ret_temp) : null, - ins(AVM2Instructions.SetProperty, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(attr ? Multiname.RTQNAMEA : Multiname.RTQNAME, g.abcIndex.getSelectedAbc().constants.getStringId(name, true), 0, 0), true)), + ins(AVM2Instructions.SetProperty, constants.getMultinameId(Multiname.createRTQName(attr, constants.getStringId(name, true)), true)), needsReturn ? getTemp(localData, generator, ret_temp) : null, killTemp(localData, generator, Arrays.asList(ns_temp, index_temp, ret_temp)) ); } else { return toSourceMerge(localData, generator, - obj == null ? ns : null, obj == null ? NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)) : null, obj != null ? obj : ins(AVM2Instructions.FindPropertyStrict, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(attr ? Multiname.RTQNAMEA : Multiname.RTQNAME, g.abcIndex.getSelectedAbc().constants.getStringId(name, true), 0, 0), true)), + obj == null ? ns : null, obj == null ? NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)) : null, obj != null ? obj : ins(AVM2Instructions.FindPropertyStrict, constants.getMultinameId(Multiname.createRTQName(attr, constants.getStringId(name, true)), true)), call ? dupSetTemp(localData, generator, obj_temp) : null, ns, NameAVM2Item.generateCoerce(localData, generator, new TypeItem(DottedChain.NAMESPACE)), construct ? callargs : null, - ins(construct ? AVM2Instructions.ConstructProp : delete ? AVM2Instructions.DeleteProperty : AVM2Instructions.GetProperty, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(attr ? Multiname.RTQNAMEA : Multiname.RTQNAME, g.abcIndex.getSelectedAbc().constants.getStringId(name, true), 0, 0), true), construct ? callargs.size() : null), + ins(construct ? AVM2Instructions.ConstructProp : delete ? AVM2Instructions.DeleteProperty : AVM2Instructions.GetProperty, constants.getMultinameId(Multiname.createRTQName(attr, constants.getStringId(name, true)), true), construct ? callargs.size() : null), call ? getTemp(localData, generator, obj_temp) : null, call ? callargs : null, call ? ins(AVM2Instructions.Call, callargs.size()) : null, diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java index 26a765a39..3a85525b7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java @@ -28,7 +28,6 @@ import com.jpexs.decompiler.flash.abc.avm2.model.InitVectorAVM2Item; import com.jpexs.decompiler.flash.abc.types.MethodBody; import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.Namespace; -import com.jpexs.decompiler.flash.abc.types.NamespaceSet; import com.jpexs.decompiler.flash.abc.types.ScriptInfo; import com.jpexs.decompiler.flash.abc.types.ValueKind; import com.jpexs.decompiler.flash.abc.types.traits.Trait; @@ -41,6 +40,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; +import com.jpexs.helpers.Helper; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -56,7 +56,7 @@ public class PropertyAVM2Item extends AssignableAVM2Item { public GraphTargetItem object; - public AbcIndexing abc; + public AbcIndexing abcIndex; private final List openedNamespaces; @@ -66,14 +66,14 @@ public class PropertyAVM2Item extends AssignableAVM2Item { @Override public AssignableAVM2Item copy() { - PropertyAVM2Item p = new PropertyAVM2Item(object, propertyName, abc, openedNamespaces, callStack); + PropertyAVM2Item p = new PropertyAVM2Item(object, propertyName, abcIndex, openedNamespaces, callStack); return p; } - public PropertyAVM2Item(GraphTargetItem object, String propertyName, AbcIndexing abc, List openedNamespaces, List callStack) { + public PropertyAVM2Item(GraphTargetItem object, String propertyName, AbcIndexing abcIndex, List openedNamespaces, List callStack) { this.propertyName = propertyName; this.object = object; - this.abc = abc; + this.abcIndex = abcIndex; this.openedNamespaces = openedNamespaces; this.callStack = callStack; } @@ -83,12 +83,9 @@ public class PropertyAVM2Item extends AssignableAVM2Item { return writer; } - private int allNsSet() { - int[] nssa = new int[openedNamespaces.size()]; - for (int i = 0; i < openedNamespaces.size(); i++) { - nssa[i] = openedNamespaces.get(i); - } - return abc.getSelectedAbc().constants.getNamespaceSetId(new NamespaceSet(nssa), true); + private int allNsSet(ABC abc) { + int[] nssa = Helper.toIntArray(openedNamespaces); + return abc.constants.getNamespaceSetId(nssa, true); } public static GraphTargetItem multinameToType(int m_index, AVM2ConstantPool constants) { @@ -132,6 +129,8 @@ public class PropertyAVM2Item extends AssignableAVM2Item { } GraphTargetItem propType = null; int propIndex = 0; + ABC abc = abcIndex.getSelectedAbc(); + AVM2ConstantPool constants = abc.constants; if (!propertyName.startsWith("@")) { if (scopeStack.isEmpty()) { //Everything is multiname when with command @@ -217,12 +216,12 @@ public class PropertyAVM2Item extends AssignableAVM2Item { Reference outPropType = new Reference<>(null); Reference outPropValue = new Reference<>(null); Reference outPropValueAbc = new Reference<>(null); - if (AVM2SourceGenerator.searchPrototypeChain(localData.privateNs, localData.protectedNs, false, abc, ftn.getWithoutLast(), ftn.getLast(), propertyName, outName, outNs, outPropNs, outPropNsKind, outPropNsIndex, outPropType, outPropValue, outPropValueAbc)) { + if (AVM2SourceGenerator.searchPrototypeChain(localData.privateNs, localData.protectedNs, false, abcIndex, ftn.getWithoutLast(), ftn.getLast(), propertyName, outName, outNs, outPropNs, outPropNsKind, outPropNsIndex, outPropType, outPropValue, outPropValueAbc)) { objType = new TypeItem(outNs.getVal().add(outName.getVal())); propType = outPropType.getVal(); - propIndex = abc.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.QNAME, - abc.getSelectedAbc().constants.getStringId(propertyName, true), - abc.getSelectedAbc().constants.getNamespaceId(outPropNsKind.getVal(), outPropNs.getVal(), outPropNsIndex.getVal(), true), 0), true + propIndex = constants.getMultinameId(Multiname.createQName(false, + constants.getStringId(propertyName, true), + constants.getNamespaceId(outPropNsKind.getVal(), outPropNs.getVal(), outPropNsIndex.getVal(), true)), true ); propValue = outPropValue.getVal(); propValueAbc = outPropValueAbc.getVal(); @@ -233,11 +232,11 @@ public class PropertyAVM2Item extends AssignableAVM2Item { for (MethodBody b : callStack) { for (int i = 0; i < b.traits.traits.size(); i++) { Trait t = b.traits.traits.get(i); - if (t.getName(abc.getSelectedAbc()).getName(abc.getSelectedAbc().constants, null, true).equals(propertyName)) { + if (t.getName(abc).getName(constants, null, true).equals(propertyName)) { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; objType = new TypeItem(DottedChain.FUNCTION); - propType = multinameToType(tsc.type_index, abc.getSelectedAbc().constants); + propType = multinameToType(tsc.type_index, constants); propIndex = tsc.name_index; if (!localData.traitUsages.containsKey(b)) { localData.traitUsages.put(b, new ArrayList<>()); @@ -252,62 +251,62 @@ public class PropertyAVM2Item extends AssignableAVM2Item { for (int i = 0; i < openedNamespaces.size(); i++) { int nsindex = openedNamespaces.get(i); - int nsKind = abc.getSelectedAbc().constants.getNamespace(openedNamespaces.get(i)).kind; - DottedChain nsname = abc.getSelectedAbc().constants.getNamespace(openedNamespaces.get(i)).getName(abc.getSelectedAbc().constants); + int nsKind = constants.getNamespace(openedNamespaces.get(i)).kind; + DottedChain nsname = constants.getNamespace(openedNamespaces.get(i)).getName(constants); int name_index = 0; - for (int m = 1; m < abc.getSelectedAbc().constants.getMultinameCount(); m++) { - Multiname mname = abc.getSelectedAbc().constants.getMultiname(m); - if (mname.kind == Multiname.QNAME && mname.getName(abc.getSelectedAbc().constants, null, true).equals(propertyName) && mname.namespace_index == nsindex) { + for (int m = 1; m < constants.getMultinameCount(); m++) { + Multiname mname = constants.getMultiname(m); + if (mname.kind == Multiname.QNAME && mname.getName(constants, null, true).equals(propertyName) && mname.namespace_index == nsindex) { name_index = m; break; } } if (name_index > 0) { - for (int c = 0; c < abc.getSelectedAbc().instance_info.size(); c++) { - if (abc.getSelectedAbc().instance_info.get(c).deleted) { + for (int c = 0; c < abc.instance_info.size(); c++) { + if (abc.instance_info.get(c).deleted) { continue; } - for (Trait t : abc.getSelectedAbc().instance_info.get(c).instance_traits.traits) { + for (Trait t : abc.instance_info.get(c).instance_traits.traits) { if (t.name_index == name_index) { - objType = multinameToType(abc.getSelectedAbc().instance_info.get(c).name_index, abc.getSelectedAbc().constants); - propType = AVM2SourceGenerator.getTraitReturnType(abc, t); + objType = multinameToType(abc.instance_info.get(c).name_index, constants); + propType = AVM2SourceGenerator.getTraitReturnType(abcIndex, t); propIndex = t.name_index; if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; propValue = new ValueKind(tsc.value_index, tsc.value_kind); - propValueAbc = abc.getSelectedAbc(); + propValueAbc = abc; } break loopobjType; } } - for (Trait t : abc.getSelectedAbc().class_info.get(c).static_traits.traits) { + for (Trait t : abc.class_info.get(c).static_traits.traits) { if (t.name_index == name_index) { - objType = multinameToType(abc.getSelectedAbc().instance_info.get(c).name_index, abc.getSelectedAbc().constants); - propType = AVM2SourceGenerator.getTraitReturnType(abc, t); + objType = multinameToType(abc.instance_info.get(c).name_index, constants); + propType = AVM2SourceGenerator.getTraitReturnType(abcIndex, t); propIndex = t.name_index; if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; propValue = new ValueKind(tsc.value_index, tsc.value_kind); - propValueAbc = abc.getSelectedAbc(); + propValueAbc = abc; } break loopobjType; } } } - for (ScriptInfo si : abc.getSelectedAbc().script_info) { + for (ScriptInfo si : abc.script_info) { if (si.deleted) { continue; } for (Trait t : si.traits.traits) { if (t.name_index == name_index) { objType = new TypeItem(DottedChain.OBJECT); - propType = AVM2SourceGenerator.getTraitReturnType(abc, t); + propType = AVM2SourceGenerator.getTraitReturnType(abcIndex, t); propIndex = t.name_index; if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; propValue = new ValueKind(tsc.value_index, tsc.value_kind); - propValueAbc = abc.getSelectedAbc(); + propValueAbc = abc; } break loopobjType; } @@ -315,7 +314,7 @@ public class PropertyAVM2Item extends AssignableAVM2Item { } } if (nsKind == Namespace.KIND_PACKAGE && propertyName != null) { - AbcIndexing.TraitIndex p = abc.findNsProperty(new AbcIndexing.PropertyNsDef(propertyName, nsname, abc.getSelectedAbc(), openedNamespaces.get(i)), true, true); + AbcIndexing.TraitIndex p = abcIndex.findNsProperty(new AbcIndexing.PropertyNsDef(propertyName, nsname, abc, openedNamespaces.get(i)), true, true); Reference outName = new Reference<>(""); Reference outNs = new Reference<>(DottedChain.EMPTY); @@ -326,12 +325,12 @@ public class PropertyAVM2Item extends AssignableAVM2Item { Reference outPropValue = new Reference<>(null); Reference outPropValueAbc = new Reference<>(null); if (p != null && (p.objType instanceof TypeItem)) { - if (AVM2SourceGenerator.searchPrototypeChain(localData.privateNs, localData.protectedNs, false, abc, nsname, (((TypeItem) p.objType).fullTypeName.getLast()), propertyName, outName, outNs, outPropNs, outPropNsKind, outPropNsIndex, outPropType, outPropValue, outPropValueAbc)) { + if (AVM2SourceGenerator.searchPrototypeChain(localData.privateNs, localData.protectedNs, false, abcIndex, nsname, (((TypeItem) p.objType).fullTypeName.getLast()), propertyName, outName, outNs, outPropNs, outPropNsKind, outPropNsIndex, outPropType, outPropValue, outPropValueAbc)) { objType = new TypeItem(outNs.getVal().add(outName.getVal())); propType = p.returnType; - propIndex = abc.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.QNAME, - abc.getSelectedAbc().constants.getStringId(propertyName, true), - abc.getSelectedAbc().constants.getNamespaceId(outPropNsKind.getVal(), outPropNs.getVal(), outPropNsIndex.getVal(), true), 0), true + propIndex = constants.getMultinameId(Multiname.createQName(false, + constants.getStringId(propertyName, true), + constants.getNamespaceId(outPropNsKind.getVal(), outPropNs.getVal(), outPropNsIndex.getVal(), true)), true ); propValue = p.value; propValueAbc = outPropValueAbc.getVal(); @@ -357,9 +356,15 @@ public class PropertyAVM2Item extends AssignableAVM2Item { if (attr) { pname = pname.substring(1); } - propIndex = abc.getSelectedAbc().constants.getMultinameId(new Multiname(attr ? (pname.isEmpty() ? Multiname.MULTINAMELA : Multiname.MULTINAMEA) : Multiname.MULTINAME, - abc.getSelectedAbc().constants.getStringId("*".equals(pname) ? null : pname, true), 0, //Note: name = * is for .@* attribute - attr && pname.isEmpty() ? abc.getSelectedAbc().constants.getNamespaceSetId(new NamespaceSet(new int[]{abc.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PACKAGE_INTERNAL, localData.pkg, 0, true)}), true) : allNsSet()), true); + Multiname multiname; + if (attr && pname.isEmpty()) { + multiname = Multiname.createMultinameL(true, + constants.getNamespaceSetId(new int[]{constants.getNamespaceId(Namespace.KIND_PACKAGE_INTERNAL, localData.pkg, 0, true)}, true)); + } else { + int name_index = constants.getStringId("*".equals(pname) ? null : pname, true); //Note: name = * is for .@* attribute + multiname = Multiname.createMultiname(attr, name_index, allNsSet(abc)); + } + propIndex = constants.getMultinameId(multiname, true); propType = TypeItem.UNBOUNDED; objType = TypeItem.UNBOUNDED; propValue = null; @@ -630,7 +635,7 @@ public class PropertyAVM2Item extends AssignableAVM2Item { /*List abcs = new ArrayList<>(); abcs.add(abc); abcs.addAll(otherABCs);*/ - if (!localData.subMethod && cname != null && AVM2SourceGenerator.searchPrototypeChain(localData.privateNs, localData.protectedNs, true, abc, pkgName, cname, propertyName, outName, outNs, outPropNs, outPropNsKind, outPropNsIndex, outPropType, outPropValue, outPropValueAbc) && (localData.currentClass.equals(outNs.getVal().add(outName.getVal())))) { + if (!localData.subMethod && cname != null && AVM2SourceGenerator.searchPrototypeChain(localData.privateNs, localData.protectedNs, true, abcIndex, pkgName, cname, propertyName, outName, outNs, outPropNs, outPropNsKind, outPropNsIndex, outPropType, outPropValue, outPropValueAbc) && (localData.currentClass.equals(outNs.getVal().add(outName.getVal())))) { NameAVM2Item nobj = new NameAVM2Item(new TypeItem(localData.getFullClass()), 0, "this", null, false, openedNamespaces); nobj.setRegNumber(0); obj = nobj; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java index 7df4e8120..8aaa6e4cb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java @@ -17,7 +17,6 @@ package com.jpexs.decompiler.flash.abc.avm2.parser.script; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; -import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions; import com.jpexs.decompiler.flash.abc.avm2.model.InitVectorAVM2Item; @@ -26,9 +25,7 @@ import com.jpexs.decompiler.flash.abc.avm2.model.NanAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NullAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.UndefinedAVM2Item; import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.Namespace; -import com.jpexs.decompiler.flash.abc.types.NamespaceSet; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.DottedChain; @@ -184,14 +181,6 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { return writer; } - private int allNsSet(ABC abc) { - int[] nssa = new int[openedNamespaces.size()]; - for (int i = 0; i < openedNamespaces.size(); i++) { - nssa[i] = openedNamespaces.get(i); - } - return abc.constants.getNamespaceSetId(new NamespaceSet(nssa), true); - } - public static GraphTargetItem getDefaultValue(String type) { switch (type) { case "*": diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/XMLAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/XMLAVM2Item.java index 6b3f6967b..db2cbe8c0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/XMLAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/XMLAVM2Item.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.abc.avm2.parser.script; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions; import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.flash.abc.types.Multiname; @@ -59,8 +60,9 @@ public class XMLAVM2Item extends AVM2Item { @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { AVM2SourceGenerator g = (AVM2SourceGenerator) generator; + AVM2ConstantPool constants = g.abcIndex.getSelectedAbc().constants; return toSourceMerge(localData, generator, - ins(AVM2Instructions.GetLex, g.abcIndex.getSelectedAbc().constants.getMultinameId(new Multiname(Multiname.QNAME, g.abcIndex.getSelectedAbc().constants.getStringId("XML", true), g.abcIndex.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PACKAGE, "", 0, true), 0), true)), + ins(AVM2Instructions.GetLex, constants.getMultinameId(Multiname.createQName(false, constants.getStringId("XML", true), constants.getNamespaceId(Namespace.KIND_PACKAGE, "", 0, true)), true)), value, ins(AVM2Instructions.Construct, 1) ); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java index 8b7757ca2..188828ece 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java @@ -86,11 +86,7 @@ public class Multiname { params = null; } - public Multiname(int kind, int name_index, int namespace_index, int namespace_set_index) { - this(kind, name_index, namespace_index, namespace_set_index, 0, null); - } - - public Multiname(int kind, int name_index, int namespace_index, int namespace_set_index, int qname_index, int[] params) { + private Multiname(int kind, int name_index, int namespace_index, int namespace_set_index, int qname_index, int[] params) { this.kind = kind; this.name_index = name_index; this.namespace_index = namespace_index; @@ -102,6 +98,30 @@ public class Multiname { } } + public static Multiname createQName(boolean attribute, int name_index, int namespace_index) { + return new Multiname(attribute ? QNAMEA : QNAME, name_index, namespace_index, 0, 0, null); + } + + public static Multiname createRTQName(boolean attribute, int name_index) { + return new Multiname(attribute ? RTQNAMEA : RTQNAME, name_index, 0, 0, 0, null); + } + + public static Multiname createRTQNameL(boolean attribute) { + return new Multiname(attribute ? RTQNAMELA : RTQNAMEL, 0, 0, 0, 0, null); + } + + public static Multiname createMultiname(boolean attribute, int name_index, int namespace_set_index) { + return new Multiname(attribute ? MULTINAMEA : MULTINAME, name_index, 0, namespace_set_index, 0, null); + } + + public static Multiname createMultinameL(boolean attribute, int namespace_set_index) { + return new Multiname(attribute ? MULTINAMELA : MULTINAMEL, 0, 0, namespace_set_index, 0, null); + } + + public static Multiname createTypeName(int qname_index, int[] params) { + return new Multiname(TYPENAME, 0, 0, 0, qname_index, params); + } + public boolean isAttribute() { if (kind == QNAMEA) { return true; diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3AssemblerTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3AssemblerTest.java index a695cf6ba..e182195c0 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3AssemblerTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3AssemblerTest.java @@ -208,7 +208,7 @@ public class ActionScript3AssemblerTest extends ActionScriptTestBase { @Test public void testInstructionStackSizes() throws Exception { ABC abc = new ABC(null); - Multiname multiname = new Multiname(Multiname.RTQNAMEL, 0, 0, 0); + Multiname multiname = Multiname.createRTQNameL(false); abc.constants.addMultiname(multiname); AVM2Instruction ins = new AVM2Instruction(0, null, new int[]{1, 20}); for (InstructionDefinition def : AVM2Code.instructionSet) { diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 3ff0a1dc0..e7728f025 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -786,7 +786,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener