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