[lworld] RFR: 8377451: [lworld] Add ValuePayload abstraction

Stefan Karlsson stefank at openjdk.org
Mon Feb 9 22:05:12 UTC 2026


On Mon, 9 Feb 2026 11:14:58 GMT, Stefan Karlsson <stefank at openjdk.org> wrote:

>> Create a wrapper class which represents the payload of an InlineKlass object.
>> 
>> The current convention is to use a `void*` representing where the payload starts, the `InlineKlass*` (as we do not always have a header when flattened) and a `LayoutKind` (describing the payloads layout). 
>> 
>> I suggest we introduce something like a `ValuePayload` which encapsulate these properties. As well as a hierarchy built upon these, with the proper interfaces implemented.
>> * ValuePayload (Any payload)
>>   * RawValuePayload (Payload with holder erased)
>>   * BufferedValuePayload (Payload of normal heap object)
>>   * FlatValuePayload (Payload of flattened value)
>>     * FlatFieldPayload (Payload of flattened field)
>>     * FlatArrayPayload (Payload of flattened array element)
>>    
>> The goal is to both make interfaces clearer, and easier to understand. As well as consolidating the implementation in one place rather than spread across different subsystems. 
>> 
>> Each type (except RawValuePayload) also allows for the creation of a Handle, (thread local, or in an OopStorage) for keeping the payload as a thread or global root.
>> 
>> The ValuePayload class is also the interface for interacting with the Access API for InlineKlass objects.
>> 
>> * Testing
>>   * Running tier 1-4 with preview enabled
>>   * Running app tests with preview enabled
>>   * Running normal tier 1-5 
>> 
>> #### _Extra Notes:_
>>  * The `OopHandle` type is there so that we can migrate the JVMTI payload abstraction implementation to using this instead. (Future RFE)
>>  * Some interfaces got cleaned up. Some are unused. Like the `null_payload` which was superseded by the `Access::value_store_null`. C1 still uses the `.null_reset` but if that dependency is removed we should be able to remove that weird object all together.
>>  * Simply adding the Java to VM transition deep inside the payload code created a circular include dependency here. So rather than fixing that, I implemented the relevant bytecodes in the BytecodeInterpreter.
>
> src/hotspot/share/interpreter/interpreterRuntime.cpp line 266:
> 
>> 264: 
>> 265:   FlatFieldPayload payload(instanceOop(obj), entry);
>> 266:   payload.write(inlineOop(value), CHECK);
> 
> `obj_h` and `val_h` seems unused now.

Follow-up: Use `is_oop_or_null` instead.

> src/hotspot/share/oops/inlineKlassPayload.hpp line 68:
> 
>> 66:   inline ValuePayload(oop holder, InlineKlass* klass, ptrdiff_t offset,
>> 67:                       LayoutKind layout_kind
>> 68:                           DEBUG_ONLY(COMMA bool is_raw = false));
> 
> To make it easier to read:
> Suggestion:
> 
>   inline ValuePayload(oop holder,
>                       InlineKlass* klass,
>                       ptrdiff_t offset,
>                       LayoutKind layout_kind
>                       DEBUG_ONLY(COMMA bool is_raw = false));

Or:

Suggestion:

  inline ValuePayload(oop holder, InlineKlass* klass, ptrdiff_t offset,
                      LayoutKind layout_kind DEBUG_ONLY(COMMA bool is_raw = false));

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

PR Review Comment: https://git.openjdk.org/valhalla/pull/2068#discussion_r2782060222
PR Review Comment: https://git.openjdk.org/valhalla/pull/2068#discussion_r2782192220


More information about the valhalla-dev mailing list