[foreign-jextract] Generated getters and setters do not include offsets

Jorn Vernee jorn.vernee at oracle.com
Tue Sep 1 13:08:49 UTC 2020


Hi Filip,

This issue should now be fixed [1], can you give it a try?

Thanks,
Jorn

[1] : https://github.com/openjdk/panama-foreign/commit/afdbc657

On 31/08/2020 12:35, Filip Krakowski wrote:
> Hi,
>
> I just noticed that jextract's generated getters and setters always 
> access the provided MemorySegment at offset 0. This looks like a bug 
> to me.
>
> This is the struct I used to reproduce this issue.
>
>    struct coordinate {
>       int x;
>       int y;
>    };
>
>
> And this is the code jextract generated from it (source mode).
>
>    private static final MemoryLayout coordinate$struct$LAYOUT_ 
> =MemoryLayout.ofStruct(
>         C_INT.withName("x"),
>         C_INT.withName("y")
>    ).withName("coordinate");
>
>    public static jdk.incubator.foreign.MemoryLayout
>    coordinate$struct$LAYOUT() {return coordinate$struct$LAYOUT_; }
>
>    private static final MemoryLayout coordinate$x$LAYOUT_ =C_INT;
>    public static jdk.incubator.foreign.MemoryLayout 
> coordinate$x$LAYOUT() {return coordinate$x$LAYOUT_; }
>
>    private static final VarHandle coordinate$x$VH_ 
> =coordinate$x$LAYOUT_.varHandle(int.class);
>    public static java.lang.invoke.VarHandle coordinate$x$VH() {return 
> coordinate$x$VH_; }
>
>    private static final MemoryLayout coordinate$y$LAYOUT_ =C_INT;
>    public static jdk.incubator.foreign.MemoryLayout 
> coordinate$y$LAYOUT() {return coordinate$y$LAYOUT_; }
>
>    private static final VarHandle coordinate$y$VH_ 
> =coordinate$y$LAYOUT_.varHandle(int.class);
>    public static java.lang.invoke.VarHandle coordinate$y$VH() {return 
> coordinate$y$VH_; }
>
>
> Here I allocate the struct, set both fields and print them afterwards.
>
>    try (var segment =coordinate.allocate()) {
>         coordinate.x$set(segment,1);
>         coordinate.y$set(segment,2);
>
>         System.out.println(coordinate.x$get(segment));
>         System.out.println(coordinate.y$get(segment));
>    }
>
>
> This will print "2" twice, although "x" should be set to "1" in my 
> understanding.
>
> I am using the latest build (commit 
> 4d7888c040767760b6250130ef6024ea16b43461).
>
>
> Best regards,
> Filip


More information about the panama-dev mailing list