WIP: class search improvements
This commit is contained in:
parent
c8a5d62e34
commit
c01ea4fcc4
|
|
@ -147,6 +147,8 @@ dependencies {
|
||||||
runtimeOnly fg.deobf("curse.maven:spark-361579:3767277")
|
runtimeOnly fg.deobf("curse.maven:spark-361579:3767277")
|
||||||
|
|
||||||
compileOnly fg.deobf("curse.maven:refinedstorage-243076:3807951")
|
compileOnly fg.deobf("curse.maven:refinedstorage-243076:3807951")
|
||||||
|
|
||||||
|
implementation group: 'net.bytebuddy', name: 'byte-buddy', version: '1.12.22'
|
||||||
}
|
}
|
||||||
|
|
||||||
// Example for how to get properties into the manifest for reading at runtime.
|
// Example for how to get properties into the manifest for reading at runtime.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
package org.embeddedt.modernfix.classloading;
|
||||||
|
|
||||||
|
import net.minecraftforge.fml.loading.LoadingModList;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
|
||||||
|
public class ModernFixResourceFinder {
|
||||||
|
public static Enumeration<URL> findAllURLsForResource(String input) {
|
||||||
|
System.out.println(input);
|
||||||
|
return Collections.emptyEnumeration(); //LoadingModList.get().findAllURLsForResource(input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
package org.embeddedt.modernfix.service;
|
|
||||||
|
|
||||||
import cpw.mods.modlauncher.*;
|
|
||||||
import cpw.mods.modlauncher.serviceapi.ILaunchPluginService;
|
|
||||||
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
|
|
||||||
import org.objectweb.asm.Type;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.util.EnumSet;
|
|
||||||
|
|
||||||
public class CachingTransformerService implements ILaunchPluginService {
|
|
||||||
@Override
|
|
||||||
public String name() {
|
|
||||||
return "modernfixcache";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initializeLaunch(ITransformerLoader transformerLoader, Path[] specialPaths) {
|
|
||||||
/* Swap the transformer for ours */
|
|
||||||
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
|
||||||
if(!(loader instanceof TransformingClassLoader)) {
|
|
||||||
throw new IllegalStateException("Expected a TransformingClassLoader");
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Field classTransformerField = TransformingClassLoader.class.getDeclaredField("classTransformer");
|
|
||||||
classTransformerField.setAccessible(true);
|
|
||||||
ClassTransformer t = (ClassTransformer)classTransformerField.get(loader);
|
|
||||||
TransformStore store = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "transformers");
|
|
||||||
LaunchPluginHandler pluginHandler = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "pluginHandler");
|
|
||||||
TransformerAuditTrail trail = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "auditTrail");
|
|
||||||
classTransformerField.set(loader, new ModernFixCachingClassTransformer(store, pluginHandler, (TransformingClassLoader)loader, trail));
|
|
||||||
} catch(ReflectiveOperationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final EnumSet<Phase> NEVER = EnumSet.noneOf(Phase.class);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EnumSet<Phase> handlesClass(Type classType, boolean isEmpty) {
|
|
||||||
return NEVER;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
package org.embeddedt.modernfix.service;
|
||||||
|
|
||||||
|
import com.electronwill.nightconfig.toml.TomlFormat;
|
||||||
|
import cpw.mods.modlauncher.*;
|
||||||
|
import cpw.mods.modlauncher.api.IEnvironment;
|
||||||
|
import cpw.mods.modlauncher.api.TypesafeMap;
|
||||||
|
import cpw.mods.modlauncher.serviceapi.ILaunchPluginService;
|
||||||
|
import net.bytebuddy.ByteBuddy;
|
||||||
|
import net.bytebuddy.implementation.MethodDelegation;
|
||||||
|
import net.bytebuddy.matcher.ElementMatchers;
|
||||||
|
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
|
||||||
|
import net.minecraftforge.fml.config.ConfigFileTypeHandler;
|
||||||
|
import org.embeddedt.modernfix.classloading.ModernFixResourceFinder;
|
||||||
|
import org.embeddedt.modernfix.core.config.ModernFixConfig;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
public class ModernFixLaunchService implements ILaunchPluginService {
|
||||||
|
|
||||||
|
private static final boolean USE_TRANSFORMER_CACHE = false;
|
||||||
|
@Override
|
||||||
|
public String name() {
|
||||||
|
return "modernfix";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initializeLaunch(ITransformerLoader transformerLoader, Path[] specialPaths) {
|
||||||
|
/* Swap the transformer for ours */
|
||||||
|
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||||
|
if(!(loader instanceof TransformingClassLoader)) {
|
||||||
|
throw new IllegalStateException("Expected a TransformingClassLoader");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if(USE_TRANSFORMER_CACHE) {
|
||||||
|
Field classTransformerField = TransformingClassLoader.class.getDeclaredField("classTransformer");
|
||||||
|
classTransformerField.setAccessible(true);
|
||||||
|
ClassTransformer t = (ClassTransformer)classTransformerField.get(loader);
|
||||||
|
TransformStore store = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "transformers");
|
||||||
|
LaunchPluginHandler pluginHandler = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "pluginHandler");
|
||||||
|
TransformerAuditTrail trail = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "auditTrail");
|
||||||
|
classTransformerField.set(loader, new ModernFixCachingClassTransformer(store, pluginHandler, (TransformingClassLoader)loader, trail));
|
||||||
|
}
|
||||||
|
Field resourceFinderField = TransformingClassLoader.class.getDeclaredField("resourceFinder");
|
||||||
|
/* Construct a new list of resource finders, using similar logic to ML */
|
||||||
|
resourceFinderField.setAccessible(true);
|
||||||
|
Function<String, Enumeration<URL>> resourceFinder = constructResourceFinder();
|
||||||
|
resourceFinderField.set(loader, resourceFinder);
|
||||||
|
} catch(ReflectiveOperationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Function<String, Enumeration<URL>> constructResourceFinder() throws ReflectiveOperationException {
|
||||||
|
Field servicesHandlerField = Launcher.class.getDeclaredField("transformationServicesHandler");
|
||||||
|
servicesHandlerField.setAccessible(true);
|
||||||
|
Object servicesHandler = servicesHandlerField.get(Launcher.INSTANCE);
|
||||||
|
Field serviceLookupField = servicesHandler.getClass().getDeclaredField("serviceLookup");
|
||||||
|
serviceLookupField.setAccessible(true);
|
||||||
|
Map<String, TransformationServiceDecorator> serviceLookup = (Map<String, TransformationServiceDecorator>)serviceLookupField.get(servicesHandler);
|
||||||
|
Method getClassLoaderMethod = TransformationServiceDecorator.class.getDeclaredMethod("getClassLoader");
|
||||||
|
getClassLoaderMethod.setAccessible(true);
|
||||||
|
Function<String, Enumeration<URL>> resourceEnumeratorLocator = ModernFixResourceFinder::findAllURLsForResource;
|
||||||
|
for(TransformationServiceDecorator decorator : serviceLookup.values()) {
|
||||||
|
Function<String, Optional<URL>> func = (Function<String, Optional<URL>>)getClassLoaderMethod.invoke(decorator);
|
||||||
|
if(func != null)
|
||||||
|
resourceEnumeratorLocator = EnumerationHelper.mergeFunctors(resourceEnumeratorLocator, EnumerationHelper.fromOptional(func));
|
||||||
|
}
|
||||||
|
System.out.println(EnumerationHelper.firstElementOrNull(resourceEnumeratorLocator.apply("net.minecraft.client.Minecraft")));
|
||||||
|
return resourceEnumeratorLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final EnumSet<Phase> NEVER = EnumSet.noneOf(Phase.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EnumSet<Phase> handlesClass(Type classType, boolean isEmpty) {
|
||||||
|
return NEVER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1 +1 @@
|
||||||
org.embeddedt.modernfix.service.CachingTransformerService
|
org.embeddedt.modernfix.service.ModernFixLaunchService
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user