Adjust ArgsClassGenerator start index based on class cache
This commit is contained in:
parent
ba30b37552
commit
497393bf59
|
|
@ -34,9 +34,9 @@ import org.spongepowered.asm.launch.MixinLaunchPluginLegacy;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.SourceVersion;
|
||||||
|
|
||||||
public class ModernFixCachingClassTransformer extends ClassTransformer {
|
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 LaunchPluginHandler pluginHandler;
|
||||||
private final Map<String, ILaunchPluginService> plugins;
|
private final Map<String, ILaunchPluginService> plugins;
|
||||||
private final TransformStore transformStore;
|
private final TransformStore transformStore;
|
||||||
|
|
@ -59,6 +59,7 @@ public class ModernFixCachingClassTransformer extends ClassTransformer {
|
||||||
|
|
||||||
public ModernFixCachingClassTransformer(TransformStore transformStore, LaunchPluginHandler pluginHandler, TransformingClassLoader transformingClassLoader, TransformerAuditTrail trail) {
|
public ModernFixCachingClassTransformer(TransformStore transformStore, LaunchPluginHandler pluginHandler, TransformingClassLoader transformingClassLoader, TransformerAuditTrail trail) {
|
||||||
super(transformStore, pluginHandler, transformingClassLoader, trail);
|
super(transformStore, pluginHandler, transformingClassLoader, trail);
|
||||||
|
CLASS_CACHE_FOLDER = FileUtil.childFile(FMLPaths.GAMEDIR.get().resolve("modernfix").resolve("classCacheV1").toFile());
|
||||||
this.transformStore = transformStore;
|
this.transformStore = transformStore;
|
||||||
this.pluginHandler = pluginHandler;
|
this.pluginHandler = pluginHandler;
|
||||||
this.transformingClassLoader = transformingClassLoader;
|
this.transformingClassLoader = transformingClassLoader;
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,18 @@ import org.spongepowered.asm.launch.IClassProcessor;
|
||||||
import org.spongepowered.asm.launch.MixinLaunchPluginLegacy;
|
import org.spongepowered.asm.launch.MixinLaunchPluginLegacy;
|
||||||
import org.spongepowered.asm.mixin.MixinEnvironment;
|
import org.spongepowered.asm.mixin.MixinEnvironment;
|
||||||
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
|
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.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class MixinTransformerHasher {
|
public class MixinTransformerHasher {
|
||||||
private static HashMap<String, byte[]> hashesByClass = null;
|
private static HashMap<String, byte[]> hashesByClass = null;
|
||||||
|
|
@ -20,6 +25,8 @@ public class MixinTransformerHasher {
|
||||||
|
|
||||||
private static Field processorsListField, transformerField, processorField, environmentField;
|
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};
|
private static final byte[] NO_MIXINS = new byte[] {(byte)0xde, (byte)0xad, (byte)0xbe, (byte)0xef};
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
|
@ -54,6 +61,36 @@ public class MixinTransformerHasher {
|
||||||
transformerField.setAccessible(true);
|
transformerField.setAccessible(true);
|
||||||
}
|
}
|
||||||
Object transformer = transformerField.get(transformHandler);
|
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) {
|
if(processorField == null) {
|
||||||
processorField = transformer.getClass().getDeclaredField("processor");
|
processorField = transformer.getClass().getDeclaredField("processor");
|
||||||
processorField.setAccessible(true);
|
processorField.setAccessible(true);
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,10 @@ import org.embeddedt.modernfix.classloading.ModernFixResourceFinder;
|
||||||
import org.embeddedt.modernfix.core.config.ModernFixEarlyConfig;
|
import org.embeddedt.modernfix.core.config.ModernFixEarlyConfig;
|
||||||
import org.embeddedt.modernfix.core.config.Option;
|
import org.embeddedt.modernfix.core.config.Option;
|
||||||
import org.objectweb.asm.tree.ClassNode;
|
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.IMixinConfigPlugin;
|
||||||
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
|
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
|
||||||
|
import org.spongepowered.asm.mixin.injection.invoke.arg.ArgsClassGenerator;
|
||||||
import sun.misc.Unsafe;
|
import sun.misc.Unsafe;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
@ -119,6 +121,7 @@ public class ModernFixMixinPlugin implements IMixinConfigPlugin {
|
||||||
TransformStore store = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "transformers");
|
TransformStore store = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "transformers");
|
||||||
LaunchPluginHandler pluginHandler = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "pluginHandler");
|
LaunchPluginHandler pluginHandler = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "pluginHandler");
|
||||||
TransformerAuditTrail trail = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "auditTrail");
|
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.api.IHashableTransformer");
|
||||||
injectClassIntoSystemLoader("org.embeddedt.modernfix.classloading.hashers.CoreModTransformerHasher");
|
injectClassIntoSystemLoader("org.embeddedt.modernfix.classloading.hashers.CoreModTransformerHasher");
|
||||||
injectClassIntoSystemLoader("org.embeddedt.modernfix.classloading.hashers.MixinTransformerHasher");
|
injectClassIntoSystemLoader("org.embeddedt.modernfix.classloading.hashers.MixinTransformerHasher");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user