RFR(S) 8153115: Move private interface check to linktime
Coleen Phillimore
coleen.phillimore at oracle.com
Tue Apr 5 19:59:38 UTC 2016
On 4/5/16 3:54 PM, Lois Foltan wrote:
>
> On 4/5/2016 1:56 PM, Igor Veresov wrote:
>>
>>> On Apr 5, 2016, at 10:44 AM, Igor Veresov <igor.veresov at oracle.com
>>> <mailto:igor.veresov at oracle.com>> wrote:
>>>
>>>>
>>>> On Apr 5, 2016, at 10:34 AM, Lois Foltan <lois.foltan at oracle.com
>>>> <mailto:lois.foltan at oracle.com>> wrote:
>>>>
>>>>
>>>> On 4/5/2016 12:50 PM, Igor Veresov wrote:
>>>>> Hi Lois,
>>>>>
>>>>> Thanks for looking at it. Yes, it passes all hotspot jtreg tests.
>>>>>
>>>>> igor
>>>> Hi Igor,
>>>>
>>>> Thanks for waiting on this. A couple of comments:
>>>>
>>>> - Section 6.5 Instructions for invokeinterface does indicate that a
>>>> "Linking Exceptions" the VM can throw an ICCE if the resolved
>>>> method is static or private. So I think moving this exception from
>>>> runtime to linktime is okay.
>>>>
>>>> - I'm concerned about the change on line #998, #1030, #1316. I
>>>> don't think you are necessarily guaranteed to have the bytecodes
>>>> that you are now passing to resolve_interface_method. For example,
>>>> line #998 within linktime_resolve_static_method, you may not have
>>>> an invokestatic here, you may have another invoke* bytecode trying
>>>> to invoke a static interface method. Passing in
>>>> Bytecodes::_invokestatic seems wrong, because even if the resolved
>>>> method is static, "nostatics" was set to false.
>>>>
>>>
>>> I looked at the call graphs of these guys and
>>> linktime_resolve_X_method() methods actually seem to only called
>>> within invokeX contexts. But may be I missed something. Can you give
>>> an example of a path that may cause, say,
>>> linktime_resolve_static_method() be invoked for non-invokestatic
>>> instruction?
>>
>> Actually, the easier way to think about it, would be: The answer
>> returned by resolve_interface_method() is result of a method
>> resolution in the interface class “as if” it were invoked by the
>> given bytecode instruction. It of course doesn’t not mean that the
>> invocation is really a result of the said instruction. The context
>> is. As you may see the logic around “nostatic” did not change and the
>> logic around resolve_interface_method() being called within the
>> invokeinterface context is what we want it to be.
>>
>> The same effect could have been achieved by adding another bool
>> argument to resolve_interface_method() to indicate a question within
>> the invokeinterface context. But passing a bytecode makes it an
>> easier to read code.
>
> Okay, I saw Tom's reply as well to my comments and I reviewed all the
> call paths. I think the change is okay. I kind of wish that the
> original bytecode was stored in the LinkInfo structure so that we
> could just reference the actual bytecode used and make decisions based
> on that instead of the parameter approach, but that maybe a RFE to
> investigate later.
There's a change coming that does store the original bytecode for bug
https://bugs.openjdk.java.net/browse/JDK-8145148
Just waiting for some test changes.
Coleen
> Lois
>
>>
>> igor
>>
>>>
>>>> Just curious did you also run the testbase default methods tests?
>>>
>>> Yes, within the context of a closed project. That’s actually what
>>> made these changes necessary.
>>>
>>> igor
>>>
>>>> Lois
>>>>
>>>>>
>>>>>> On Apr 5, 2016, at 9:30 AM, Lois Foltan <lois.foltan at oracle.com
>>>>>> <mailto:lois.foltan at oracle.com>> wrote:
>>>>>>
>>>>>> Hi Igor,
>>>>>>
>>>>>> I know you have two reviews for this but could you hold off
>>>>>> committing until I or Karen Kinnear have a chance to review. We
>>>>>> both worked in this area a lot to support default methods in JDK
>>>>>> 8. Also, have you run the
>>>>>> hotspot/test/runtime/SelectionResolution tests on this?
>>>>>>
>>>>>> Thanks,
>>>>>> Lois
>>>>>>
>>>>>> On 4/1/2016 2:28 PM, Igor Veresov wrote:
>>>>>>> When invoking private interface methods with invokeinterface we
>>>>>>> throw ICCE. The check for that happens in the runtime part of
>>>>>>> the resolution, however, doing it at linktime seems like a
>>>>>>> better place, since the check doesn't depend on the receiver
>>>>>>> type. It also allows compiler interfaces that rely on linktime
>>>>>>> resolution to detect inconsistencies during parsing (see
>>>>>>> ciEnv::lookup_method() (CI) and ConstantPool.lookupMethod()
>>>>>>> (JVMCI) that are affected).
>>>>>>>
>>>>>>> JBS: https://bugs.openjdk.java.net/browse/JDK-8153115
>>>>>>> Webrev: http://cr.openjdk.java.net/~iveresov/8153115/webrev.00/
>>>>>>> <http://cr.openjdk.java.net/%7Eiveresov/8153115/webrev.00/>
>>>>>>>
>>>>>>> Thanks,
>>>>>>> igor
>>
>
More information about the hotspot-runtime-dev
mailing list