On Tue, 8 Jun 2021 02:23:09 GMT, liach <[email protected]> 
wrote:

>> Dan Smith has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   Clean up validation of implKind REF_invokeSpecial
>
> 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.)

-------------

PR: https://git.openjdk.java.net/jdk/pull/4403

Reply via email to