Adjust ArgsClassGenerator start index based on class cache

This commit is contained in:
embeddedt 2023-01-28 08:27:38 -05:00
parent ba30b37552
commit 497393bf59
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
3 changed files with 43 additions and 2 deletions

View File

@ -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<String, ILaunchPluginService> 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;

View File

@ -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<String, byte[]> 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<Path> 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);

View File

@ -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");