Suppress mixin forceload logging when clear_mixin_info is on
This commit is contained in:
parent
1da264e5a7
commit
d0fd498682
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user