47 import java.util.*; 48 import java.util.function.Consumer; 49 import java.util.function.Function; 50 51 /** 52 * Utility class for building method handles. 53 */ 54 public class MethodHandleBuilder { 55 56 static final Unsafe UNSAFE = Unsafe.getUnsafe(); 57 58 public static final boolean ENABLE_POOL_PATCHES; 59 60 static { 61 Properties props = GetPropertyAction.privilegedGetProperties(); 62 ENABLE_POOL_PATCHES = Boolean.parseBoolean( 63 props.getProperty("valhalla.enablePoolPatches")); 64 } 65 66 public static MethodHandle loadCode(Lookup lookup, String name, MethodType type, Consumer<? super MethodHandleCodeBuilder<?>> builder) { 67 return loadCode(lookup, name, type.toMethodDescriptorString(), builder); 68 } 69 70 public static MethodHandle loadCode(Lookup lookup, String name, String type, Consumer<? super MethodHandleCodeBuilder<?>> builder) { 71 return loadCode(lookup, name, name, type, MethodHandleCodeBuilder::new, 72 clazz -> { 73 try { 74 return lookup.findStatic(clazz, name, MethodType.fromMethodDescriptorString(type, lookup.lookupClass().getClassLoader())); 75 } catch (ReflectiveOperationException ex) { 76 throw new IllegalStateException(ex); 77 } 78 }, 79 builder); 80 } 81 82 protected static <Z, C extends CodeBuilder<Class<?>, String, byte[], ?>> Z loadCode( 83 Lookup lookup, String className, String methodName, String type, 84 Function<MethodBuilder<Class<?>, String, byte[]>, ? extends C> builderFunc, 85 Function<Class<?>, Z> resFunc, Consumer<? super C> builder) { 86 87 IsolatedMethodBuilder isolatedMethodBuilder = new IsolatedMethodBuilder(className, lookup); 88 isolatedMethodBuilder 89 .withSuperclass(Object.class) 90 .withMajorVersion(52) 91 .withMinorVersion(0) 92 .withFlags(Flag.ACC_PUBLIC) 93 .withMethod(methodName, type, M -> 94 M.withFlags(Flag.ACC_STATIC, Flag.ACC_PUBLIC) | 47 import java.util.*; 48 import java.util.function.Consumer; 49 import java.util.function.Function; 50 51 /** 52 * Utility class for building method handles. 53 */ 54 public class MethodHandleBuilder { 55 56 static final Unsafe UNSAFE = Unsafe.getUnsafe(); 57 58 public static final boolean ENABLE_POOL_PATCHES; 59 60 static { 61 Properties props = GetPropertyAction.privilegedGetProperties(); 62 ENABLE_POOL_PATCHES = Boolean.parseBoolean( 63 props.getProperty("valhalla.enablePoolPatches")); 64 } 65 66 public static MethodHandle loadCode(Lookup lookup, String name, MethodType type, Consumer<? super MethodHandleCodeBuilder<?>> builder) { 67 return loadCode(lookup, name, name, type, builder); 68 } 69 70 public static MethodHandle loadCode(Lookup lookup, String className, String methodName, MethodType type, Consumer<? super MethodHandleCodeBuilder<?>> builder) { 71 String descriptor = type.toMethodDescriptorString(); 72 return loadCode(lookup, className, methodName, descriptor, MethodHandleCodeBuilder::new, 73 clazz -> { 74 try { 75 return lookup.findStatic(clazz, methodName, MethodType.fromMethodDescriptorString(descriptor, lookup.lookupClass().getClassLoader())); 76 } catch (ReflectiveOperationException ex) { 77 throw new IllegalStateException(ex); 78 } 79 }, 80 builder); 81 } 82 83 protected static <Z, C extends CodeBuilder<Class<?>, String, byte[], ?>> Z loadCode( 84 Lookup lookup, String className, String methodName, String type, 85 Function<MethodBuilder<Class<?>, String, byte[]>, ? extends C> builderFunc, 86 Function<Class<?>, Z> resFunc, Consumer<? super C> builder) { 87 88 IsolatedMethodBuilder isolatedMethodBuilder = new IsolatedMethodBuilder(className, lookup); 89 isolatedMethodBuilder 90 .withSuperclass(Object.class) 91 .withMajorVersion(52) 92 .withMinorVersion(0) 93 .withFlags(Flag.ACC_PUBLIC) 94 .withMethod(methodName, type, M -> 95 M.withFlags(Flag.ACC_STATIC, Flag.ACC_PUBLIC) |