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