Slice a MemorySegment using SequenceLayout's element boundaries
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Tue Jan 11 21:08:23 UTC 2022
Hi Sebastian,
look at the MemoryLayouy::sliceHandle - I believe it should do what you
want? It takes a sequence of PathElements and returns a MethodHandle
which takes a MemorySegment and some long coordinates and return the
segment slice at that coordinates, which seems to be what you are trying
to do.
Cheers
Maurizio
On 11/01/2022 20:48, Sebastian Stenzel wrote:
> Hi,
>
> I've just updated some of my experiments [1] using the latest API in the upcoming JDK 18. Which lead to a question:
>
> Given:
>
> 1. a MemoryAddress (parameter in an upcall stub) representing a pointer to an array of structs
> 2. a matching SequenceLayout of GroupLayouts for this array of structs
>
> Is there any convenient API to obtain a MemorySegment of the nth array element? Currently I'm calculating memory boundaries manually and slice my segment accordingly:
>
> ```
> private void upcall(MemoryAddress pointer) {
> try (var scope = ResourceScope.newConfinedScope()) {
> var structLayout = ...;
> var sequenceLayout = MemoryLayout.sequenceLayout(42, structLayout);
> var segment = MemorySegment.ofAddress(pointer, sequenceLayout.byteSize(), scope);
>
> // either:
> var offset0 = sequenceLayout.byteOffset(MemoryLayout.PathElement.sequenceElement(0));
> var offset1 = sequenceLayout.byteOffset(MemoryLayout.PathElement.sequenceElement(1));
> var elem0 = segment.asSlice(offset0, structLayout.byteSize());
> var elem1 = segment.asSlice(offset1, structLayout.byteSize());
>
> // or alternatively:
> var elem0 = segment.asSlice(0, structLayout.byteSize());
> var elem1 = segment.asSlice(structLayout.byteSize(), structLayout.byteSize());
> }
> }
> ```
>
> But since a SequenceLayout knows how to calculate the offset and knows the size of each of its elements, I guess there is a more convenient way to slice a segment.
>
> Or if there isn't: Consider this a feature request
>
> Cheers!
> Sebastian
>
> [1]: https://github.com/skymatic/fuse-panama/blob/develop/mac/src/main/java/de/skymatic/fusepanama/mac/MacFuseOperationsMapper.java#L178-L187
More information about the panama-dev
mailing list