Update remapper for VarHandle and defineHiddenClass
This commit is contained in:
parent
3ed1ef0624
commit
51a9d2a79c
|
@ -79,6 +79,9 @@ public class ArclightRedirectAdapter implements PluginTransformer {
|
|||
modify(MethodHandles.Lookup.class, "findSetter", "lookupFindSetter", Class.class, String.class, Class.class);
|
||||
modify(MethodHandles.Lookup.class, "findStaticGetter", "lookupFindStaticGetter", Class.class, String.class, Class.class);
|
||||
modify(MethodHandles.Lookup.class, "findStaticSetter", "lookupFindStaticSetter", Class.class, String.class, Class.class);
|
||||
redirect(MethodHandles.Lookup.class, "findClass", "lookupFindClass", String.class);
|
||||
modify(MethodHandles.Lookup.class, "findVarHandle", "lookupFindVarHandle", Class.class, String.class, Class.class);
|
||||
modify(MethodHandles.Lookup.class, "findStaticVarHandle", "lookupFindStaticVarHandle", Class.class, String.class, Class.class);
|
||||
modify(ClassLoader.class, "loadClass", "classLoaderLoadClass", String.class);
|
||||
redirect(Class.class, "getResource", "classGetResource", String.class);
|
||||
redirect(Class.class, "getResourceAsStream", "classGetResourceAsStream", String.class);
|
||||
|
@ -96,6 +99,8 @@ public class ArclightRedirectAdapter implements PluginTransformer {
|
|||
modify(classOf("jdk.internal.misc.Unsafe"), "defineClass", "unsafeDefineClass", String.class, byte[].class, int.class, int.class, ClassLoader.class, ProtectionDomain.class);
|
||||
modify(classOf("jdk.internal.misc.Unsafe"), "defineClass0", "unsafeDefineClass", String.class, byte[].class, int.class, int.class, ClassLoader.class, ProtectionDomain.class);
|
||||
modify(MethodHandles.Lookup.class, "defineClass", "lookupDefineClass", byte[].class);
|
||||
modify(MethodHandles.Lookup.class, "defineHiddenClass", "lookupDefineHiddenClass", byte[].class, boolean.class, MethodHandles.Lookup.ClassOption[].class);
|
||||
modify(MethodHandles.Lookup.class, "defineHiddenClassWithClassData", "lookupDefineHiddenClassWithClassData", byte[].class, Object.class, boolean.class, MethodHandles.Lookup.ClassOption[].class);
|
||||
redirect(java.lang.reflect.Type.class, "getTypeName", "typeGetName");
|
||||
}
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ import java.io.InputStream;
|
|||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.lang.invoke.VarHandle;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.GenericArrayType;
|
||||
import java.lang.reflect.Method;
|
||||
|
@ -397,6 +398,33 @@ public class ArclightReflectionHandler extends ClassLoader {
|
|||
return lookup.findStaticSetter(cl, field, type);
|
||||
}
|
||||
|
||||
// bukkit -> srg
|
||||
public static Class<?> redirectLookupFindClass(MethodHandles.Lookup lookup, String name) throws ClassNotFoundException {
|
||||
return redirectClassForName(name, false, lookup.lookupClass().getClassLoader());
|
||||
}
|
||||
|
||||
// bukkit -> srg
|
||||
public static Object[] handleLookupFindVarHandle(MethodHandles.Lookup lookup, Class<?> cl, String name, Class<?> type) {
|
||||
return handleLookupFindGetter(lookup, cl, name, type);
|
||||
}
|
||||
|
||||
// bukkit -> srg
|
||||
public static VarHandle redirectLookupFindVarHandle(MethodHandles.Lookup lookup, Class<?> cl, String name, Class<?> type) throws NoSuchFieldException, IllegalAccessException {
|
||||
String field = remapper.tryMapFieldToSrg(cl, name);
|
||||
return lookup.findVarHandle(cl, field, type);
|
||||
}
|
||||
|
||||
// bukkit -> srg
|
||||
public static Object[] handleLookupFindStaticVarHandle(MethodHandles.Lookup lookup, Class<?> cl, String name, Class<?> type) {
|
||||
return handleLookupFindGetter(lookup, cl, name, type);
|
||||
}
|
||||
|
||||
// bukkit -> srg
|
||||
public static VarHandle redirectLookupFindStaticVarHandle(MethodHandles.Lookup lookup, Class<?> cl, String name, Class<?> type) throws NoSuchFieldException, IllegalAccessException {
|
||||
String field = remapper.tryMapFieldToSrg(cl, name);
|
||||
return lookup.findStaticVarHandle(cl, field, type);
|
||||
}
|
||||
|
||||
public static Object[] handleClassLoaderLoadClass(ClassLoader loader, String binaryName) {
|
||||
return new Object[]{loader, remapper.mapType(binaryName.replace('.', '/')).replace('/', '.')};
|
||||
}
|
||||
|
@ -595,6 +623,25 @@ public class ArclightReflectionHandler extends ClassLoader {
|
|||
return (Class<?>) mh.invokeExact(lookup, transform);
|
||||
}
|
||||
|
||||
public static Object[] handleLookupDefineHiddenClass(MethodHandles.Lookup lookup, byte[] bytes, boolean initialize, MethodHandles.Lookup.ClassOption[] options) {
|
||||
return new Object[]{lookup, transformOrAdd(lookup.lookupClass().getClassLoader(), bytes), initialize, options};
|
||||
}
|
||||
|
||||
public static MethodHandles.Lookup redirectLookupDefineHiddenClass(MethodHandles.Lookup lookup, byte[] bytes, boolean initialize, MethodHandles.Lookup.ClassOption[] options) throws IllegalAccessException {
|
||||
byte[] transform = transformOrAdd(lookup.lookupClass().getClassLoader(), bytes);
|
||||
return lookup.defineHiddenClass(transform, initialize, options);
|
||||
}
|
||||
|
||||
public static Object[] handleLookupDefineHiddenClassWithClassData(MethodHandles.Lookup lookup, byte[] bytes, Object classData, boolean initialize, MethodHandles.Lookup.ClassOption[] options) {
|
||||
byte[] transform = transformOrAdd(lookup.lookupClass().getClassLoader(), bytes);
|
||||
return new Object[]{lookup, transform, classData, initialize, options};
|
||||
}
|
||||
|
||||
public static MethodHandles.Lookup redirectLookupDefineHiddenClassWithClassData(MethodHandles.Lookup lookup, byte[] bytes, Object classData, boolean initialize, MethodHandles.Lookup.ClassOption[] options) throws IllegalAccessException {
|
||||
byte[] transform = transformOrAdd(lookup.lookupClass().getClassLoader(), bytes);
|
||||
return lookup.defineHiddenClassWithClassData(transform, classData, initialize, options);
|
||||
}
|
||||
|
||||
public static byte[] transformOrAdd(ClassLoader loader, byte[] bytes) {
|
||||
RemappingClassLoader rcl = null;
|
||||
while (loader != null) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user