> On bytecode level booleans are represented as ints and HotSpot JVM normalizes > boolean values on memory accesses. It unconditionally applies normalization > on boolean stores, but trusts on-heap boolean locations to hold normalized > values. Normalization is applied on loads for off-heap and mismatched unsafe > accesses . > > There are 2 normalization procedures used: (1) cast int to byte and test it > against zero; and (2) truncation to least-significant bit. Truncation is > preferred (due to performance considerations), but JNI mandates testing > against zero and, historically, `#1` was used for off-heap unsafe accesses as > well. It complicated the implementation (leading to subtle bugs) and > introduced divergence in behavior at runtime (depending on execution mode and > JIT-compilation peculiarities). > > The fix uses truncation uniformly across all execution modes. It simplifies > implementation and eliminates possible divergence in behavior between > execution modes. Also, it drastically simplifies future Unsafe API > refactorings. > > There's one scenario left when it's possible to observe non-normalized > values: when mismatched access pollutes the Java heap with a bogus boolean > value, but then the value is read with a well-typed boolean access. > > Testing: hs-tier1 - hs-tier6 > > - [x] I confirm that I make this contribution in accordance with the [OpenJDK > Interim AI Policy](https://openjdk.org/legal/ai).
Vladimir Ivanov has updated the pull request incrementally with three additional commits since the last revision: - Merge remote-tracking branch 'origin/boolean_normalize' into boolean_normalize - update - Truncate boolean values ------------- Changes: - all: https://git.openjdk.org/jdk/pull/31249/files - new: https://git.openjdk.org/jdk/pull/31249/files/75a1e4fe..c0b6696a Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=31249&range=01 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=31249&range=00-01 Stats: 167 lines in 2 files changed: 85 ins; 7 del; 75 mod Patch: https://git.openjdk.org/jdk/pull/31249.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/31249/head:pull/31249 PR: https://git.openjdk.org/jdk/pull/31249
