On Wed, 15 Oct 2025 10:28:36 GMT, Tobias Hartmann <[email protected]> wrote:

>> Hi,
>> 
>> Currently, the class `AdapterFingerPrint` only tracks the types of the 
>> arguments in the calling convention. This does not work well with the 
>> inclusion of value classes which need to be packed and unpacked when passed 
>> between different tiers. This is because 2 types can have the same sequence 
>> of field types, yet the fields are placed at different offsets. In those 
>> cases, the code to pack those types cannot be the same, hence the adapter 
>> code cannot be shared. Currently, a hack is implemented to cover the cases 
>> of inherited fields. For example:
>> 
>>     value class MyAbstract {
>>         int x;
>>     }
>> 
>>     value class MyValue1 extends MyAbstract {}
>> 
>>     value class MyValue2 {
>>         int x;
>>     }
>> 
>> In this case, since `MyAbstract` is an abstract class, we do not know the 
>> complete field sequence of every class that has the field `MyAbstract.x`. 
>> Moreover, we need to ensure that the payload of a value class is stable when 
>> it is flattened, and it can be accessed atomically if atomicity is required. 
>> As a result, `MyAbstract.x` must have the highest alignment, which is 
>> currently 8 because the largest atomic flat access is 8-byte. However, 
>> `MyValue2.x` does not need such a large alignment.
>> 
>> The current hack put a pair of `T_METADATA`, `T_VOID` before an inherited 
>> field. This is fine for the case above, but it clashes with another case:
>> 
>>     value class MyValue3 {
>>         @NullRestricted
>>         Empty e;
>>         int x;
>>     }
>> 
>> The solution I propose is to add field offsets into `AdapterFingerPrint`, as 
>> well as removing the current hack. Please take a look and leave your 
>> reviews, thanks a lot.
>
> Thanks for working on this! The fix looks good to me.

@TobiHartmann Thanks a lot for your review

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

PR Comment: https://git.openjdk.org/valhalla/pull/1679#issuecomment-3407277997

Reply via email to