> De: "mandy chung" <mandy.ch...@oracle.com> > À: "Remi Forax" <fo...@univ-mlv.fr> > Cc: "valhalla-dev" <valhalla-...@openjdk.java.net>, "core-libs-dev" > <core-libs-...@openjdk.java.net>, "serviceability-dev" > <serviceability-dev@openjdk.java.net>, "hotspot-dev" > <hotspot-...@openjdk.java.net> > Envoyé: Vendredi 27 Mars 2020 16:50:55 > Objet: Re: Review Request: 8238358: Implementation of JEP 371: Hidden Classes
> 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, Looks good. Rémi > 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(),