On Fri, 3 Jul 2026 14:41:09 GMT, Aleksey Shipilev <[email protected]> wrote:

>> Unsafe was changed recently through: 
>> https://github.com/openjdk/jdk/pull/31249 to no longer treat any non-zero 
>> byte read as a `boolean` through Unsafe as `true`, but only treat the 
>> 'canonical' representation, where only the least significant bit in the byte 
>> is set, as `true`.
>> 
>> This change inadvertently leaked out through the memory access var handles. 
>> A user can write a `byte` into a memory segment (on or off-heap), and then 
>> read it back as a `boolean`, making this behavior change observable. Since 
>> the fallback linker depends on the previous behavior in the implementation, 
>> the tier5 test from the title was failing. But, there is really a gap in 
>> testing here, and we can observe the difference in behavior when just using 
>> the memory access parts of the API as well.
>> 
>> It is important that the normalization of boolean values is the same in all 
>> these scenarios:
>> - Normalizing a value returned from native code by a downcall
>> - Normalizing an argument passed by native code to an upcall stub
>> - Normalizing a value read from a memory segment using a var handle or the 
>> MemorySegment::get accessor
>> 
>> To that end, this patch tweaks the memory segment var handles for boolean 
>> access to restore the old normalization behavior. I've also added the 
>> missing testing for this case.
>> 
>> ---------
>> - [x] I confirm that I make this contribution in accordance with the 
>> [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai).
>
> src/java.base/share/classes/java/lang/invoke/X-VarHandleSegmentView.java.template
>  line 76:
> 
>> 74:         return SCOPED_MEMORY_ACCESS.get$RawType$(bb.sessionImpl(),
>> 75:                 bb.unsafeGetBase(),
>> 76:                 offset(bb, base, offset)){#if[boolean]? != 0};
> 
> It is not exactly clear that `byte` and `boolean` are defined at the same 
> time.
> 
> Could we / should we instead do:
> 
> 
> #if[floatingPoint]
> ...
> #else[floatingPoint]
> #if[byte]
> ...
> #else[byte]
> #if[boolean]
> ...
> #else[boolean]
> ...
> #end[boolean]
> #end[byte]
> #end[floatingPoint]
> 
> 
> ...or is it too ugly?

Better, I think

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/31727#discussion_r3537785953

Reply via email to