On Tue, 10 Nov 2020 15:02:08 GMT, Jorn Vernee <jver...@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

Reply via email to