RFR: 8232613: Move Object.registerNatives into HotSpot
David Holmes
david.holmes at oracle.com
Tue Oct 22 13:55:59 UTC 2019
On 22/10/2019 11:41 pm, Claes Redestad wrote:
> Hi Lois,
>
> to make sure noone misses it, here's the new webrev:
> http://cr.openjdk.java.net/~redestad/8232613/open.03
I like the code placement in this version - Coleen's suggestion was
better than mine :)
> Comments inline..
Comments inline ...
> On 2019-10-22 14:33, Lois Foltan wrote:
>> On 10/22/2019 7:13 AM, Claes Redestad wrote:
>>>
>>>
>>> On 2019-10-22 13:05, Andrew Dinn wrote:
>>>> On 22/10/2019 12:05, Claes Redestad wrote:
>>>>> On 2019-10-22 12:44, Andrew Dinn wrote:
>>>>>> Why not leave it void?
>>>>>
>>>>> I guess:
>>>>>
>>>>> http://cr.openjdk.java.net/~redestad/8232613/open.02/
>>>> Ship it ;-)
>>>
>>> No wait, I missed the use in jni.cpp where the bool return is actually
>>> used. I ignored it in systemDict since when I got an exception there
>>> (by misspelling a name or using the wrong signature) the exception
>>> bubbles up and crashes the VM.
>>>
>>> Perhaps this could be reworked to remove the bool cleanly, but let's
>>> go back to open.01 and move that cleanup to a follow-up.
>>>
>>> /Claes
>>>
>> Hi Claes,
>>
>> I do have a concern that this will be a behavioral change for method
>> resolution if Object::registerNatives is removed. For example,
Good catch Lois!
>>
>> public class RegisterNatives {
>> interface I { default public void registerNatives() {
>> System.out.println("I"); } }
>> static class A implements I { }
>> public static void main(String... args) {
>> A varA = new A();
>> varA.registerNatives();
>> }
>>
>> Currently class A finds registerNatives in its superclass Object and
>> the test receives the following:
>>
>> Exception in thread "main" java.lang.IllegalAccessError: class
>> RegisterNatives tried to access private method 'void
>> java.lang.Object.registerNatives()' (RegisterNatives is in unnamed
>> module of loader 'app'; java.lang.Object is in module java.base of
>> loader 'bootstrap')
>> at RegisterNatives.main(RegisterNatives.java:6)
>>
>> With your change interface I's registerNatives default method is
>> invoked successfully. I don't think this is a major backward
>> compatibilty issue but we should have someone from core-libs okay the
>> removal of the method from Object before committing. In addition, can
>> you add this test as part of your change? I think it would be okay to
>> put it in open/test/hotspot/jtreg/runtime/8024804 which contains an
>> existing registerNatives test.
>
> Yeah, *not* throwing an IAE on this feels like an unintentional bug fix.
> :-)
Yes it is a somewhat surprising aspect of default method resolution, but
methods in the class hierarchy must be considered ahead of any default
method - even inaccessible ones.
> We're relaxing a very subtle interaction, so I think compatibility
> issues with existing code is non-existing.
I don't think there is a compatibility issue here because we don't in
general have to maintain error compatibility. However as it is a change
in behaviour it does warrant a CSR request just so the compatibility
argument is captured/recorded.
> What could be an issue is
> that someone might implement this pattern and then see it no longer
> working on older versions of the OpenJDK.
Unfortunate, but not a compatibility scenario we have to support.
Cheers,
David
-----
> However, that's already a possible scenario since the sample already
> runs fine on some other non-OpenJDK JCK-compliant java implementations.
> Thus I think this compatibility observation just adds an argument _in
> favor_ of this RFE.
>
> I've updated the test you pointed me to to include your test scenario.
>
> Thanks!
>
> /Claes
>
>>
>> Otherwise I think .01 from the Hotspot side looks good. Only one
>> minor comment:
>> method.cpp
>> - line #426 and 427: Since you are in this code can your change to
>> resourceMark(THREAD)?
>>
>> Thanks,
>> Lois
>>
>>
>>
>>
More information about the core-libs-dev
mailing list