[foreign-memaccess+abi] RFR: 8310362: Improve composability of handle derived from layouts

Jorn Vernee jvernee at openjdk.org
Thu Jun 22 17:57:27 UTC 2023


On Wed, 21 Jun 2023 13:05:33 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:

>> Me and Maurizio have been discussing how to better address certain use cases like accessing structs with variable length array members, or matrices that have a dynamic row and column size.
>> 
>> The solution we came up with is captured in this patch. It adds an additional base offset parameter to the handles produced by `MemoryLayout::varHandle`, `MemoryLayout::sliceHandle` and `MemoryLayout::byteOffsetHandle`. This allows these handles to be composed with other offset computations that are not necessarily derived from layouts.
>> 
>> This patch also adds a `scale` method to MemoryLayout, which can be used to scale and index by the size of a layout. Essentially: `offset + layout.byteSize() * index`. This is useful for expressing ad-hoc offset computations. A `scaleHandle` method is also added for convience, which returns a MethodHandle for `scale` bound to the receiver layout.
>> 
>> Both these changes allowed for several simplifications:
>> - `MethodHandles::memorySegmentViewVarHandle` can be removed, as it's now exactly the same as calling ML::varHandle on a ValueLayout with an empty layout path. (the former method also didn't take advantage of the access handle cache found on ValueLayouts).
>> - `ValueLayout::arrayHandle` is removed, as most use cases can now simply be expressed using ML::varHandle + ML::scaleHandle. e.g.:
>> 
>> MethodHandles.collectCoordinates(layout.varHandle(),
>>             1, MethodHandles.insertArguments(layout.scaleHandle(), 0, 0L));
>
> src/java.base/share/classes/java/lang/foreign/MemoryLayout.java line 240:
> 
>> 238:  * The var handles returned by {@link #varHandle(PathElement...)} and {@link ValueLayout#varHandle()} feature certain
>> 239:  * <i>access mode restrictions</i>. A var handle is associated with an access size {@code S}, derived from the
>> 240:  * {@linkplain ValueLayout#byteSize() byte size} of this layout, and an alignment constraint {@code B}, derived from the
> 
> `of this layout` looks weird for a toplevel javadoc section (here and elsewhere)

What should I say here? Is just "of the layout" better? Or should it be more elaborate, like "of the receiver layout", or "of the layout on which this method is invoked"

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

PR Review Comment: https://git.openjdk.org/panama-foreign/pull/840#discussion_r1238859333


More information about the panama-dev mailing list