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(),

Reply via email to