Update remapper for VarHandle and defineHiddenClass

This commit is contained in:
IzzelAliz 2022-05-22 15:31:08 +08:00
parent 3ed1ef0624
commit 51a9d2a79c
No known key found for this signature in database
GPG Key ID: EE50E123A11D8338
2 changed files with 52 additions and 0 deletions

View File

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

View File

@ -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) {