hg: jdk9/sandbox/jdk: VarHandle access mode methods now support invoke semantics, rather
paul.sandoz at oracle.com
paul.sandoz at oracle.com
Mon Jan 18 15:29:15 UTC 2016
Changeset: ed3755c58b9b
Author: psandoz
Date: 2016-01-18 15:20 +0100
URL: http://hg.openjdk.java.net/jdk9/sandbox/jdk/rev/ed3755c58b9b
VarHandle access mode methods now support invoke semantics, rather
than invokeExact semantics. Basically an equivalent of a MH.asType
transformation is performed. This enables VHs to be used in
reflective secarios, such as the Atomc*FieldUpdater classes, and
is more user-friendly with say null values or sub-types (no explicit
casting to the expected type is requied).
The exact invocation path, when the symbolic method type equals the
target method type, should remain as efficient as before.
In addition a new erased invocation path, when the erased
symbolic type descriptor is equal to the erased target type, should
be just as fast.
A slow invocation path occurs if boxing/conversion is required, or
the return value is dropped (the latter is unfortunate but seems
trickier to resolve).
The lookup to a VH access mode method using MH.lookup().findVirtual
will return a method handle that performs the equivalent of asType
transformations (see MHs.varHandleInvoker), thus matching byte code
equivalent behaviour for invokevirtual. All other MH-factory methods
for a VH access mode method require use of MH.invoke for the same
behaviour.
Split out tests to reduce potential time-outs.
! src/java.base/share/classes/java/lang/invoke/Invokers.java
! src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java
! src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java
! src/java.base/share/classes/java/lang/invoke/MethodHandles.java
! src/java.base/share/classes/java/lang/invoke/MethodType.java
! src/java.base/share/classes/java/lang/invoke/VarHandle.java
! src/java.base/share/classes/java/lang/invoke/VarHandleGuards.java
! src/java.base/share/classes/java/lang/invoke/VarHandles.java
! src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template
! src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template
! src/java.base/share/classes/java/nio/Buffer.java
! test/java/lang/invoke/VarHandles/VarHandleBaseTest.java
+ test/java/lang/invoke/VarHandles/VarHandleTestAccessBoolean.java
+ test/java/lang/invoke/VarHandles/VarHandleTestAccessByte.java
+ test/java/lang/invoke/VarHandles/VarHandleTestAccessChar.java
+ test/java/lang/invoke/VarHandles/VarHandleTestAccessDouble.java
+ test/java/lang/invoke/VarHandles/VarHandleTestAccessFloat.java
+ test/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java
+ test/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java
+ test/java/lang/invoke/VarHandles/VarHandleTestAccessShort.java
+ test/java/lang/invoke/VarHandles/VarHandleTestAccessString.java
- test/java/lang/invoke/VarHandles/VarHandleTestBoolean.java
- test/java/lang/invoke/VarHandles/VarHandleTestByte.java
! test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java
! test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java
! test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java
! test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java
! test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java
! test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java
- test/java/lang/invoke/VarHandles/VarHandleTestChar.java
- test/java/lang/invoke/VarHandles/VarHandleTestDouble.java
- test/java/lang/invoke/VarHandles/VarHandleTestFloat.java
- test/java/lang/invoke/VarHandles/VarHandleTestInt.java
- test/java/lang/invoke/VarHandles/VarHandleTestLong.java
+ test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessBoolean.java
+ test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessByte.java
+ test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessChar.java
+ test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessDouble.java
+ test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessFloat.java
+ test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessInt.java
+ test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessLong.java
+ test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessShort.java
+ test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessString.java
! test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeBoolean.java
! test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeByte.java
! test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeChar.java
! test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeDouble.java
! test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeFloat.java
! test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeInt.java
! test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeLong.java
! test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeShort.java
! test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeString.java
- test/java/lang/invoke/VarHandles/VarHandleTestShort.java
- test/java/lang/invoke/VarHandles/VarHandleTestString.java
- test/java/lang/invoke/VarHandles/X-VarHandleTest.java.template
+ test/java/lang/invoke/VarHandles/X-VarHandleTestAccess.java.template
! test/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template
+ test/java/lang/invoke/VarHandles/X-VarHandleTestMethodHandleAccess.java.template
! test/java/lang/invoke/VarHandles/X-VarHandleTestMethodType.java.template
! test/java/lang/invoke/VarHandles/generate-vh-tests.sh
More information about the jdk9-sandbox-changes
mailing list