Integrated: 7903649: Field and global variables of array type should have indexed accessors

Maurizio Cimadamore mcimadamore at openjdk.org
Thu Feb 1 15:40:13 UTC 2024


On Mon, 29 Jan 2024 17:37:25 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:

> 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...

This pull request has now been integrated.

Changeset: 2f6b9ab3
Author:    Maurizio Cimadamore <mcimadamore at openjdk.org>
URL:       https://git.openjdk.org/jextract/commit/2f6b9ab3e99a2d1143f16de76999eedd143e8f0c
Stats:     658 lines in 9 files changed: 574 ins; 10 del; 74 mod

7903649: Field and global variables of array type should have indexed accessors

Reviewed-by: jvernee

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

PR: https://git.openjdk.org/jextract/pull/198


More information about the jextract-dev mailing list