From e810421914a6c4ea3ec3d727ee15a3b01b71ba9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 28 Sep 2023 12:10:39 +0200 Subject: [PATCH] Correct trait packing. Compound removing fix. --- .../com/jpexs/decompiler/flash/abc/ABC.java | 21 +++++++++++++++ .../flash/abc/types/traits/Trait.java | 6 ++++- .../flash/abc/types/traits/TraitClass.java | 1 + .../flash/abc/types/traits/TraitFunction.java | 2 ++ .../types/traits/TraitMethodGetterSetter.java | 2 ++ .../abc/types/traits/TraitSlotConst.java | 2 ++ .../flash/gui/tagtree/TagTreeContextMenu.java | 27 +++++++++++++++++-- 7 files changed, 58 insertions(+), 3 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 517482380..0f525f1e6 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 @@ -1898,7 +1898,28 @@ public class ABC implements Openable { } } + private void packTraits(Traits traits) { + for (int i = traits.traits.size() - 1; i >= 0; i--) { + Trait t = traits.traits.get(i); + if (t instanceof TraitClass) { + TraitClass tc = (TraitClass)t; + packTraits(instance_info.get(tc.class_info).instance_traits); + packTraits(class_info.get(tc.class_info).static_traits); + } + if (t.deleted) { + traits.traits.remove(i); + } + } + } + public void pack() { + for (ScriptInfo script:script_info) { + packTraits(script.traits); + } + for (MethodBody body: bodies) { + packTraits(body.traits); + } + packMethods(); for (int c = 0; c < instance_info.size(); c++) { if (instance_info.get(c).deleted) { 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 cefff52f2..881fcaab2 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 @@ -98,8 +98,12 @@ public abstract class Trait implements Cloneable, Serializable { public static final int TRAIT_FUNCTION = 5; public static final int TRAIT_CONST = 6; + + public boolean deleted = false; - public abstract void delete(ABC abc, boolean d); + public void delete(ABC abc, boolean d) { + deleted = d; + } public final List>> getMetaDataTable(Trait parent, ConvertData convertData, ABC abc) { List>> ret = new ArrayList<>(); 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 1a7d0f3bd..175f6cfef 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 @@ -69,6 +69,7 @@ public class TraitClass extends Trait implements TraitWithSlot { @Override public void delete(ABC abc, boolean d) { + super.delete(abc, d); abc.deleteClass(class_info, d); abc.constants.getMultiname(name_index).deleted = d; } 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 9b694b19b..6c7da4add 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 @@ -46,6 +46,8 @@ public class TraitFunction extends Trait implements TraitWithSlot { @Override public void delete(ABC abc, boolean d) { + super.delete(abc, d); + abc.constants.getMultiname(name_index).deleted = d; abc.method_info.get(method_info).delete(abc, d); } 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 62cb7bf8e..abda4b139 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 @@ -50,6 +50,8 @@ public class TraitMethodGetterSetter extends Trait { @Override public void delete(ABC abc, boolean d) { + super.delete(abc, d); + abc.constants.getMultiname(name_index).deleted = d; abc.method_info.get(method_info).delete(abc, d); } 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 af3d39edb..93982eefc 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 @@ -61,6 +61,8 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { @Override public void delete(ABC abc, boolean d) { + super.delete(abc, d); + abc.constants.getMultiname(name_index).deleted = d; } diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index efa0fcd2e..715562cf3 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -707,8 +707,8 @@ public class TagTreeContextMenu extends JPopupMenu { } } if (item instanceof AS3Package) { - AS3Package p = (AS3Package) item; - if (!p.isPartOfCompoundScript()) { + AS3Package pkg = (AS3Package) item; + if (pkg.isCompoundScript() || !pkg.isPartOfCompoundScript()) { continue; } } @@ -2651,6 +2651,10 @@ public class TagTreeContextMenu extends JPopupMenu { for (int i = 0; i < itemsToRemove.size(); i++) { Object item = itemsToRemove.get(i); if (item instanceof AS3Package) { + AS3Package pkg = (AS3Package) item; + if (pkg.isCompoundScript()) { + continue; + } List subScriptPacks = new ArrayList<>(); getAllAS3PackageScriptPacks((AS3Package) item, subScriptPacks); for (ScriptPack pack : subScriptPacks) { @@ -2733,6 +2737,25 @@ public class TagTreeContextMenu extends JPopupMenu { } } } + + if (item instanceof AS3Package) { + AS3Package pkg = (AS3Package)item; + if (pkg.isCompoundScript()) { + ScriptPack sp = pkg.getCompoundInitializerPack(); + sp.abc.script_info.get(sp.scriptIndex).delete(sp.abc, true); + abcsToPack.add(sp.abc); + Openable openable = sp.getOpenable(); + SWF swf = (openable instanceof SWF) ? (SWF) openable : ((ABC) openable).getSwf(); + swfsToClearCache.add(swf); + for (ABCContainerTag ct : swf.getAbcList()) { + if (ct.getABC() == sp.abc) { + ((Tag) ct).setModified(true); + break; + } + } + } + } + if (item instanceof TreeItem) { mainPanel.unpinItem((TreeItem) item); }