mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-06-17 16:41:51 +00:00
Do not compile API metadata when file is versioned.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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<>();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user