[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