Suppress mixin forceload logging when clear_mixin_info is on

This commit is contained in:
embeddedt 2024-01-01 12:25:16 -05:00
parent 1da264e5a7
commit d0fd498682
No known key found for this signature in database
GPG Key ID: A69433EC199B5613

View File

@ -3,16 +3,22 @@ package org.embeddedt.modernfix.util;
import org.embeddedt.modernfix.ModernFix;
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
import org.objectweb.asm.tree.ClassNode;
import org.spongepowered.asm.logging.ILogger;
import org.spongepowered.asm.logging.LoggerAdapterDefault;
import org.spongepowered.asm.mixin.MixinEnvironment;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
import org.spongepowered.asm.mixin.transformer.ClassInfo;
import org.spongepowered.asm.service.MixinServiceAbstract;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public class ClassInfoManager {
private static boolean hasRun = false;
private static final List<Runnable> loggersToRestore = new ArrayList<>();
public static void clear() {
if (!ModernFixMixinPlugin.instance.isOptionEnabled("perf.clear_mixin_classinfo.ClassInfoManager") || hasRun)
return;
@ -25,11 +31,33 @@ public class ClassInfoManager {
return f;
}
private static void changeLoggerAndRestoreLater(Map<String, ILogger> map, ILogger newLogger) {
ILogger oldLogger = map.put("mixin.audit", newLogger);
loggersToRestore.add(() -> map.put("mixin.audit", oldLogger));
}
private static void disableLoggers() throws ReflectiveOperationException {
// Disable default audit logger
Field loggersField = accessible(MixinServiceAbstract.class.getDeclaredField("loggers"));
changeLoggerAndRestoreLater((Map<String, ILogger>)loggersField.get(null), new LoggerAdapterDefault("mixin.audit"));
Class<?> fabricLogger = null;
try {
fabricLogger = Class.forName("net.fabricmc.loader.impl.knot.MixinLogger");
} catch(Throwable e) {
// Probably not Fabric
return;
}
// Disable Fabric audit logger
loggersField = accessible(fabricLogger.getDeclaredField("LOGGER_MAP"));
changeLoggerAndRestoreLater((Map<String, ILogger>)loggersField.get(null), new LoggerAdapterDefault("mixin.audit"));
}
private static void doClear() {
Map<String, ClassInfo> classInfoCache;
Field mixinField, stateField, classNodeField, methodsField, fieldsField;
Class<?> stateClz;
try {
disableLoggers();
Field field = accessible(ClassInfo.class.getDeclaredField("cache"));
classInfoCache = (Map<String, ClassInfo>) field.get(null);
mixinField = accessible(ClassInfo.class.getDeclaredField("mixin"));
@ -70,6 +98,9 @@ public class ClassInfoManager {
} catch (RuntimeException e) {
e.printStackTrace();
}
// Put back the old logger
loggersToRestore.forEach(Runnable::run);
loggersToRestore.clear();
ModernFix.LOGGER.warn("Cleared mixin data structures");
}
}