On Tue, 8 Jun 2021 15:17:44 GMT, Dan Smith <[email protected]> wrote:
>> src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java
>> line 191:
>>
>>> 189: useImplMethodHandle =
>>> (Modifier.isProtected(implInfo.getModifiers()) &&
>>> 190: !VerifyAccess.isSamePackage(implClass,
>>> implInfo.getDeclaringClass())) ||
>>> 191: implKind == H_INVOKESPECIAL;
>>
>> Won't this make regular private instance method calls use condy as well, as
>> they are invokespecial?
>
> See this code from the `AbstractValidatingLambdaMetafactory` constructor:
>
>
> case REF_invokeSpecial:
> // JDK-8172817: should use referenced class here, but we
> don't know what it was
> this.implClass = implInfo.getDeclaringClass();
> this.implIsInstanceMethod = true;
>
> // Classes compiled prior to dynamic nestmate support invokes
> a private instance
> // method with REF_invokeSpecial.
> //
> // invokespecial should only be used to invoke private
> nestmate constructors.
> // The lambda proxy class will be defined as a nestmate of
> targetClass.
> // If the method to be invoked is an instance method of
> targetClass, then
> // convert to use invokevirtual or invokeinterface.
> if (targetClass == implClass &&
> !implInfo.getName().equals("<init>")) {
> this.implKind = implClass.isInterface() ?
> REF_invokeInterface : REF_invokeVirtual;
> } else {
> this.implKind = REF_invokeSpecial;
> }
> break;
>
>
> We turn all same-class invocations into `invokevirtual`. (And all `<init>`
> invocations have kind `newInvokeSpecial`, mentioning them here is actually
> useless.)
Actually, I think I'll fix up this code and the comment...
-------------
PR: https://git.openjdk.java.net/jdk/pull/4403