diff --git a/src/main/java/codechicken/lib/asm/ClassHeirachyManager.java b/src/main/java/codechicken/lib/asm/ClassHeirachyManager.java index c606fd7..f847326 100644 --- a/src/main/java/codechicken/lib/asm/ClassHeirachyManager.java +++ b/src/main/java/codechicken/lib/asm/ClassHeirachyManager.java @@ -2,6 +2,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; import net.minecraft.launchwrapper.IClassTransformer; import net.minecraft.launchwrapper.Launch; @@ -107,6 +108,7 @@ public static String getSuperClass(String name, boolean runtime) { private static class ClassInfo { public static final ClassInfo OBJECT = new ClassInfo(); + private static final Map STRING_POOL = new ConcurrentHashMap<>(256); public final String superclass; public final String[] interfaces; @@ -125,7 +127,7 @@ public ClassInfo(ClassReader classReader) { superclass = "java.lang.Object"; parent = OBJECT; } else { - superclass = toKey(superName); + superclass = pool(toKey(superName)); } if (interfaces == null || interfaces.length == 0) { @@ -133,7 +135,7 @@ public ClassInfo(ClassReader classReader) { } else { this.interfaces = new String[interfaces.length]; for (int i = 0; i < interfaces.length; i++) { - this.interfaces[i] = toKey(interfaces[i]); + this.interfaces[i] = pool(toKey(interfaces[i])); } } } @@ -148,7 +150,7 @@ public ClassInfo(Class aclass) { this.superclass = "java.lang.Object"; this.parent = OBJECT; } else { - this.superclass = toKey(superclass.getName()); + this.superclass = pool(toKey(superclass.getName())); } } final Class[] interfaces = aclass.getInterfaces(); @@ -157,7 +159,7 @@ public ClassInfo(Class aclass) { } else { this.interfaces = new String[interfaces.length]; for (int i = 0; i < interfaces.length; i++) { - this.interfaces[i] = toKey(interfaces[i].getName()); + this.interfaces[i] = pool(toKey(interfaces[i].getName())); } } } @@ -172,5 +174,9 @@ public boolean hasSuper(String superclass) { this.parent = parentInfo; return parentInfo.hasSuper(superclass); } + + private static String pool(String s) { + return STRING_POOL.computeIfAbsent(s, Function.identity()); + } } }