From 497393bf5951d8edf27eb1e65f5baada466d3082 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 28 Jan 2023 08:27:38 -0500 Subject: [PATCH] Adjust ArgsClassGenerator start index based on class cache --- .../ModernFixCachingClassTransformer.java | 5 ++- .../hashers/MixinTransformerHasher.java | 37 +++++++++++++++++++ .../modernfix/core/ModernFixMixinPlugin.java | 3 ++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/main/java/cpw/mods/modlauncher/ModernFixCachingClassTransformer.java b/src/main/java/cpw/mods/modlauncher/ModernFixCachingClassTransformer.java index 02bfa658..44bef8a6 100644 --- a/src/main/java/cpw/mods/modlauncher/ModernFixCachingClassTransformer.java +++ b/src/main/java/cpw/mods/modlauncher/ModernFixCachingClassTransformer.java @@ -34,9 +34,9 @@ import org.spongepowered.asm.launch.MixinLaunchPluginLegacy; import javax.lang.model.SourceVersion; public class ModernFixCachingClassTransformer extends ClassTransformer { - private static final Logger LOGGER = LogManager.getLogger("ModernFixCachingTransformer"); + public static final Logger LOGGER = LogManager.getLogger("ModernFixCachingTransformer"); - private final File CLASS_CACHE_FOLDER = FileUtil.childFile(FMLPaths.GAMEDIR.get().resolve("modernfix").resolve("classCacheV1").toFile()); + public static File CLASS_CACHE_FOLDER = null; private final LaunchPluginHandler pluginHandler; private final Map plugins; private final TransformStore transformStore; @@ -59,6 +59,7 @@ public class ModernFixCachingClassTransformer extends ClassTransformer { public ModernFixCachingClassTransformer(TransformStore transformStore, LaunchPluginHandler pluginHandler, TransformingClassLoader transformingClassLoader, TransformerAuditTrail trail) { super(transformStore, pluginHandler, transformingClassLoader, trail); + CLASS_CACHE_FOLDER = FileUtil.childFile(FMLPaths.GAMEDIR.get().resolve("modernfix").resolve("classCacheV1").toFile()); this.transformStore = transformStore; this.pluginHandler = pluginHandler; this.transformingClassLoader = transformingClassLoader; diff --git a/src/main/java/org/embeddedt/modernfix/classloading/hashers/MixinTransformerHasher.java b/src/main/java/org/embeddedt/modernfix/classloading/hashers/MixinTransformerHasher.java index fe280638..1716dcd3 100644 --- a/src/main/java/org/embeddedt/modernfix/classloading/hashers/MixinTransformerHasher.java +++ b/src/main/java/org/embeddedt/modernfix/classloading/hashers/MixinTransformerHasher.java @@ -6,13 +6,18 @@ import org.spongepowered.asm.launch.IClassProcessor; import org.spongepowered.asm.launch.MixinLaunchPluginLegacy; import org.spongepowered.asm.mixin.MixinEnvironment; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; +import org.spongepowered.asm.mixin.injection.invoke.arg.ArgsClassGenerator; +import org.spongepowered.asm.mixin.transformer.ext.Extensions; import java.io.IOException; import java.lang.reflect.Field; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; +import java.util.stream.Stream; public class MixinTransformerHasher { private static HashMap hashesByClass = null; @@ -20,6 +25,8 @@ public class MixinTransformerHasher { private static Field processorsListField, transformerField, processorField, environmentField; + private static boolean fixedArgsClassCount = false; + private static final byte[] NO_MIXINS = new byte[] {(byte)0xde, (byte)0xad, (byte)0xbe, (byte)0xef}; static { @@ -54,6 +61,36 @@ public class MixinTransformerHasher { transformerField.setAccessible(true); } Object transformer = transformerField.get(transformHandler); + if(!fixedArgsClassCount) { + Path syntheticFolderPath = ModernFixCachingClassTransformer.CLASS_CACHE_FOLDER.toPath().resolve("org").resolve("spongepowered").resolve("asm").resolve("synthetic"); + if(Files.exists(syntheticFolderPath)) { + Field extensionsField = transformer.getClass().getDeclaredField("extensions"); + extensionsField.setAccessible(true); + Extensions extensions = (Extensions)extensionsField.get(transformer); + ArgsClassGenerator argsGen = extensions.getGenerator(ArgsClassGenerator.class); + Field nextIndexField = ArgsClassGenerator.class.getDeclaredField("nextIndex"); + try(Stream argsStream = Files.find(syntheticFolderPath, 1, (path, attr) -> path.getFileName().toString().startsWith("Args$"))) { + int[] startIndex = new int[1]; + startIndex[0] = 1; + argsStream.forEach(path -> { + String fileName = path.getFileName().toString(); + try { + int idx = Integer.parseInt(fileName.replace("Args$", "")); + startIndex[0] = Math.max(startIndex[0], idx + 1); + } catch(NumberFormatException e) { + ModernFixCachingClassTransformer.LOGGER.warn("Unexpected classname: " + fileName); + } + }); + nextIndexField.setAccessible(true); + nextIndexField.set(argsGen, startIndex[0]); + ModernFixCachingClassTransformer.LOGGER.debug("Patched ArgsClassGenerator to start at index " + startIndex[0]); + } catch(IOException e) { + ModernFixCachingClassTransformer.LOGGER.error("Failed to adjust Mixin synthetic args"); + } + } + + fixedArgsClassCount = true; + } if(processorField == null) { processorField = transformer.getClass().getDeclaredField("processor"); processorField.setAccessible(true); diff --git a/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java b/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java index 5cb27672..9a957517 100644 --- a/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java +++ b/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java @@ -10,8 +10,10 @@ import org.embeddedt.modernfix.classloading.ModernFixResourceFinder; import org.embeddedt.modernfix.core.config.ModernFixEarlyConfig; import org.embeddedt.modernfix.core.config.Option; import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.MixinEnvironment; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; +import org.spongepowered.asm.mixin.injection.invoke.arg.ArgsClassGenerator; import sun.misc.Unsafe; import java.io.File; @@ -119,6 +121,7 @@ public class ModernFixMixinPlugin implements IMixinConfigPlugin { TransformStore store = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "transformers"); LaunchPluginHandler pluginHandler = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "pluginHandler"); TransformerAuditTrail trail = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "auditTrail"); + injectClassIntoSystemLoader("org.embeddedt.modernfix.util.FileUtil"); injectClassIntoSystemLoader("org.embeddedt.modernfix.classloading.api.IHashableTransformer"); injectClassIntoSystemLoader("org.embeddedt.modernfix.classloading.hashers.CoreModTransformerHasher"); injectClassIntoSystemLoader("org.embeddedt.modernfix.classloading.hashers.MixinTransformerHasher");