From e5028535e9e7f0a861b6ed0bab30e15cacd6b5be Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 18 Apr 2023 22:15:56 -0400 Subject: [PATCH] Clear mixin ClassInfo cache when load finishes --- .../org/embeddedt/modernfix/ModernFix.java | 9 +++++++ .../modernfix/util/ClassInfoManager.java | 24 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java diff --git a/src/main/java/org/embeddedt/modernfix/ModernFix.java b/src/main/java/org/embeddedt/modernfix/ModernFix.java index f1106e64..05c48f8c 100644 --- a/src/main/java/org/embeddedt/modernfix/ModernFix.java +++ b/src/main/java/org/embeddedt/modernfix/ModernFix.java @@ -2,11 +2,13 @@ package org.embeddedt.modernfix; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.*; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; import net.minecraftforge.fml.event.server.FMLServerStartedEvent; import net.minecraftforge.fml.event.server.FMLServerStartingEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -20,6 +22,7 @@ import org.embeddedt.modernfix.entity.EntityDataIDSyncHandler; import org.embeddedt.modernfix.packet.PacketHandler; import org.embeddedt.modernfix.registry.ObjectHolderClearer; import org.embeddedt.modernfix.structure.AsyncLocator; +import org.embeddedt.modernfix.util.ClassInfoManager; import org.embeddedt.modernfix.util.KubeUtil; import java.lang.management.ManagementFactory; @@ -68,6 +71,7 @@ public class ModernFix { // Register ourselves for server and other game events we are interested in MinecraftForge.EVENT_BUS.register(this); FMLJavaModLoadingContext.get().getModEventBus().addListener(this::commonSetup); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onLoadComplete); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> MinecraftForge.EVENT_BUS.register(new ModernFixClient())); ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.DISPLAYTEST, () -> Pair.of(() -> FMLNetworkConstants.IGNORESERVERONLY, (a, b) -> true)); ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, ModernFixConfig.COMMON_CONFIG); @@ -102,4 +106,9 @@ public class ModernFix { ModernFix.LOGGER.warn("Dedicated server took " + gameStartTime + " seconds to load"); } } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onLoadComplete(FMLLoadCompleteEvent event) { + ClassInfoManager.clear(); + } } diff --git a/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java b/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java new file mode 100644 index 00000000..3497c21d --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java @@ -0,0 +1,24 @@ +package org.embeddedt.modernfix.util; + +import org.spongepowered.asm.mixin.transformer.ClassInfo; + +import java.lang.reflect.Field; +import java.util.Iterator; +import java.util.Map; + +public class ClassInfoManager { + private static Map classInfoCache = null; + public static void clear() { + if(classInfoCache == null) { + try { + Field field = ClassInfo.class.getDeclaredField("cache"); + field.setAccessible(true); + classInfoCache = (Map)field.get(null); + } catch(ReflectiveOperationException | RuntimeException e) { + e.printStackTrace(); + return; + } + } + classInfoCache.entrySet().removeIf(entry -> !entry.getKey().equals("java/lang/Object")); + } +}