< 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 >