[foreign-memaccess] RFR 8234814: Eager layout size computation trips on unbound sequence layouts

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Nov 27 13:14:09 UTC 2019


I've fixed the exception, removed jshell changes (see [1]) and pushed.

We can discuss separately on the opportunity to add new API points to 
make it easier to deal with VLAs.

Thanks
Maurizio

[1] - 
https://mail.openjdk.java.net/pipermail/kulla-dev/2019-November/002446.html

On 27/11/2019 09:39, Maurizio Cimadamore wrote:
>
> On 27/11/2019 09:21, Jorn Vernee wrote:
>> Hi,
>>
>> Some comments:
>>
>> - SequenceLayout:
>> This overrides badSizeExceptionMessage. I see the subtle difference 
>> in text, but a sequence layout can also have an unspecified size if 
>> the element layout has an unspecified size, in which case the message 
>> in AbstractLayout would be more correct. You could check whether the 
>> current sequence has an element count and return 
>> super.badSizeExceptionMessage() in that case, though I think going 
>> with one message that reads "Cannot compute the size of a layout 
>> which is, or depends on a sequence layout with unspecified size" in 
>> AbstractLayout would be good enough.
> Fair point
>>
>> - Shouldn't the JShell fix should go into jdk/jdk instead?
> Ideally yes - in practice the problem is so specific to VarHandles 
> that we can go both ways.
>>
>> One observation:
>>
>> * Looking at the tests; I think something like 
>> `MemorySegment.allocateNative(8 + 8 * 4)` would in practice be more 
>> likely `MemorySegment.allocateNative(layout.byteSize() + 
>> MemoryLayout.ofSequence(4, MemoryLayouts.JAVA_DOUBLE).byteSize())` 
>> which makes me think we need a SequenceLayout::withElementCount(long) 
>> method to create a new layout with an element count from a sequence 
>> layout that doesn't have one:
>>
>>         SequenceLayout vla = 
>> MemoryLayout.ofSequence(MemoryLayouts.JAVA_DOUBLE);
>>         MemoryLayout header = MemoryLayout.ofStruct(
>>                 MemoryLayouts.JAVA_INT.withName("size"),
>>                 MemoryLayout.ofPaddingBits(32),
>>                 vla.withName("arr"));
>>         ...
>>         try (MemorySegment segment = 
>> MemorySegment.allocateNative(header.byteSize() + 
>> vla.withElementCount(4).byteSize())) {
>>         ...
>>
>> Especially when 'vla' in the above example could be a lot more 
>> complex. What do you think?
>
> This is essentially a restricted version of 'pluggable layouts with 
> size holes'. I don't mind the suggestion too much, although I'm a bit 
> worried it could be perceived as half-way there - e.g. another way to 
> skin the cat would be to take 'header' and inject sizes into that one 
> (perhaps using layout paths). E.g.
>
> header.withSize(4, PathElement.groupLayout("arr"))
>
> (name TBD, of course, but I hope you get what I mean)
>
> Maurizio
>
>>
>> Cheers,
>> Jorn
>>
>> On 26/11/2019 16:03, Maurizio Cimadamore wrote:
>>> After a discussion offline with Jorn I've decided to revert the 
>>> changes to constants:
>>>
>>> cr.openjdk.java.net/~mcimadamore/panama/8234814_v3
>>>
>>> As some of the tests demonstrate, among the original goals of these 
>>> JAVA_INT constants and friends was interop with ByteBuffers, hence 
>>> the endianness set to BE.
>>>
>>> I'll leave it as is for now (after all, the behavior is documented). 
>>> We can revise later, if needs be.
>>>
>>> Maurizio
>>>
>>> On 26/11/2019 14:46, Maurizio Cimadamore wrote:
>>>>
>>>> On 26/11/2019 14:40, Maurizio Cimadamore wrote:
>>>>> * constants such as JAVA_INT should use native order (this is, 
>>>>> after all, the layout of an int in the VM) 
>>>>
>>>> To expand a bit - we eventually would like to see these constants 
>>>> moved in the primitive wrapper classes - e.g.
>>>>
>>>> MemoryLayout::JAVA_INT -> Integer::LAYOUT
>>>>
>>>> in which case I think these constants should return whatever layout 
>>>> the VM thinks a Java int (in this case) has.
>>>>
>>>> Maurizio
>>>>


More information about the panama-dev mailing list