From 787573badc0511d82810bb251090f5edb5581f00 Mon Sep 17 00:00:00 2001 From: Alexdoru <57050655+Alexdoru@users.noreply.github.com> Date: Thu, 21 May 2026 22:01:09 +0200 Subject: [PATCH 1/2] intern superclass and interfaces of ClassHeirachyManager data --- .../java/codechicken/lib/asm/ClassHeirachyManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/codechicken/lib/asm/ClassHeirachyManager.java b/src/main/java/codechicken/lib/asm/ClassHeirachyManager.java index c606fd7..e2c0871 100644 --- a/src/main/java/codechicken/lib/asm/ClassHeirachyManager.java +++ b/src/main/java/codechicken/lib/asm/ClassHeirachyManager.java @@ -125,7 +125,7 @@ public ClassInfo(ClassReader classReader) { superclass = "java.lang.Object"; parent = OBJECT; } else { - superclass = toKey(superName); + superclass = toKey(superName).intern(); } if (interfaces == null || interfaces.length == 0) { @@ -133,7 +133,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] = toKey(interfaces[i]).intern(); } } } @@ -148,7 +148,7 @@ public ClassInfo(Class aclass) { this.superclass = "java.lang.Object"; this.parent = OBJECT; } else { - this.superclass = toKey(superclass.getName()); + this.superclass = toKey(superclass.getName()).intern(); } } final Class[] interfaces = aclass.getInterfaces(); @@ -157,7 +157,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] = toKey(interfaces[i].getName()).intern(); } } } From 5fdc1d5667343c9ce3319fd4965be80ce3c5b8be Mon Sep 17 00:00:00 2001 From: Alexdoru <57050655+Alexdoru@users.noreply.github.com> Date: Sun, 24 May 2026 15:00:35 +0200 Subject: [PATCH 2/2] use custom pool instead of intern --- .../codechicken/lib/asm/ClassHeirachyManager.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/codechicken/lib/asm/ClassHeirachyManager.java b/src/main/java/codechicken/lib/asm/ClassHeirachyManager.java index e2c0871..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).intern(); + 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]).intern(); + 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()).intern(); + 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()).intern(); + 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()); + } } }