33import org .embeddedt .modernfix .ModernFix ;
44import org .embeddedt .modernfix .core .ModernFixMixinPlugin ;
55import org .objectweb .asm .tree .ClassNode ;
6+ import org .spongepowered .asm .logging .ILogger ;
7+ import org .spongepowered .asm .logging .LoggerAdapterDefault ;
68import org .spongepowered .asm .mixin .MixinEnvironment ;
79import org .spongepowered .asm .mixin .extensibility .IMixinInfo ;
810import org .spongepowered .asm .mixin .transformer .ClassInfo ;
11+ import org .spongepowered .asm .service .MixinServiceAbstract ;
912
1013import java .lang .reflect .Field ;
14+ import java .util .ArrayList ;
1115import java .util .Collection ;
16+ import java .util .List ;
1217import java .util .Map ;
1318
1419public 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