Do not compile API metadata when file is versioned.

This commit is contained in:
Jindra Petřík
2023-09-27 19:55:46 +02:00
parent 05bb131c13
commit 3a7c0b106c
6 changed files with 57 additions and 7 deletions

View File

@@ -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;
}
}

View File

@@ -2254,10 +2254,13 @@ public class AVM2SourceGenerator implements SourceGenerator {
}
public int[] generateMetadata(List<Map.Entry<String, Map<String, String>>> metadata) {
public int[] generateMetadata(List<Map.Entry<String, Map<String, String>>> metadata, ABC abc) {
int[] ret = new int[metadata.size()];
for (int i = 0; i < metadata.size(); i++) {
Map.Entry<String, Map<String, String>> 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;
}

View File

@@ -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;

View File

@@ -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) {

View File

@@ -53,6 +53,31 @@ public class NamespaceSet {
return sb.toString();
}
public boolean isApiVersioned(AVM2ConstantPool constants) {
Set<String> namespaceNames = new HashSet<>();
Set<Integer> 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<Integer> getApiVersions(AVM2ConstantPool constants) {
Set<String> namespaceNames = new HashSet<>();
Set<Integer> namespaceKinds = new HashSet<>();

View File

@@ -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<Integer> apiVersions = abc.constants.getMultiname(name_index).getApiVersions(abc.constants);
for(int version:apiVersions) {