[foreign-memaccess+abi] RFR: 8310362: Improve composability of handle derived from layouts [v2]
Maurizio Cimadamore
mcimadamore at openjdk.org
Thu Jun 22 21:19:30 UTC 2023
On Thu, 22 Jun 2023 19:21:35 GMT, Jorn Vernee <jvernee 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));
>
> Jorn Vernee has updated the pull request incrementally with five additional commits since the last revision:
>
> - missing changes
> - rework offset computation doc
> - address most review comments
> - add collectCoordinates void filter review changes
> - include root layout check review changes
src/java.base/share/classes/java/lang/foreign/ValueLayout.java line 108:
> 106: *
> 107: * @apiNote This method is similar, but more efficient, than calling {@code MemoryLayout#varHandle(PathElement...)}
> 108: * with zero arguments, as it avoids the creation of the var args array.
perhaps we should say "with an empty path element array" otherwise one might confuse it with this method?
-------------
PR Review Comment: https://git.openjdk.org/panama-foreign/pull/840#discussion_r1239031744
More information about the panama-dev
mailing list