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 core-libs-dev
mailing list