RFR: 7903649: Field and global variables of array type should have indexed accessors [v4]

Maurizio Cimadamore mcimadamore at openjdk.org
Thu Feb 1 14:41:31 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 one additional commit since the last revision:

  Address review comments
  Address issue with holder class name clash in case insensitive platforms

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

Changes:
  - all: https://git.openjdk.org/jextract/pull/198/files
  - new: https://git.openjdk.org/jextract/pull/198/files/48d1f202..441a29a8

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jextract&pr=198&range=03
 - incr: https://webrevs.openjdk.org/?repo=jextract&pr=198&range=02-03

  Stats: 26 lines in 3 files changed: 13 ins; 5 del; 8 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