faster AVM2 constant pool when adding a lot of items to it.

This commit is contained in:
2015-11-09 13:58:20 +01:00
parent 03e810ec67
commit f2b8b146a6
32 changed files with 478 additions and 251 deletions
@@ -456,9 +456,9 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<ABC
}
List<MultinameUsage> usages = abc.findMultinameDefinition(multinameIndex);
Multiname m = abc.constants.constant_multiname.get(multinameIndex);
Multiname m = abc.constants.getMultiname(multinameIndex);
//search other ABC tags if this is not private multiname
if (m.namespace_index > 0 && abc.constants.constant_namespace.get(m.namespace_index).kind != Namespace.KIND_PRIVATE) {
if (m.namespace_index > 0 && abc.constants.getNamespace(m.namespace_index).kind != Namespace.KIND_PRIVATE) {
for (ABCContainerTag at : getAbcList()) {
ABC a = at.getABC();
if (a == abc) {
@@ -496,9 +496,9 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<ABC
if (multinameIndex > -1) {
List<MultinameUsage> usages = abc.findMultinameDefinition(multinameIndex);
Multiname m = abc.constants.constant_multiname.get(multinameIndex);
Multiname m = abc.constants.getMultiname(multinameIndex);
//search other ABC tags if this is not private multiname
if (m.namespace_index > 0 && abc.constants.constant_namespace.get(m.namespace_index).kind != Namespace.KIND_PRIVATE) {
if (m.namespace_index > 0 && abc.constants.getNamespace(m.namespace_index).kind != Namespace.KIND_PRIVATE) {
for (ABCContainerTag at : getAbcList()) {
ABC a = at.getABC();
if (a == abc) {
@@ -787,7 +787,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<ABC
nskind = newTraitDialog.getNamespaceKind();
name = newTraitDialog.getTraitName();
isStatic = newTraitDialog.getStatic();
m = new Multiname(Multiname.QNAME, abc.constants.getStringId(name, true), abc.constants.getNamespaceId(nskind, "", 0, true), 0, 0, new ArrayList<>());
m = new Multiname(Multiname.QNAME, abc.constants.getStringId(name, true), abc.constants.getNamespaceId(nskind, "", 0, true), 0);
int mid = abc.constants.getMultinameId(m, false);
if (mid <= 0) {
break;
@@ -465,8 +465,8 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL
switch (sh.getProperties().subtype) {
case TYPE_NAME:
String typeName = sh.getProperties().specialValue;
for (int i = 1; i < abc.constants.constant_multiname.size(); i++) {
Multiname m = abc.constants.constant_multiname.get(i);
for (int i = 1; i < abc.constants.getMultinameCount(); i++) {
Multiname m = abc.constants.getMultiname(i);
if (m != null) {
if (typeName.equals(m.getNameWithNamespace(abc.constants).toString())) {
return i;
@@ -59,8 +59,8 @@ public class UsageFrame extends AppDialog implements MouseListener {
super(abcPanel.getMainPanel().getMainFrame().getWindow());
this.abcPanel = abcPanel;
List<MultinameUsage> usages = definitions ? abc.findMultinameDefinition(multinameIndex) : abc.findMultinameUsage(multinameIndex);
Multiname m = abc.constants.constant_multiname.get(multinameIndex);
if (m.namespace_index > 0 && abc.constants.constant_namespace.get(m.namespace_index).kind != Namespace.KIND_PRIVATE) {
Multiname m = abc.constants.getMultiname(multinameIndex);
if (m.namespace_index > 0 && abc.constants.getNamespace(m.namespace_index).kind != Namespace.KIND_PRIVATE) {
for (ABCContainerTag at : abc.getAbcTags()) {
ABC a = at.getABC();
if (a == abc) {
@@ -94,8 +94,8 @@ public class DebuggerTools {
if (dsp.abc == a) { //do not replace Loader in debugger itself
continue;
}
for (int i = 1; i < a.constants.constant_multiname.size(); i++) {
Multiname m = a.constants.constant_multiname.get(i);
for (int i = 1; i < a.constants.getMultinameCount(); i++) {
Multiname m = a.constants.getMultiname(i);
if ("flash.display.Loader".equals(m.getNameWithNamespace(a.constants).toRawString())) {
m.namespace_index = a.constants.getNamespaceId(Namespace.KIND_PACKAGE, debuggerPkg, 0, true);
m.name_index = a.constants.getStringId("DebugLoader", true);
@@ -112,8 +112,8 @@ public class DebuggerTools {
//change trace to fname
for (ABCContainerTag ct : swf.getAbcList()) {
ABC a = ct.getABC();
for (int i = 1; i < a.constants.constant_multiname.size(); i++) {
Multiname m = a.constants.constant_multiname.get(i);
for (int i = 1; i < a.constants.getMultinameCount(); i++) {
Multiname m = a.constants.getMultiname(i);
if ("trace".equals(m.getNameWithNamespace(a.constants).toRawString())) {
m.namespace_index = a.constants.getNamespaceId(Namespace.KIND_PACKAGE, debuggerPkg, 0, true);
m.name_index = a.constants.getStringId(fname, true);
@@ -135,8 +135,8 @@ public class DebuggerTools {
//Change all debugger calls to normal trace / Loader
for (ABCContainerTag ct : swf.getAbcList()) {
ABC a = ct.getABC();
for (int i = 1; i < a.constants.constant_multiname.size(); i++) {
Multiname m = a.constants.constant_multiname.get(i);
for (int i = 1; i < a.constants.getMultinameCount(); i++) {
Multiname m = a.constants.getMultiname(i);
String packageStr = m.getNameWithNamespace(a.constants).toString();
if (isDebuggerClass(packageStr, "debugTrace")
|| isDebuggerClass(packageStr, "debugAlert")
@@ -175,15 +175,15 @@ public class DebuggerTools {
for (ABCContainerTag ds : debugSWF.getAbcList()) {
ABC a = ds.getABC();
//Append random hex to Debugger package name
for (int i = 1; i < a.constants.constant_namespace.size(); i++) {
if (a.constants.constant_namespace.get(i).hasName(DEBUGGER_PACKAGE, a.constants)) {
a.constants.constant_namespace.get(i).name_index = a.constants.getStringId(newdebuggerpkg, true);
for (int i = 1; i < a.constants.getNamespaceCount(); i++) {
if (a.constants.getNamespace(i).hasName(DEBUGGER_PACKAGE, a.constants)) {
a.constants.getNamespace(i).name_index = a.constants.getStringId(newdebuggerpkg, true);
}
}
//Set debugger port to actually set port
for (int i = 0; i < a.constants.constant_int.size(); i++) {
if (a.constants.constant_int.get(i) == 123456L) {
a.constants.constant_int.set(i, (long) port);
for (int i = 0; i < a.constants.getIntCount(); i++) {
if (a.constants.getInt(i) == 123456L) {
a.constants.setInt(i, (long) port);
}
}
//Add to target SWF