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 af1c588a0..ad9f7bd6e 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 @@ -2450,4 +2450,13 @@ public class ABC implements Openable { } } + public boolean isApiVersioned() { + //assuming all traits are versioned + for (ScriptInfo si: script_info) { + for (Trait trait : si.traits.traits) { + return trait.isApiVersioned(this); + } + } + return false; + } } 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 1bf70651d..94224686c 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 @@ -2254,10 +2254,13 @@ public class AVM2SourceGenerator implements SourceGenerator { } - public int[] generateMetadata(List>> metadata) { + public int[] generateMetadata(List>> metadata, ABC abc) { int[] ret = new int[metadata.size()]; for (int i = 0; i < metadata.size(); i++) { Map.Entry> en = metadata.get(i); + if ("API".equals(en.getKey()) && abc.isApiVersioned()) { + continue; + } int[] keys = new int[en.getValue().size()]; int[] values = new int[en.getValue().size()]; int j = 0; @@ -2433,7 +2436,7 @@ public class AVM2SourceGenerator implements SourceGenerator { tc.slot_id = 0; //? ts.traits.add(tc); traits[k] = tc; - traits[k].metadata = generateMetadata(((InterfaceAVM2Item) item).metadata); + traits[k].metadata = generateMetadata(((InterfaceAVM2Item) item).metadata, abcIndex.getSelectedAbc()); if (traits[k].metadata.length > 0) { traits[k].kindFlags |= Trait.ATTR_Metadata; } @@ -2454,7 +2457,7 @@ public class AVM2SourceGenerator implements SourceGenerator { tc.slot_id = slot_id++; ts.traits.add(tc); traits[k] = tc; - traits[k].metadata = generateMetadata(((ClassAVM2Item) item).metadata); + traits[k].metadata = generateMetadata(((ClassAVM2Item) item).metadata, abcIndex.getSelectedAbc()); if (traits[k].metadata.length > 0) { traits[k].kindFlags |= Trait.ATTR_Metadata; } @@ -2482,7 +2485,7 @@ public class AVM2SourceGenerator implements SourceGenerator { sai.pkg.resolveCustomNs(abcIndex, importedClasses, localData.pkg, openedNamespaces, localData); } namespace = sai.pkg == null ? 0 : sai.pkg.getCpoolIndex(abcIndex); - metadata = generateMetadata(((SlotAVM2Item) item).metadata); + metadata = generateMetadata(((SlotAVM2Item) item).metadata, abcIndex.getSelectedAbc()); } boolean generatedNs = false; if (item instanceof ConstAVM2Item) { @@ -2500,7 +2503,7 @@ public class AVM2SourceGenerator implements SourceGenerator { namespace = cai.pkg == null ? 0 : cai.pkg.getCpoolIndex(abcIndex); isNamespace = type.toString().equals("Namespace"); isStatic = cai.isStatic(); - metadata = generateMetadata(((ConstAVM2Item) item).metadata); + metadata = generateMetadata(((ConstAVM2Item) item).metadata, abcIndex.getSelectedAbc()); } if (isNamespace) { tsc.name_index = traitName(namespace, var); @@ -2540,7 +2543,7 @@ public class AVM2SourceGenerator implements SourceGenerator { ts.traits.add(tmgs); traits[k] = tmgs; - traits[k].metadata = generateMetadata(((MethodAVM2Item) item).metadata); + traits[k].metadata = generateMetadata(((MethodAVM2Item) item).metadata, abcIndex.getSelectedAbc()); if (traits[k].metadata.length > 0) { traits[k].kindFlags |= Trait.ATTR_Metadata; } 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 9f05bf5aa..f1598e055 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 @@ -83,7 +83,6 @@ import com.jpexs.decompiler.flash.abc.avm2.model.operations.SubtractAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.operations.TypeOfAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.operations.URShiftAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException; -import static com.jpexs.decompiler.flash.abc.avm2.parser.script.SymbolType.PREPROCESSOR; import com.jpexs.decompiler.flash.abc.types.Namespace; import com.jpexs.decompiler.flash.abc.types.ScriptInfo; import com.jpexs.decompiler.flash.action.swf4.ActionIf; 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 b5abe6580..155e9f179 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 @@ -501,6 +501,16 @@ public class Multiname { } return new ArrayList<>(); } + + public boolean isApiVersioned(AVM2ConstantPool constants) { + if (hasOwnNamespace()) { + return false; + } + if (hasOwnNamespaceSet()) { + return getNamespaceSet(constants).isApiVersioned(constants); + } + return false; + } public NamespaceSet getNamespaceSet(AVM2ConstantPool constants) { if (namespace_set_index == 0) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/NamespaceSet.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/NamespaceSet.java index 3eb893c72..319c198d0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/NamespaceSet.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/NamespaceSet.java @@ -53,6 +53,31 @@ public class NamespaceSet { return sb.toString(); } + public boolean isApiVersioned(AVM2ConstantPool constants) { + Set namespaceNames = new HashSet<>(); + Set namespaceKinds = new HashSet<>(); + for (int n:namespaces) { + Namespace ns = constants.getNamespace(n); + String nsName = ns.getRawName(constants); + if (nsName != null && nsName.length() > 0) { + int lastChar = nsName.codePointAt(nsName.length() - 1); + if (lastChar >= Namespace.MIN_API_MARK && lastChar <= Namespace.MAX_API_MARK) { + namespaceNames.add(nsName.substring(0, nsName.length() - 1)); + namespaceKinds.add(ns.kind); + } else { + return false; + } + } + } + if (namespaceNames.size() != 1) { + return false; + } + if (namespaceKinds.size() != 1) { + return false; + } + return true; + } + public List getApiVersions(AVM2ConstantPool constants) { Set namespaceNames = new HashSet<>(); Set namespaceKinds = new HashSet<>(); 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 5f9ab3ab6..124322908 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 @@ -373,6 +373,10 @@ public abstract class Trait implements Cloneable, Serializable { return writer; } + public boolean isApiVersioned(ABC abc) { + return abc.constants.getMultiname(name_index).isApiVersioned(abc.constants); + } + public final GraphTextWriter getApiVersions(ABC abc, GraphTextWriter writer) { List apiVersions = abc.constants.getMultiname(name_index).getApiVersions(abc.constants); for(int version:apiVersions) {