Merge 1.20.4 into 1.20.5

This commit is contained in:
embeddedt 2024-03-29 10:49:44 -04:00
commit 60c2b02e37
No known key found for this signature in database
GPG Key ID: A69433EC199B5613

View File

@ -12,7 +12,6 @@ import org.spongepowered.asm.service.MixinServiceAbstract;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -54,15 +53,13 @@ public class ClassInfoManager {
private static void doClear() { private static void doClear() {
Map<String, ClassInfo> classInfoCache; Map<String, ClassInfo> classInfoCache;
Field mixinField, stateField, classNodeField, methodsField, fieldsField; Field mixinField, stateField, classNodeField;
Class<?> stateClz; Class<?> stateClz;
try { try {
disableLoggers(); disableLoggers();
Field field = accessible(ClassInfo.class.getDeclaredField("cache")); Field field = accessible(ClassInfo.class.getDeclaredField("cache"));
classInfoCache = (Map<String, ClassInfo>) field.get(null); classInfoCache = (Map<String, ClassInfo>) field.get(null);
mixinField = accessible(ClassInfo.class.getDeclaredField("mixin")); mixinField = accessible(ClassInfo.class.getDeclaredField("mixin"));
methodsField = accessible(ClassInfo.class.getDeclaredField("methods"));
fieldsField = accessible(ClassInfo.class.getDeclaredField("fields"));
stateClz = Class.forName("org.spongepowered.asm.mixin.transformer.MixinInfo$State"); stateClz = Class.forName("org.spongepowered.asm.mixin.transformer.MixinInfo$State");
stateField = accessible(Class.forName("org.spongepowered.asm.mixin.transformer.MixinInfo").getDeclaredField("state")); stateField = accessible(Class.forName("org.spongepowered.asm.mixin.transformer.MixinInfo").getDeclaredField("state"));
classNodeField = accessible(stateClz.getDeclaredField("classNode")); classNodeField = accessible(stateClz.getDeclaredField("classNode"));
@ -73,7 +70,8 @@ public class ClassInfoManager {
MixinEnvironment.getDefaultEnvironment().audit(); MixinEnvironment.getDefaultEnvironment().audit();
try { try {
ClassNode emptyNode = new ClassNode(); ClassNode emptyNode = new ClassNode();
classInfoCache.entrySet().removeIf(entry -> { List<Map.Entry<String, ClassInfo>> entries = new ArrayList<>(classInfoCache.entrySet());
entries.stream().filter(entry -> {
if(entry.getKey().equals("java/lang/Object")) if(entry.getKey().equals("java/lang/Object"))
return false; return false;
ClassInfo mixinClz = entry.getValue(); ClassInfo mixinClz = entry.getValue();
@ -87,14 +85,11 @@ public class ClassInfoManager {
if (state != null) if (state != null)
classNodeField.set(state, emptyNode); classNodeField.set(state, emptyNode);
} }
// clear fields, methods
((Collection<?>)methodsField.get(mixinClz)).clear();
((Collection<?>)fieldsField.get(mixinClz)).clear();
} catch (ReflectiveOperationException | RuntimeException e) { } catch (ReflectiveOperationException | RuntimeException e) {
e.printStackTrace(); e.printStackTrace();
} }
return true; return true;
}); }).forEach(entry -> classInfoCache.remove(entry.getKey()));
} catch (RuntimeException e) { } catch (RuntimeException e) {
e.printStackTrace(); e.printStackTrace();
} }