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;
|
||||
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user