[foreign-jextract] RFR: 8252759: Jextract flattens nested anonymous structs and unions when computing layouts
Jorn Vernee
jvernee at openjdk.java.net
Fri Jan 15 12:04:10 UTC 2021
On Fri, 15 Jan 2021 11:50:15 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:
>> 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
>
> I like the approach, because not only it fixes code generation, but it also makes the AST "right" by avoiding early flattening. I think the test is a bit light - we might want to add more cases of deeply nested anon structs, just in case - as this area is a bit fragile.
Note that we already have a test that more broadly tests nested structs; https://github.com/openjdk/panama-foreign/blob/foreign-jextract/test/jdk/tools/jextract/nested.h
It just wasn't catching this particular case, so I added something separate. I can enhance that test to also check offsets of fields.
-------------
PR: https://git.openjdk.java.net/panama-foreign/pull/434
More information about the panama-dev
mailing list