< prev index next >
jdk/src/java.base/share/classes/jdk/experimental/value/MethodHandleBuilder.java
Print this page
rev 14083 : vwithfield class/field access
@@ -56,11 +56,11 @@
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 isolatedMethodBuilder = new IsolatedMethodBuilder(lookup.lookupClass());
isolatedMethodBuilder
.withSuperclass(Object.class)
.withMajorVersion(52)
.withMinorVersion(0)
.withFlags(Flag.ACC_PUBLIC)
@@ -81,13 +81,13 @@
}
}
static class IsolatedMethodBuilder extends ClassBuilder<Class<?>, String, IsolatedMethodBuilder> {
- IsolatedMethodBuilder() {
+ IsolatedMethodBuilder(Class<?> thisClass) {
super(new IsolatedMethodPoolHelper(), new IsolatedMethodTypeHelper());
- withThisClass(new Object() { }.getClass());
+ withThisClass(thisClass);
}
static class IsolatedMethodTypeHelper implements TypeHelper<Class<?>, String> {
BasicTypeHelper basicTypeHelper = new BasicTypeHelper();
@@ -158,13 +158,22 @@
}
}
static class IsolatedMethodPoolHelper implements PoolHelper<Class<?>, String, byte[]> {
BasicPoolHelper basicPoolHelper = new BasicPoolHelper();
+ boolean randomizeClassNames = false;
+
+ void enableRandomizeClassNames() {
+ randomizeClassNames = true;
+ }
String from(Class<?> c) {
- return c.getName().replaceAll("\\.", "/");
+ 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,10 +230,16 @@
}
}
@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 >