< prev index next >

jdk/src/java.base/share/classes/jdk/experimental/value/MethodHandleBuilder.java

Print this page
rev 14083 : vwithfield class/field access

*** 56,66 **** public static MethodHandle loadCode(Lookup lookup, String name, MethodType type, Consumer<? super TypedCodeBuilder<Class<?>, String, byte[], ?>> builder) { return loadCode(lookup, name, type.toMethodDescriptorString(), builder); } public static MethodHandle loadCode(Lookup lookup, String name, String type, Consumer<? super TypedCodeBuilder<Class<?>, String, byte[], ?>> builder) { ! IsolatedMethodBuilder isolatedMethodBuilder = new IsolatedMethodBuilder(); isolatedMethodBuilder .withSuperclass(Object.class) .withMajorVersion(52) .withMinorVersion(0) .withFlags(Flag.ACC_PUBLIC) --- 56,66 ---- public static MethodHandle loadCode(Lookup lookup, String name, MethodType type, Consumer<? super TypedCodeBuilder<Class<?>, String, byte[], ?>> builder) { return loadCode(lookup, name, type.toMethodDescriptorString(), builder); } public static MethodHandle loadCode(Lookup lookup, String name, String type, Consumer<? super TypedCodeBuilder<Class<?>, String, byte[], ?>> builder) { ! IsolatedMethodBuilder isolatedMethodBuilder = new IsolatedMethodBuilder(lookup.lookupClass()); isolatedMethodBuilder .withSuperclass(Object.class) .withMajorVersion(52) .withMinorVersion(0) .withFlags(Flag.ACC_PUBLIC)
*** 81,93 **** } } static class IsolatedMethodBuilder extends ClassBuilder<Class<?>, String, IsolatedMethodBuilder> { ! IsolatedMethodBuilder() { super(new IsolatedMethodPoolHelper(), new IsolatedMethodTypeHelper()); ! withThisClass(new Object() { }.getClass()); } static class IsolatedMethodTypeHelper implements TypeHelper<Class<?>, String> { BasicTypeHelper basicTypeHelper = new BasicTypeHelper(); --- 81,93 ---- } } static class IsolatedMethodBuilder extends ClassBuilder<Class<?>, String, IsolatedMethodBuilder> { ! IsolatedMethodBuilder(Class<?> thisClass) { super(new IsolatedMethodPoolHelper(), new IsolatedMethodTypeHelper()); ! withThisClass(thisClass); } static class IsolatedMethodTypeHelper implements TypeHelper<Class<?>, String> { BasicTypeHelper basicTypeHelper = new BasicTypeHelper();
*** 158,170 **** } } static class IsolatedMethodPoolHelper implements PoolHelper<Class<?>, String, byte[]> { BasicPoolHelper basicPoolHelper = new BasicPoolHelper(); String from(Class<?> c) { ! return c.getName().replaceAll("\\.", "/"); } @Override public int putClass(Class<?> symbol) { return basicPoolHelper.putClass(from(symbol)); --- 158,179 ---- } } static class IsolatedMethodPoolHelper implements PoolHelper<Class<?>, String, byte[]> { BasicPoolHelper basicPoolHelper = new BasicPoolHelper(); + boolean randomizeClassNames = false; + + void enableRandomizeClassNames() { + randomizeClassNames = true; + } String from(Class<?> c) { ! String s = c.getName().replaceAll("\\.", "/"); ! if (randomizeClassNames) { ! s += "_" + java.util.UUID.randomUUID().toString(); ! } ! return s; } @Override public int putClass(Class<?> symbol) { return basicPoolHelper.putClass(from(symbol));
*** 221,230 **** --- 230,245 ---- } } @Override public byte[] build() { + /** + * Randomize "thisClass" name, it's anonymous so any references to the lookupClass + * were meant for lookupClass, not "this". This class name will be rewritten via + * defineAnonymousClass, and we don't want existing CP references to be broken. + */ + ((IsolatedMethodPoolHelper)poolHelper).enableRandomizeClassNames(); return super.build(); } } private static ProxyClassesDumper dumper() {
< prev index next >