From c985e3e402dda35f4d83caaf7d8f2283c0a3746e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Tue, 2 Feb 2021 19:27:29 +0100 Subject: [PATCH] Better namespace handling --- .../com/jpexs/decompiler/flash/abc/ABC.java | 27 ++++++++++++- .../decompiler/flash/abc/avm2/CodeStats.java | 5 ++- .../construction/ConstructIns.java | 11 ++--- .../construction/ConstructPropIns.java | 7 ++-- .../construction/NewClassIns.java | 5 ++- .../avm2/instructions/other/SetSuperIns.java | 5 ++- .../abc/avm2/model/FullMultinameAVM2Item.java | 20 ++++----- .../flash/abc/avm2/model/GetLexAVM2Item.java | 7 ++-- .../abc/avm2/model/NameSpaceAVM2Item.java | 28 +++++++++++-- .../flash/abc/types/MethodBody.java | 4 +- .../decompiler/flash/abc/types/Multiname.java | 38 +++++++++++++++++- .../decompiler/flash/abc/types/Namespace.java | 11 ++++- .../flash/abc/types/traits/Trait.java | 29 ++----------- .../types/traits/TraitMethodGetterSetter.java | 3 +- .../abc/types/traits/TraitSlotConst.java | 7 ++-- .../decompiler/graph/model/LocalData.java | 11 +++-- .../testdata/flashdevelop/bin/Main.flex.swf | Bin 20751 -> 20740 bytes .../flashdevelop/obj/flashdevelopConfig.old | 2 +- .../flashdevelop/obj/flashdevelopConfig.xml | 2 +- 19 files changed, 152 insertions(+), 70 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java index 9c80a9756..7ec310c24 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc; import com.jpexs.decompiler.flash.EndOfStreamException; @@ -2070,4 +2071,28 @@ public class ABC { } return newTrait; } + + public DottedChain findCustomNs(int link_ns_index) { + String nsname; + if (link_ns_index <= 0) { + return null; + } + Namespace ns = constants.getNamespace(link_ns_index); + if (ns.kind != Namespace.KIND_NAMESPACE) { + return null; + } + String name = constants.getString(ns.name_index); + for (ABCContainerTag abcTag : getAbcTags()) { + DottedChain dc = abcTag.getABC().nsValueToName(name); + nsname = dc.getLast(); + + if (nsname == null) { + continue; + } + if (!nsname.isEmpty()) { + return dc; + } + } + return null; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/CodeStats.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/CodeStats.java index c9d6056a4..32574cab0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/CodeStats.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/CodeStats.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2; import com.jpexs.decompiler.flash.abc.ABC; @@ -50,7 +51,7 @@ public class CodeStats { if (stats.stackpos > ms) { ms = stats.stackpos; } - writer.appendNoHilight(i + ":" + stats.stackpos + (deltastack >= 0 ? "+" + deltastack : deltastack) + "," + stats.scopepos + " " + stats.ins.toString(writer, LocalData.create(abc.constants, null, fullyQualifiedNames))).newLine(); + writer.appendNoHilight(i + ":" + stats.stackpos + (deltastack >= 0 ? "+" + deltastack : deltastack) + "," + stats.scopepos + " " + stats.ins.toString(writer, LocalData.create(abc, null, fullyQualifiedNames))).newLine(); i++; } return writer; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructIns.java index 44b7ae23f..96f490432 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructIns.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.instructions.construction; import com.jpexs.decompiler.flash.abc.ABC; @@ -106,8 +107,8 @@ public class ConstructIns extends InstructionDefinition { FullMultinameAVM2Item fptXmlMult = (FullMultinameAVM2Item) fpt.propertyName; FullMultinameAVM2Item gptXmlMult = (FullMultinameAVM2Item) gpt.propertyName; - isXML = fptXmlMult.isXML(localData.getConstants(), localData.localRegNames, localData.fullyQualifiedNames) - && gptXmlMult.isXML(localData.getConstants(), localData.localRegNames, localData.fullyQualifiedNames); + isXML = fptXmlMult.isXML(localData.abc, localData.localRegNames, localData.fullyQualifiedNames) + && gptXmlMult.isXML(localData.abc, localData.localRegNames, localData.fullyQualifiedNames); } } if (obj instanceof GetLexAVM2Item) { @@ -134,8 +135,8 @@ public class ConstructIns extends InstructionDefinition { FullMultinameAVM2Item fptRegExpMult = (FullMultinameAVM2Item) fpt.propertyName; FullMultinameAVM2Item gptRegExpMult = (FullMultinameAVM2Item) gpt.propertyName; - isRegExp = fptRegExpMult.isTopLevel("RegExp", localData.getConstants(), localData.localRegNames, localData.fullyQualifiedNames) - && gptRegExpMult.isTopLevel("RegExp", localData.getConstants(), localData.localRegNames, localData.fullyQualifiedNames); + isRegExp = fptRegExpMult.isTopLevel("RegExp", localData.abc, localData.localRegNames, localData.fullyQualifiedNames) + && gptRegExpMult.isTopLevel("RegExp", localData.abc, localData.localRegNames, localData.fullyQualifiedNames); } } if (obj instanceof GetLexAVM2Item) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructPropIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructPropIns.java index e356a98d4..3857be2f0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructPropIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructPropIns.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.instructions.construction; import com.jpexs.decompiler.flash.abc.ABC; @@ -73,7 +74,7 @@ public class ConstructPropIns extends InstructionDefinition { multiname.property = false; //can be type } - if (multiname.isXML(localData.getConstants(), localData.localRegNames, localData.fullyQualifiedNames)) { + if (multiname.isXML(localData.abc, localData.localRegNames, localData.fullyQualifiedNames)) { if (args.size() == 1) { GraphTargetItem arg = args.get(0); List xmlLines = new ArrayList<>(); @@ -84,7 +85,7 @@ public class ConstructPropIns extends InstructionDefinition { } }// boolean isRegExp = false; - if (multiname.isTopLevel("RegExp", localData.getConstants(), localData.localRegNames, localData.fullyQualifiedNames)) { + if (multiname.isTopLevel("RegExp", localData.abc, localData.localRegNames, localData.fullyQualifiedNames)) { isRegExp = true; } if (isRegExp && (args.size() >= 1) && (args.get(0) instanceof StringAVM2Item) && (args.size() == 1 || (args.size() == 2 && args.get(1) instanceof StringAVM2Item))) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewClassIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewClassIns.java index 6da34638d..e8c42da54 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewClassIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewClassIns.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.instructions.construction; import com.jpexs.decompiler.flash.abc.ABC; @@ -42,7 +43,7 @@ public class NewClassIns extends InstructionDefinition { public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) throws InterruptedException { int clsIndex = ins.operands[0]; HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false); - stack.pop().toString(writer, LocalData.create(localData.getConstants(), localData.localRegNames, localData.fullyQualifiedNames)); + stack.pop().toString(writer, LocalData.create(localData.abc, localData.localRegNames, localData.fullyQualifiedNames)); String baseType = writer.toString(); ABC abc = localData.abc; stack.push(new UnparsedAVM2Item(ins, localData.lineStartInstruction, "new " + abc.constants.getMultiname(abc.instance_info.get(clsIndex).name_index).getName(localData.getConstants(), localData.fullyQualifiedNames, false, true) + ".class extends " + baseType)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSuperIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSuperIns.java index 6a1edd4c4..fe523cbb9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSuperIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSuperIns.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.instructions.other; import com.jpexs.decompiler.flash.abc.ABC; @@ -68,7 +69,7 @@ public class SetSuperIns extends InstructionDefinition implements SetTypeIns { int multinameIndex = ins.operands[0]; String multiname = resolveMultinameNoPop(1, stack, abc.constants, multinameIndex, ins, fullyQualifiedNames); HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false); - stack.get(1 + resolvedCount(abc.constants, multinameIndex)).toString(writer, LocalData.create(abc.constants, localRegNames, fullyQualifiedNames)); + stack.get(1 + resolvedCount(abc.constants, multinameIndex)).toString(writer, LocalData.create(abc, localRegNames, fullyQualifiedNames)); String obj = writer.toString(); return obj + ".super." + multiname; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java index 111611580..90554d33d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model; +import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.abc.types.Namespace; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; @@ -85,27 +87,27 @@ public class FullMultinameAVM2Item extends AVM2Item { return (name != null) || (namespace != null); } - public boolean isTopLevel(String tname, AVM2ConstantPool constants, HashMap localRegNames, List fullyQualifiedNames) throws InterruptedException { + public boolean isTopLevel(String tname, ABC abc, HashMap localRegNames, List fullyQualifiedNames) throws InterruptedException { String cname; if (name != null) { - cname = name.toString(LocalData.create(constants, localRegNames, fullyQualifiedNames)); + cname = name.toString(LocalData.create(abc, localRegNames, fullyQualifiedNames)); } else { - cname = (constants.getMultiname(multinameIndex).getName(constants, fullyQualifiedNames, true, true)); + cname = (abc.constants.getMultiname(multinameIndex).getName(abc.constants, fullyQualifiedNames, true, true)); } String cns = ""; if (namespace != null) { - cns = namespace.toString(LocalData.create(constants, localRegNames, fullyQualifiedNames)); + cns = namespace.toString(LocalData.create(abc, localRegNames, fullyQualifiedNames)); } else { - Namespace ns = constants.getMultiname(multinameIndex).getNamespace(constants); + Namespace ns = abc.constants.getMultiname(multinameIndex).getNamespace(abc.constants); if ((ns != null) && (ns.name_index != 0)) { - cns = ns.getName(constants).toPrintableString(true); + cns = ns.getName(abc.constants).toPrintableString(true); } } return cname.equals(tname) && cns.isEmpty(); } - public boolean isXML(AVM2ConstantPool constants, HashMap localRegNames, List fullyQualifiedNames) throws InterruptedException { - return isTopLevel("XML", constants, localRegNames, fullyQualifiedNames); + public boolean isXML(ABC abc, HashMap localRegNames, List fullyQualifiedNames) throws InterruptedException { + return isTopLevel("XML", abc, localRegNames, fullyQualifiedNames); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetLexAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetLexAVM2Item.java index 4d4581600..7ec9f48b2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetLexAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetLexAVM2Item.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; @@ -47,9 +48,9 @@ public class GetLexAVM2Item extends AVM2Item implements SimpleValue { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) { - String localName = propertyName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false, true); + String localName = propertyName.getNameWithCustomNamespace(localData.abc, localData.fullyQualifiedNames, false, true); getSrcData().localName = localName; - return writer.append(propertyName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false, true)); + return writer.append(propertyName.getNameWithCustomNamespace(localData.abc, localData.fullyQualifiedNames, false, true)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NameSpaceAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NameSpaceAVM2Item.java index 4c73871dd..5b2aa5ebb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NameSpaceAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NameSpaceAVM2Item.java @@ -12,15 +12,20 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model; +import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.types.Namespace; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; +import com.jpexs.helpers.Helper; /** * @@ -38,15 +43,30 @@ public class NameSpaceAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) { if (namespaceIndex == 0) { - return writer.append("*"); + return writer.append("*"); //? } AVM2ConstantPool constants = localData.constantsAvm2; - return writer.append(constants.getNamespace(namespaceIndex).toString(constants)); //assume not null name + + DottedChain dc = localData.abc.findCustomNs(namespaceIndex); + String nsname = dc != null ? dc.getLast() : null; + + if (nsname != null) { + String identifier = IdentifiersDeobfuscation.printIdentifier(true, nsname); + if (identifier != null && !identifier.isEmpty()) { + writer.append(identifier); + return writer; + } + } + + writer.append("new Namespace").spaceBeforeCallParenthesies(1).append("("); + writer.append("\"").append(Helper.escapeActionScriptString(constants.getNamespace(namespaceIndex).getRawName(constants))).append("\""); //assume not null name + writer.append(")"); + return writer; } @Override public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + return new TypeItem("Namespace"); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java index 32d7c7ded..cdacf1b0e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java @@ -303,7 +303,7 @@ public final class MethodBody implements Cloneable { convertedItems1 = converted.getCode().toGraphTargetItems(convertData.thisHasDefaultToPrimitive, convertData, path, methodIndex, isStatic, scriptIndex, classIndex, abc, converted, localRegNames, scopeStack, initializerType, fullyQualifiedNames, initTraits, Graph.SOP_USE_STATIC, new HashMap<>(), converted.getCode().visitCode(converted)); } try (Statistics s = new Statistics("Graph.graphToString")) { - Graph.graphToString(convertedItems1, writer, LocalData.create(abc.constants, localRegNames, fullyQualifiedNames)); + Graph.graphToString(convertedItems1, writer, LocalData.create(abc, localRegNames, fullyQualifiedNames)); } convertedItems = convertedItems1; } @@ -357,7 +357,7 @@ public final class MethodBody implements Cloneable { writer.appendNoHilight(this.method_info); writer.newLine(); } - Graph.graphToString(convertedItems, writer, LocalData.create(abc.constants, localRegNames, fullyQualifiedNames)); + Graph.graphToString(convertedItems, writer, LocalData.create(abc, localRegNames, fullyQualifiedNames)); //writer.endMethod(); } else if (convertException instanceof TimeoutException) { // exception was logged in convert method 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 2fe650329..20741ebda 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 @@ -12,10 +12,12 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.types; import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; +import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.types.annotations.Internal; import com.jpexs.decompiler.graph.DottedChain; @@ -349,6 +351,40 @@ public class Multiname { return typeNameStr.toString(); } + public String getNameWithCustomNamespace(ABC abc, List fullyQualifiedNames, boolean dontDeobfuscate, boolean withSuffix) { + if (kind == TYPENAME) { + return typeNameToStr(abc.constants, fullyQualifiedNames, dontDeobfuscate, withSuffix); + } + if (name_index == -1) { + return ""; + } + if (name_index == 0) { + return isAttribute() ? "@*" : "*"; + } else { + String name = abc.constants.getString(name_index); + + if (namespace_index > 0 && getNamespace(abc.constants).kind == Namespace.KIND_NAMESPACE) { + DottedChain dc = abc.findCustomNs(namespace_index); + String nsname = dc != null ? dc.getLast() : null; + + if (nsname != null) { + String identifier = dontDeobfuscate ? nsname : IdentifiersDeobfuscation.printIdentifier(true, nsname); + if (identifier != null && !identifier.isEmpty()) { + return nsname + "::" + name; + } + } else { + //??? + } + } + + if (fullyQualifiedNames != null && fullyQualifiedNames.contains(DottedChain.parseWithSuffix(name))) { + DottedChain dc = getNameWithNamespace(abc.constants, withSuffix); + return dontDeobfuscate ? dc.toRawString() : dc.toPrintableString(true); + } + return (isAttribute() ? "@" : "") + (dontDeobfuscate ? name : IdentifiersDeobfuscation.printIdentifier(true, name)) + (withSuffix ? getNamespaceSuffix() : ""); + } + } + public String getName(AVM2ConstantPool constants, List fullyQualifiedNames, boolean dontDeobfuscate, boolean withSuffix) { if (kind == TYPENAME) { return typeNameToStr(constants, fullyQualifiedNames, dontDeobfuscate, withSuffix); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Namespace.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Namespace.java index 178fba723..0bcb52c39 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Namespace.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Namespace.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.types; import com.jpexs.decompiler.flash.abc.ABC; @@ -125,6 +126,14 @@ public class Namespace { return constants.getDottedChain(name_index); } + public String getRawName(AVM2ConstantPool constants) { + if (name_index == 0 || name_index == -1) { + return ""; //?? + } + + return constants.getString(name_index); + } + public boolean hasName(String name, AVM2ConstantPool constants) { if (name == null && name_index == 0) { return true; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java index 513201030..8e8d0a082 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.types.traits; import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; @@ -304,37 +305,13 @@ public abstract class Trait implements Cloneable, Serializable { return writer; } - protected final DottedChain findCustomNs(int link_ns_index, ABC abc) { - String nsname; - if (link_ns_index <= 0) { - return null; - } - Namespace ns = abc.constants.getNamespace(link_ns_index); - if (ns.kind != Namespace.KIND_NAMESPACE) { - return null; - } - String name = abc.constants.getString(ns.name_index); - for (ABCContainerTag abcTag : abc.getAbcTags()) { - DottedChain dc = abcTag.getABC().nsValueToName(name); - nsname = dc.getLast(); - - if (nsname == null) { - continue; - } - if (!nsname.isEmpty()) { - return dc; - } - } - return null; - } - public final GraphTextWriter getModifiers(ABC abc, boolean isStatic, GraphTextWriter writer) { if ((kindFlags & ATTR_Override) > 0) { writer.appendNoHilight("override "); } Multiname m = getName(abc); if (m != null) { - DottedChain dc = findCustomNs(m.namespace_index, abc); + DottedChain dc = abc.findCustomNs(m.namespace_index); String nsname = dc != null ? dc.getLast() : null; Namespace ns = m.getNamespace(abc.constants); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java index 089aa7d86..2c1a709d2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.types.traits; import com.jpexs.decompiler.flash.abc.ABC; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java index dfa6b9e3c..89f001081 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.types.traits; import com.jpexs.decompiler.flash.abc.ABC; @@ -120,7 +121,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { writer.newLine(); } if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { - assignment.value.toString(writer, LocalData.create(abc.constants, new HashMap<>(), fullyQualifiedNames)); + assignment.value.toString(writer, LocalData.create(abc, new HashMap<>(), fullyQualifiedNames)); } writer.endMethod(); writer.endTrait(); @@ -160,7 +161,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { if (convertData.assignedValues.containsKey(this)) { GraphTargetItem val = convertData.assignedValues.get(this).value; if (val instanceof NewFunctionAVM2Item) { - return val.toString(writer, LocalData.create(abc.constants, new HashMap<>(), fullyQualifiedNames)); + return val.toString(writer, LocalData.create(abc, new HashMap<>(), fullyQualifiedNames)); } } getNameStr(writer, abc, fullyQualifiedNames); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LocalData.java index 0bca3c3c7..70f5b3a90 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LocalData.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph.model; +import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.action.model.ConstantPool; import com.jpexs.decompiler.graph.DottedChain; @@ -37,15 +39,18 @@ public class LocalData { public List fullyQualifiedNames; + public ABC abc; + public static LocalData create(ConstantPool constants) { LocalData localData = new LocalData(); localData.constants = constants; return localData; } - public static LocalData create(AVM2ConstantPool constants, HashMap localRegNames, List fullyQualifiedNames) { + public static LocalData create(ABC abc, HashMap localRegNames, List fullyQualifiedNames) { LocalData localData = new LocalData(); - localData.constantsAvm2 = constants; + localData.abc = abc; + localData.constantsAvm2 = abc.constants; localData.localRegNames = localRegNames; localData.fullyQualifiedNames = fullyQualifiedNames; return localData; diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/bin/Main.flex.swf b/libsrc/ffdec_lib/testdata/flashdevelop/bin/Main.flex.swf index 417265a72265d920a3ac777d69730512016d639c..a47d2c87c4f31b6b5a668d63d1922d7d1a565033 100644 GIT binary patch literal 20740 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 HpTq3p!J7k@ literal 20751 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 SVxn(h)iC8%Z2bS;x9Y3TM8VYn diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/obj/flashdevelopConfig.old b/libsrc/ffdec_lib/testdata/flashdevelop/obj/flashdevelopConfig.old index b2210d286..0801f40d8 100644 --- a/libsrc/ffdec_lib/testdata/flashdevelop/obj/flashdevelopConfig.old +++ b/libsrc/ffdec_lib/testdata/flashdevelop/obj/flashdevelopConfig.old @@ -16,7 +16,7 @@ CONFIG::timeStamp - '01.02.2021' + '02.02.2021' CONFIG::air diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/obj/flashdevelopConfig.xml b/libsrc/ffdec_lib/testdata/flashdevelop/obj/flashdevelopConfig.xml index b2210d286..0801f40d8 100644 --- a/libsrc/ffdec_lib/testdata/flashdevelop/obj/flashdevelopConfig.xml +++ b/libsrc/ffdec_lib/testdata/flashdevelop/obj/flashdevelopConfig.xml @@ -16,7 +16,7 @@ CONFIG::timeStamp - '01.02.2021' + '02.02.2021' CONFIG::air