RFR: 7903649: Field and global variables of array type should have indexed accessors [v2]
Maurizio Cimadamore
mcimadamore at openjdk.org
Wed Jan 31 18:06:34 UTC 2024
> This PR adds support for indexed accessors for struct fields and global variables whose type is an array type. These accessors feature a number of `long` access coordinates which has the same cardinality as that of the underlying array type.
>
> For instance, consider the following global variable declaration:
>
>
> int ints[2][3][4];
>
>
> For this, jextract now emits:
>
>
> private static SequenceLayout ints$LAYOUT() {
> class Holder {
> static final SequenceLayout LAYOUT = MemoryLayout.sequenceLayout(2, MemoryLayout.sequenceLayout(3, MemoryLayout.sequenceLayout(4, foo_h.C_INT)));
> }
> return Holder.LAYOUT;
> }
>
> private static MemorySegment ints$SEGMENT() {
> class Holder {
> static final MemorySegment SEGMENT = foo_h.findOrThrow("ints")
> .reinterpret(ints$LAYOUT().byteSize());
> }
> return Holder.SEGMENT;
> }
>
> /**
> * Getter for variable:
> * {@snippet lang=c :
> * int ints[2][3][4]
> * }
> */
> public static MemorySegment ints() {
> return ints$SEGMENT();
> }
>
> /**
> * Setter for variable:
> * {@snippet lang=c :
> * int ints[2][3][4]
> * }
> */
> public static void ints(MemorySegment varValue) {
> MemorySegment.copy(varValue, 0L, ints$SEGMENT(), 0L, ints$LAYOUT().byteSize());
> }
>
> private static VarHandle ints$ELEM_HANDLE() {
> class Holder {
> static final VarHandle HANDLE = ints$LAYOUT().varHandle(sequenceElement(), sequenceElement(), sequenceElement());
> }
> return Holder.HANDLE;
> }
>
> /**
> * Indexed getter for variable:
> * {@snippet lang=c :
> * int ints[2][3][4]
> * }
> */
> public static int ints(long index0, long index1, long index2) {
> return (int)ints$ELEM_HANDLE().get(ints$SEGMENT(), 0L, index0, index1, index2);
> }
>
> /**
> * Indexed setter for variable:
> * {@snippet lang=c :
> * int ints[2][3][4]
> * }
> */
> public static void ints(long index0, long index1, long index2, int varValue) {
> ints$ELEM_HANDLE().set(ints$SEGMENT(), 0L, index0, index1, index2, varValue);
> }
>
>
> If the array element type is a struct, different code needs to be generated. Consider this global variable declaration:
>
>
> struct Point { int x; int y; } points[2][3][4];
>
>
> This generates the following:
>
>
> private static SequenceLayout points$LAYOUT() {
> class Holder {
> static final SequenceLayout LAYOUT = MemoryLayout.sequenceLayout(2, M...
Maurizio Cimadamore has updated the pull request incrementally with five additional commits since the last revision:
- Add support for global variabls and struct fields
Fix tests
- Tweak header file class to expose constant accessors
- Expose constants in structs
- Expose function wrappers constant holders
- Add public holder class for globals
-------------
Changes:
- all: https://git.openjdk.org/jextract/pull/198/files
- new: https://git.openjdk.org/jextract/pull/198/files/2f1e7010..bcc60e0b
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jextract&pr=198&range=01
- incr: https://webrevs.openjdk.org/?repo=jextract&pr=198&range=00-01
Stats: 273 lines in 8 files changed: 116 ins; 55 del; 102 mod
Patch: https://git.openjdk.org/jextract/pull/198.diff
Fetch: git fetch https://git.openjdk.org/jextract.git pull/198/head:pull/198
PR: https://git.openjdk.org/jextract/pull/198
More information about the jextract-dev
mailing list