From d0fd498682a60a4ee0c4bb6bc9b6b42059f15c0c Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 1 Jan 2024 12:25:16 -0500 Subject: [PATCH] Suppress mixin forceload logging when clear_mixin_info is on --- .../modernfix/util/ClassInfoManager.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java b/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java index 8efaa4f1..1daa97a8 100644 --- a/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java +++ b/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java @@ -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 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 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)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)loggersField.get(null), new LoggerAdapterDefault("mixin.audit")); + } + private static void doClear() { Map classInfoCache; Field mixinField, stateField, classNodeField, methodsField, fieldsField; Class stateClz; try { + disableLoggers(); Field field = accessible(ClassInfo.class.getDeclaredField("cache")); classInfoCache = (Map) 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"); } }