[foreign-jextract] RFR: 8252759: Jextract flattens nested anonymous structs and unions when computing layouts

Jorn Vernee jvernee at openjdk.java.net
Thu Jan 14 19:03:31 UTC 2021


Hi,

This patch changes the way jextract handles nested structs and unions.

Currently, when encountering an anonymous struct or union, jextract folds it's fields into the parent layout. But, this can lead to incorrect layouts, especially for unions. e.g. see the following example:

    struct Foo {
        int x;
        union {
            int y;
            int z;
        };
    }; 
    
becomes:

    static final MemoryLayout Foo$struct$LAYOUT_ = MemoryLayout.ofStruct(
        C_INT.withName("x"),
        C_INT.withName("y"),
        C_INT.withName("z")
    ).withName("Foo"); 
    
In this case, the offset of the `z` field will not be correct.

This patch changes the jextract behaviour to preserve the nested layouts of anonymous unions and structs, so the example becomes:

    static final MemoryLayout Foo$struct$LAYOUT_ = MemoryLayout.ofStruct(
        C_INT.withName("x"),
        MemoryLayout.ofUnion(
            C_INT.withName("y"),
            C_INT.withName("z")
        ).withName("$anon$0")
    ).withName("Foo"); 
    
Here, the anonymous layout gets a generated name which is needed so that the `y` and `z` fields can still be reached from the root layout with layout paths to create var handles for instance.

Just the layout is changed, the Foo java class that we generate still has getters and setters for `y` and `z`.

In the patch this behaviour is implemented by temporarily adding a 'prefix' (`"$anon$0"` in this case) to the `StructBuilder`, which is used in the generated layout paths to reach the nested fields.

Thanks,
Jorn

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

Commit messages:
 - Tabs to spaces
 - Add test for nested anonymous unions
 - Don't fold anonymous struct/union layouts into the parent layout

Changes: https://git.openjdk.java.net/panama-foreign/pull/434/files
 Webrev: https://webrevs.openjdk.java.net/?repo=panama-foreign&pr=434&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8252759
  Stats: 229 lines in 10 files changed: 169 ins; 2 del; 58 mod
  Patch: https://git.openjdk.java.net/panama-foreign/pull/434.diff
  Fetch: git fetch https://git.openjdk.java.net/panama-foreign pull/434/head:pull/434

PR: https://git.openjdk.java.net/panama-foreign/pull/434


More information about the panama-dev mailing list