From 4849356f2cebced98627955de046ae63a0bd741f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 22 Sep 2024 22:09:39 +0200 Subject: [PATCH] Fixed: AS3 - displaying imports of class parent chain Fixed: AS3 - imports for script traits --- CHANGELOG.md | 2 ++ .../decompiler/flash/abc/ScriptPack.java | 11 ++++++++- .../flash/abc/types/traits/Trait.java | 6 ++--- .../flash/abc/types/traits/TraitClass.java | 4 +++- .../flash/abc/types/traits/TraitFunction.java | 8 +++++-- .../types/traits/TraitMethodGetterSetter.java | 4 +++- .../exporters/script/DependencyParser.java | 24 +++++++++++++++++++ 7 files changed, 51 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33d1e267b..058859c17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ All notable changes to this project will be documented in this file. - [#2291] AS1/2 Incorrect var keyword placement causing registers to compile wrong - [#2290] FLA export - not generating sound bin files causing sound compression setting to be ignored - [#2296] AS decompilation - goto problems +- AS3 - displaying imports of class parent chain +- AS3 - imports for script traits ## [21.0.5] - 2024-09-05 ### Fixed diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java index deb451d55..5ab742f3d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java @@ -353,7 +353,16 @@ public class ScriptPack extends AS3ClassTreeItem { if (isSimple) { ignorePackage = getPathPackage(); } - Trait.writeImports(null, script_init, abcIndex, scriptIndex, -1, true, abc, writer, ignorePackage, fullyQualifiedNames); + List importTraits = new ArrayList<>(); + for (int t : traitIndices) { + Trait trait = traits.get(t); + + if (!(trait instanceof TraitSlotConst)) { + continue; + } + importTraits.add(trait); + } + Trait.writeImports(importTraits, script_init, abcIndex, scriptIndex, -1, true, abc, writer, ignorePackage, fullyQualifiedNames); first = true; //Slot const last 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 e6a4a7009..bd3e5d82e 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 @@ -368,7 +368,7 @@ public abstract class Trait implements Cloneable, Serializable { * @return True if its not empty * @throws InterruptedException On interrupt */ - public static boolean writeImports(Trait trait, int methodIndex, AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, ABC abc, GraphTextWriter writer, DottedChain ignorePackage, List fullyQualifiedNames) throws InterruptedException { + public static boolean writeImports(List traits, int methodIndex, AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, ABC abc, GraphTextWriter writer, DottedChain ignorePackage, List fullyQualifiedNames) throws InterruptedException { List namesInThisPackage = new ArrayList<>(); for (ABCContainerTag tag : abc.getAbcTags()) { @@ -398,7 +398,7 @@ public abstract class Trait implements Cloneable, Serializable { Reference numberContextRef = new Reference<>(null); - if (trait != null) { + for (Trait trait : traits) { Multiname multiname = trait.getName(abc); int nskind = multiname.getSimpleNamespaceKind(abc.constants); if (nskind == Namespace.KIND_NAMESPACE) { @@ -407,7 +407,7 @@ public abstract class Trait implements Cloneable, Serializable { trait.getDependencies(abcIndex, scriptIndex, classIndex, isStatic, customNs, abc, dependencies, ignorePackage, new ArrayList<>(), uses, numberContextRef); } if (methodIndex != -1) { - DependencyParser.parseDependenciesFromMethodInfo(abcIndex, trait, scriptIndex, classIndex, isStatic, customNs, abc, methodIndex, dependencies, ignorePackage, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef); + DependencyParser.parseDependenciesFromMethodInfo(abcIndex, null, scriptIndex, classIndex, isStatic, customNs, abc, methodIndex, dependencies, ignorePackage, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef); } List imports = new ArrayList<>(); for (Dependency d : dependencies) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java index 3c0a5f4d4..03a829421 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java @@ -234,7 +234,9 @@ public class TraitClass extends Trait implements TraitWithSlot { Reference first = new Reference<>(true); if (getName(abc).getNamespace(abc.constants).kind != Namespace.KIND_PACKAGE_INTERNAL) { - first.setVal(!writeImports(this, -1, abcIndex, scriptIndex, classIndex, false, abc, writer, packageName, fullyQualifiedNames)); + List traits = new ArrayList<>(); + traits.add(this); + first.setVal(!writeImports(traits, -1, abcIndex, scriptIndex, classIndex, false, abc, writer, packageName, fullyQualifiedNames)); } String instanceInfoName = instanceInfoMultiname.getName(abc.constants, fullyQualifiedNames, false, true); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java index 615f267dc..e743d4558 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java @@ -161,7 +161,9 @@ public class TraitFunction extends Trait implements TraitWithSlot { */ @Override public GraphTextWriter toString(AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { - writeImports(this, -1, abcIndex, scriptIndex, classIndex, false, abc, writer, getPackage(abc), fullyQualifiedNames); + List traits = new ArrayList<>(); + traits.add(this); + writeImports(traits, -1, abcIndex, scriptIndex, classIndex, false, abc, writer, getPackage(abc), fullyQualifiedNames); getMetaData(this, convertData, abc, writer); writer.startMethod(method_info, getName(abc).getName(abc.constants, new ArrayList<>(), true, false)); toStringHeader(parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); @@ -202,7 +204,9 @@ public class TraitFunction extends Trait implements TraitWithSlot { @Override public void convert(AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { fullyQualifiedNames = new ArrayList<>(); - writeImports(this, -1, abcIndex, scriptIndex, classIndex, false, abc, writer, getPackage(abc), fullyQualifiedNames); + List traits = new ArrayList<>(); + traits.add(this); + writeImports(traits, -1, abcIndex, scriptIndex, classIndex, false, abc, writer, getPackage(abc), fullyQualifiedNames); writer.startMethod(method_info, getName(abc).getName(abc.constants, new ArrayList<>(), true, false)); convertHeader(parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel); int bodyIndex = abc.findBodyIndex(method_info); 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 ef20b2c88..d4e2fe1d9 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 @@ -185,7 +185,9 @@ public class TraitMethodGetterSetter extends Trait { @Override public void convert(AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { if (classIndex < 0) { - writeImports(this, -1, abcIndex, scriptIndex, classIndex, isStatic, abc, writer, getPackage(abc), fullyQualifiedNames); + List traits = new ArrayList<>(); + traits.add(this); + writeImports(traits, -1, abcIndex, scriptIndex, classIndex, isStatic, abc, writer, getPackage(abc), fullyQualifiedNames); } writer.startMethod(method_info, getName(abc).getName(abc.constants, new ArrayList<>(), true, false)); path = path + "." + getName(abc).getName(abc.constants, fullyQualifiedNames, false, true); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/DependencyParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/DependencyParser.java index 9d6b0682a..1adbd8878 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/DependencyParser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/DependencyParser.java @@ -184,9 +184,33 @@ public class DependencyParser { for (ABCException ex : body.exceptions) { parseDependenciesFromMultiname(abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(ex.type_index), ignorePackage, fullyQualifiedNames, DependencyType.EXPRESSION /* or signature?*/, uses); } + + boolean hasNewClass = false; + + if (classIndex == -1) { + for (int i = 0; i < body.getCode().code.size(); i++) { + AVM2Instruction ins = body.getCode().code.get(i); + if (ins.definition instanceof NewClassIns) { + hasNewClass = true; + break; + } + } + } + boolean wasNewClass = false; for (int i = 0; i < body.getCode().code.size(); i++) { AVM2Instruction ins = body.getCode().code.get(i); + + //Do not parse dependencies from class parent chain + if (classIndex == -1 && hasNewClass && !wasNewClass) { + + if (ins.definition instanceof NewClassIns) { + wasNewClass = true; + } + + continue; + } + //Ignore class parents in script initializer if (ins.definition instanceof GetLexIns) { boolean foundNewClass = false;