RFR: 8254354: Add a withInvokeExactBehavior() VarHandle combinator [v14]
Chris Hegarty
chegar at openjdk.java.net
Tue Nov 10 16:30:56 UTC 2020
On Tue, 10 Nov 2020 15:02:08 GMT, Jorn Vernee <jvernee at openjdk.org> wrote:
>> Hi,
>>
>> This patch adds an asExact() combinator to VarHandle, that will return a new VarHandle that performs exact type checks, similar to MethodHandle::invokeExact, to help developers catch inexact VarHandle usage, which can lead to performance degradation.
>>
>> This is implemented using a boolean flag in VarForm. If the flag is set, the exact type of the invocation is checked against the exact type in the VarForm. If there is a mismatch, a WrongMethodTypeException is thrown.
>>
>> Other than that, there is also an asGeneric() combinator added that does the inverse operation (thanks to Rémi for the suggestion). I've also added The `@Hidden` annotation to the VarHandleGuards methods, as well as a type-checking helper method called from the generic invocation lambda form, so that the stack trace we get points at the location where the VarHandle is being used.
>>
>> Thanks,
>> Jorn
>>
>> CSR link: https://bugs.openjdk.java.net/browse/JDK-8255375
>
> Jorn Vernee has updated the pull request incrementally with one additional commit since the last revision:
>
> Re-order javadoc
LGTM.
The test could be sprinkled with a number of assertions related to the invocation behaviour, a.k.a `hasInvokeExactBehavior`; either the newly specified default behaviour assertFalse(vh. hasInvokeExactBehavior()), or post switching to exact: assertTrue(vh. hasInvokeExactBehavior())
test/jdk/java/lang/invoke/VarHandles/VarHandleTestExact.java line 82:
> 80: throws NoSuchFieldException, IllegalAccessException {
> 81: if (ro) throw new SkipException("Can not test setter with read only field");
> 82: VarHandle vh = MethodHandles.lookup().findVarHandle(Widget.class, fieldBaseName + "_RW", fieldType);
Quite trivially we can assertFalse(vh. hasInvokeExactBehavior())
test/jdk/java/lang/invoke/VarHandles/VarHandleTestExact.java line 92:
> 90: }
> 91:
> 92: vh = vh.withInvokeExactBehavior();
Quite trivially we can assertTrue(vh. hasInvokeExactBehavior())
-------------
Marked as reviewed by chegar (Reviewer).
PR: https://git.openjdk.java.net/jdk/pull/843
More information about the core-libs-dev
mailing list