Review Request: 8238358: Implementation of JEP 371: Hidden Classes

Mandy Chung mandy.chung at oracle.com
Fri Mar 27 15:50:55 UTC 2020


On 3/27/20 5:00 AM, Remi Forax wrote:
> Hi Mandy,
> in ReflectionFactory, why in the case of a constructor the check to the anonymous class is removed ?

Good catch.  Fixed
>
> in BytecodeGenerator, the comment "// bootstrapping issue if using condy"
> can be promoted on top of clinit, because i ask myself the same question seeing a static block was generated

OK, that's clearer.
>
> in AbstractValidatingLambdaMetafactory.java, the field caller is not used after all ?

Thanks.  Removed.  It was left behind from an early prototype.

Below is the patch.  I will send out a new webrev and delta webrev in 
the next revision.

thanks
Mandy

diff --git 
a/src/java.base/share/classes/java/lang/invoke/AbstractValidatingLambdaMetafactory.java 
b/src/java.base/share/classes/java/lang/invoke/AbstractValidatingLambdaMetafactory.java
--- 
a/src/java.base/share/classes/java/lang/invoke/AbstractValidatingLambdaMetafactory.java
+++ 
b/src/java.base/share/classes/java/lang/invoke/AbstractValidatingLambdaMetafactory.java
@@ -51,7 +51,6 @@
       *         System.out.printf(">>> %s\n", iii.foo(44));
       * }}
       */
-    final MethodHandles.Lookup caller;
      final Class<?> targetClass;               // The class calling the 
meta-factory via invokedynamic "class X"
      final MethodType invokedType;             // The type of the 
invoked method "(CC)II"
      final Class<?> samBase;                   // The type of the 
returned instance "interface JJ"
@@ -121,7 +120,6 @@
                      "Invalid caller: %s",
                      caller.lookupClass().getName()));
          }
-        this.caller = caller;
          this.targetClass = caller.lookupClass();
          this.invokedType = invokedType;

diff --git 
a/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java 
b/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java
--- 
a/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java
+++ 
b/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java
@@ -363,6 +363,10 @@
          clinit(cw, className(), classData);
      }

+    /*
+     * <clinit> to initialize the static final fields with the live 
class data
+     * LambdaForms can't use condy due to bootstrapping issue.
+     */
      static void clinit(ClassWriter cw, String className, 
List<ClassData> classData) {
          if (classData.isEmpty())
              return;
@@ -375,7 +379,6 @@

          MethodVisitor mv = cw.visitMethod(Opcodes.ACC_STATIC, 
"<clinit>", "()V", null, null);
          mv.visitCode();
-        // bootstrapping issue if using condy
          mv.visitLdcInsn(Type.getType("L" + className + ";"));
          mv.visitMethodInsn(Opcodes.INVOKESTATIC, 
"java/lang/invoke/MethodHandleNatives",
                             "classData", 
"(Ljava/lang/Class;)Ljava/lang/Object;", false);
diff --git 
a/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java 
b/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java
--- 
a/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java
+++ 
b/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java
@@ -245,7 +245,8 @@
              return new BootstrapConstructorAccessorImpl(c);
          }

-        if (noInflation && !c.getDeclaringClass().isHiddenClass()) {
+        if (noInflation && !c.getDeclaringClass().isHiddenClass()
+                && 
!ReflectUtil.isVMAnonymousClass(c.getDeclaringClass())) {
              return new MethodAccessorGenerator().
                  generateConstructor(c.getDeclaringClass(),
                                      c.getParameterTypes(),


More information about the valhalla-dev mailing list