> 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 with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 12 additional commits since the last revision: - Update Javadoc, and rename asExact and asGeneric to withInvokeExactBehaviour and withInvokeBehaviour - Merge branch 'master' into Exact_VarHandle - Use AccessType ordinal in guard checks instead of the AccessMode ordinal - Update accessModeType to use the AccessType ordinal directly. - Add benchmarks - - Update javadoc - Make isExact() public - Fixes failing tests, and enable verifier on Exact test - Fix whitespace - Comment out VarHandleGuards generator code - Makes exactness a property of a VarHandle, not a VarForm, since the latter are shared. Use handle.accessModeType to get the exact type of the VarHandle. - ... and 2 more: https://git.openjdk.java.net/jdk/compare/f9c76729...3c707bc7 ------------- Changes: - all: https://git.openjdk.java.net/jdk/pull/843/files - new: https://git.openjdk.java.net/jdk/pull/843/files/8e5fb451..3c707bc7 Webrevs: - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=843&range=08 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=843&range=07-08 Stats: 14492 lines in 455 files changed: 8478 ins; 4347 del; 1667 mod Patch: https://git.openjdk.java.net/jdk/pull/843.diff Fetch: git fetch https://git.openjdk.java.net/jdk pull/843/head:pull/843 PR: https://git.openjdk.java.net/jdk/pull/843