From 51a9d2a79c47f15e1649e3b2fb08d73a509ff08f Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sun, 22 May 2022 15:31:08 +0800 Subject: [PATCH] Update remapper for VarHandle and defineHiddenClass --- .../remapper/ArclightRedirectAdapter.java | 5 ++ .../generated/ArclightReflectionHandler.java | 47 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRedirectAdapter.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRedirectAdapter.java index 44c469f5..bce20177 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRedirectAdapter.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRedirectAdapter.java @@ -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"); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/ArclightReflectionHandler.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/ArclightReflectionHandler.java index 9793edee..963c0ebc 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/ArclightReflectionHandler.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/ArclightReflectionHandler.java @@ -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) {