mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-07-02 15:34:24 +00:00
Collision fixer - fix also other similar names
This commit is contained in:
@@ -19,10 +19,12 @@ package com.jpexs.decompiler.flash.abc.avm2.deobfuscation;
|
||||
import com.jpexs.decompiler.flash.SWF;
|
||||
import com.jpexs.decompiler.flash.abc.ABC;
|
||||
import com.jpexs.decompiler.flash.abc.types.Multiname;
|
||||
import com.jpexs.decompiler.flash.abc.types.NamespaceSet;
|
||||
import com.jpexs.decompiler.flash.abc.usages.MultinameUsage;
|
||||
import com.jpexs.decompiler.flash.tags.ABCContainerTag;
|
||||
import com.jpexs.decompiler.flash.tags.Tag;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
public class AbcMultiNameCollisionFixer {
|
||||
@@ -45,6 +47,7 @@ public class AbcMultiNameCollisionFixer {
|
||||
int ret = 0;
|
||||
for (int multiNameIndex : collidingMultinameIndices) {
|
||||
Multiname multiName = abc.constants.getMultiname(multiNameIndex);
|
||||
int namespace = multiName.namespace_index;
|
||||
String oldName = abc.constants.getString(multiName.name_index);
|
||||
String selectedBaseName = oldName + "_" + multiName.namespace_index;
|
||||
String selectedName = selectedBaseName;
|
||||
@@ -56,7 +59,37 @@ public class AbcMultiNameCollisionFixer {
|
||||
newNames.add(selectedName);
|
||||
int newNameIndex = abc.constants.getStringId(selectedName, true);
|
||||
multiName.name_index = newNameIndex;
|
||||
//TODO: fix all similar multinames
|
||||
|
||||
//Find other names with same name and namespace which are not listed as colliding, but are related
|
||||
for (int m = 1; m < abc.constants.getMultinameCount(); m++) {
|
||||
if (collidingMultinameIndices.contains(m)) {
|
||||
continue;
|
||||
}
|
||||
Multiname other = abc.constants.getMultiname(m);
|
||||
if (other.hasOwnName() && other.hasOwnNamespace()) {
|
||||
int otherNamespace = other.namespace_index;
|
||||
if (namespace == otherNamespace) {
|
||||
if (Objects.equals(oldName, abc.constants.getString(other.name_index))) {
|
||||
other.name_index = newNameIndex;
|
||||
ret++;
|
||||
}
|
||||
}
|
||||
} else if (other.hasOwnName() && other.hasOwnNamespaceSet()) {
|
||||
NamespaceSet otherNamespaceSet = abc.constants.getNamespaceSet(other.namespace_set_index);
|
||||
//NamespaceSet with only one namespace - this one
|
||||
if (otherNamespaceSet.namespaces.length == 1) {
|
||||
int otherNamespace = otherNamespaceSet.namespaces[0];
|
||||
if (namespace == otherNamespace) {
|
||||
if (Objects.equals(oldName, abc.constants.getString(other.name_index))) {
|
||||
other.name_index = newNameIndex;
|
||||
ret++;
|
||||
}
|
||||
}
|
||||
}
|
||||
//What if there are more namespaces in the set and how about runtime resolved names?
|
||||
}
|
||||
}
|
||||
|
||||
ret++;
|
||||
}
|
||||
if (ret > 0) {
|
||||
|
||||
Reference in New Issue
Block a user