< prev index next >
src/java.base/share/classes/java/lang/invoke/AbstractValidatingLambdaMetafactory.java
Print this page
@@ -141,12 +141,20 @@
this.implIsInstanceMethod = true;
break;
case REF_invokeSpecial:
// JDK-8172817: should use referenced class here, but we don't know what it was
this.implClass = implInfo.getDeclaringClass();
- this.implKind = REF_invokeSpecial;
this.implIsInstanceMethod = true;
+
+ // invokespecial should only be used to invoke private nestmate constructors.
+ // For private nestmate instance methods, it should use invokevirtual or
+ // invokeinterface; otherwise, the generated class may fail verification.
+ if (targetClass.isNestmateOf(implClass) && !implInfo.getName().equals("<init>")) {
+ this.implKind = implClass.isInterface() ? REF_invokeInterface : REF_invokeVirtual;
+ } else {
+ this.implKind = REF_invokeSpecial;
+ }
break;
case REF_invokeStatic:
case REF_newInvokeSpecial:
// JDK-8172817: should use referenced class here for invokestatic, but we don't know what it was
this.implClass = implInfo.getDeclaringClass();
< prev index next >