[Nestmates] 8186763: Nestmate update for lazy validation and virtual invocation
David Holmes
david.holmes at oracle.com
Sun Aug 27 21:16:34 UTC 2017
Bug: https://bugs.openjdk.java.net/browse/JDK-8186763
webrev: http://cr.openjdk.java.net/~dholmes/8186763/webrev/
These are changes I plan to push as soon as my Committer status is
confirmed. Details below.
Please note the nestmates prototype is still in a very early form and
only the actual nestmate tests are known to pass with direct nestmate
invocations enabled. Many other tests will pass with no problem, but
there are still issues to resolve in places (CDS) - and we're not quite
ready to try and build the JDK with direct nestmate invocations enabled.
The nestmate jtreg tests force use of nestmate accesses using
-XDdisablePrivateAccessors on the @run line. To run other tests with
direct nestmate invocations add this to the jtreg command-line:
-javacoption:-XDdisablePrivateAccessors
At present the default mode for javac still issues invokespecial. To
force invokevirtual instead add this to the jtreg command-line:
-javacoption:-XDvirtualizePrivateAccess
Thanks,
David
-----
From discussions at and after JVMLS, three changes were proposed for
nestmates:
1. Use invokevirtual for private instance method invocations instead of
having to make complicated changed to invokespecial.
2. Use invokeinterface for private interface method invocations, instead
of invokespecial
3. Perform lazy validation of nest membership, including resolution of
the nest-host, only when a nestmate access check has to be performed.
This update handles items #1 and #3. Those issues are also related in
that use of invokespecial would trigger nestmate access checks during
verification, whereas use of invokevirtual does not and so with
invokevirtual nest membership validation is as late as possible.
--
Details of changes:
src/share/vm/classfile/stackMapFrame.hpp
Remove the previously introduced, but not needed, peek_stack API
src/share/vm/interpreter/linkResolver.cpp
Ensure virtual invocation doesn't find a private superclass method if
the target method has been removed.
Clean out old experimental code.
Revert the comments re invokespecial usage
src/share/vm/oops/instanceKlass.cpp
src/share/vm/oops/instanceKlass.hpp
Inline the validate_nest_top logic into nest_top so that validation and
resolution occur when nest_top() is first called - ie when a nestmate
access check is needed.
Remove the previous call to do validation at link-time.
test/compiler/jvmci/events/JvmciNotifyBootstrapFinishedEventTest.java
test/compiler/jvmci/events/JvmciNotifyInstallEventTest.java
test/compiler/jvmci/events/JvmciShutdownEventTest.java
Undo previous changes that are no longer needed with lazy nestmate
validation.
test/runtime/Nestmates/membership/ArrayNestTop.jcod
test/runtime/Nestmates/membership/MissingNestTop.jcod
test/runtime/Nestmates/membership/NotAMember.jcod
test/runtime/Nestmates/membership/NotAMember2.jcod
test/runtime/Nestmates/membership/TestNestmateMembership.java
A test/runtime/Nestmates/membership/NotAMember2.java
A test/runtime/Nestmates/membership/PackagedNestTop.java
A test/runtime/Nestmates/membership/PackagedNestTop.jcod
A test/runtime/Nestmates/membership/PackagedNestTop2.java
A test/runtime/Nestmates/membership/PackagedNestTop2Member.jcod
R test/runtime/Nestmates/membership/NestTop.jcod
R test/runtime/Nestmates/membership/NestTop_NestMember.jcod
Rework the nestmate membership tests as they now need to attempt actual
nestmate invocations to trigger the validation.
test/runtime/Nestmates/privateMethods/ExternalSub.jcod
test/runtime/Nestmates/privateMethods/ExternalSuper.jcod
test/runtime/Nestmates/privateMethods/MissingMethod.jcod
test/runtime/Nestmates/privateMethods/MissingMethodWithSuper.jcod
test/runtime/Nestmates/privateMethods/MissingNestTop.jcod
A test/runtime/Nestmates/privateMethods/TestInvoke.java
A test/runtime/Nestmates/privateMethods/TestInvokeErrors.java
A test/runtime/Nestmates/privateMethods/TestInvokeHierarchy.java
R test/runtime/Nestmates/privateMethods/TestInvokeSpecial.java
R test/runtime/Nestmates/privateMethods/TestInvokeSpecialErrors.java
R test/runtime/Nestmates/privateMethods/TestInvokeSpecialHierarchy.java
Rename all the InvokeSpecial tests/classes/comments to just Invoke - the
tests are not dependent on, nor necessarily utilise InvokeSpecial.
(Modulo the one case where verification will fail if using invokespecial.)
A test/runtime/Nestmates/privateConstructors/ExternalSub.jcod
A test/runtime/Nestmates/privateConstructors/ExternalSuper.jcod
A test/runtime/Nestmates/privateConstructors/TestConstructorHierarchy.java
Add some private constructor tests to mimic those for private methods -
where applicable.
More information about the valhalla-dev
mailing list