Skip to content

Commit d0fd498

Browse files
committed
Suppress mixin forceload logging when clear_mixin_info is on
1 parent 1da264e commit d0fd498

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,22 @@
33
import org.embeddedt.modernfix.ModernFix;
44
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
55
import org.objectweb.asm.tree.ClassNode;
6+
import org.spongepowered.asm.logging.ILogger;
7+
import org.spongepowered.asm.logging.LoggerAdapterDefault;
68
import org.spongepowered.asm.mixin.MixinEnvironment;
79
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
810
import org.spongepowered.asm.mixin.transformer.ClassInfo;
11+
import org.spongepowered.asm.service.MixinServiceAbstract;
912

1013
import java.lang.reflect.Field;
14+
import java.util.ArrayList;
1115
import java.util.Collection;
16+
import java.util.List;
1217
import java.util.Map;
1318

1419
public class ClassInfoManager {
1520
private static boolean hasRun = false;
21+
private static final List<Runnable> loggersToRestore = new ArrayList<>();
1622
public static void clear() {
1723
if (!ModernFixMixinPlugin.instance.isOptionEnabled("perf.clear_mixin_classinfo.ClassInfoManager") || hasRun)
1824
return;
@@ -25,11 +31,33 @@ private static Field accessible(Field f) {
2531
return f;
2632
}
2733

34+
private static void changeLoggerAndRestoreLater(Map<String, ILogger> map, ILogger newLogger) {
35+
ILogger oldLogger = map.put("mixin.audit", newLogger);
36+
loggersToRestore.add(() -> map.put("mixin.audit", oldLogger));
37+
}
38+
39+
private static void disableLoggers() throws ReflectiveOperationException {
40+
// Disable default audit logger
41+
Field loggersField = accessible(MixinServiceAbstract.class.getDeclaredField("loggers"));
42+
changeLoggerAndRestoreLater((Map<String, ILogger>)loggersField.get(null), new LoggerAdapterDefault("mixin.audit"));
43+
Class<?> fabricLogger = null;
44+
try {
45+
fabricLogger = Class.forName("net.fabricmc.loader.impl.knot.MixinLogger");
46+
} catch(Throwable e) {
47+
// Probably not Fabric
48+
return;
49+
}
50+
// Disable Fabric audit logger
51+
loggersField = accessible(fabricLogger.getDeclaredField("LOGGER_MAP"));
52+
changeLoggerAndRestoreLater((Map<String, ILogger>)loggersField.get(null), new LoggerAdapterDefault("mixin.audit"));
53+
}
54+
2855
private static void doClear() {
2956
Map<String, ClassInfo> classInfoCache;
3057
Field mixinField, stateField, classNodeField, methodsField, fieldsField;
3158
Class<?> stateClz;
3259
try {
60+
disableLoggers();
3361
Field field = accessible(ClassInfo.class.getDeclaredField("cache"));
3462
classInfoCache = (Map<String, ClassInfo>) field.get(null);
3563
mixinField = accessible(ClassInfo.class.getDeclaredField("mixin"));
@@ -70,6 +98,9 @@ private static void doClear() {
7098
} catch (RuntimeException e) {
7199
e.printStackTrace();
72100
}
101+
// Put back the old logger
102+
loggersToRestore.forEach(Runnable::run);
103+
loggersToRestore.clear();
73104
ModernFix.LOGGER.warn("Cleared mixin data structures");
74105
}
75106
}

0 commit comments

Comments
 (0)