Value-based classes in jdk.incubator.foreign

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Nov 25 15:09:50 UTC 2020


On 25/11/2020 14:27, Jorn Vernee wrote:
> I think we might want to re-evaluate if it's worth it to rotate these 
> classes to being primitive classes as well (since this does introduce 
> restrictions).
>
> e.g. the potential gains for MemorySegment seem much more obvious to 
> me, since those typically are created and accessed in hot loops, while 
> MemoryLayouts are more typically declared once as a static final 
> field, and then only accessed to create var handles which are again 
> stored in static final fields (or do we expect much heavier churn with 
> MemoryLayouts in the future?). The potential gain doesn't seem to be 
> that big for MemoryLayouts.

In a way I agree with you  - at the same time right now out Layout does 
provide few transforming operations like MemoryLayout::map and 
SequenceLayout::flatten/reshape which could benefit from the value 
treatment. In other words, as soon as you write something that's doing 
some manipulation over layouts (and with variable-length data this might 
be more common), I suspect that the cost of instantiating them is gonna 
show up more. So, yes, it's a bit on the fence, but at the same time 
none of the restrictions added seems to me as a real deal breaker, so 
I'd prefer to keep the option open?

Maurizio

>
> Jorn
>
> On 24/11/2020 23:18, Maurizio Cimadamore wrote:
>> That's all good - thanks for the headsup.
>>
>> I think, as I commented elsewhere, some of the issues with the 
>> current hierarchy in the foreign memory access API stem from 
>> transient choices (such as that of using a stateful intermediate 
>> class for layouts). I think that, moving forward, we can easily 
>> adhere to the final value-based specification.
>>
>> Maurizio
>>
>> On 24/11/2020 19:38, Dan Smith wrote:
>>> JEP 390 has done some work to reconcile the "value-based class" 
>>> concept in JDK APIs with future primitive classes, as being designed 
>>> in Valhalla.
>>>
>>> One conclusion we reached is that it will not be helpful in the 
>>> future to have distinct "value-based" and "primitive" properties for 
>>> classes; the former should be superseded by the latter. A class 
>>> should either be designated value-based, with the intent to 
>>> eventually become a primitive class, or it should just avoid the 
>>> "value-based" terminology and state directly whatever properties it 
>>> wishes to advertise.
>>>
>>> This has led to a revised definition of value-based class, which, 
>>> among other things, asserts that the class is final and the 
>>> superclass declares no instance fields. See here:
>>>
>>> https://github.com/openjdk/valhalla/pull/222/files#diff-5b3f533129ebe96efc9d6d51a4bdf33b56dc8aa0586343c792621ebcbd4fb77e 
>>>
>>>
>>> This creates some problems for classes in jdk.incubator.foreign:
>>>
>>> - Implementations of MemorySegment are supposed to be value-based, 
>>> but are non-final and inherit fields.
>>>
>>> - Subclasses of AbstractLayout claim to be value-based but inherit 
>>> fields
>>>
>>> For now, I've left the "this is a value-based class" comments in the 
>>> javadoc, with some revisions in the boilerplate text.
>>>
>>> https://github.com/openjdk/valhalla/pull/222/files#diff-11d74c4a0e74adb54334cb36c0e5e71fd9e2ab95269412cb3e040d8ce80d9726 
>>>
>>>
>>> If the intent is to eventually migrate these to be primitive 
>>> classes, their hierarchies should be adjusted to satisfy the 
>>> requirements. If not, we should remove the references to value-based 
>>> classes.


More information about the panama-dev mailing list