[foreign] RFR 8217781: Filter child cursors when doing recursive offset lookup

Jorn Vernee jbvernee at xs4all.nl
Fri Jan 25 19:45:02 UTC 2019


> But then, as I was writing this, I realized that RecordLayoutComputer
> seems to have several helper methods which take a Cursor as input,
> when in reality the only input we ever pass is the record cursor
> itself (which is already stashed in a field) - so maybe we should get
> rid of these extra Cursor params and use the field?

This is not quite possible. `hasIncompleteArray` also calls these 
methods with the child cursors of anonymous nested structs and unions. 
So we can't just make the helper methods non-static and use the field.

It's quite unfortunate the way the bug works. We have to check for 
incomplete array fields before trying to process _any_ of the fields, 
which means doing a recursive lookup into the anonymous structs and 
unions inside the type.

But there is a simplification possible by replacing isFlattenable with 
the method you suggest (which I've named `flattenableChildren` to show 
the difference with `children()`)

Updated webrev: 
http://cr.openjdk.java.net/~jvernee/panama/webrevs/8217781/webrev.01/

Cheer,
Jorn

Maurizio Cimadamore schreef op 2019-01-25 19:40:
> Looks good,
> Some minor suggestions - these kind of issues arise because the code
> should never call cursor.children().
> 
> I suggest getting rid of isFlattenable, and have an accessor which does 
> this:
> 
> Stream<Cursor> children(Cursor c) {
>    return c.children()
>                    .filter(RecordLayoutComputer::isFlattenable)
> }
> 
> But then, as I was writing this, I realized that RecordLayoutComputer
> seems to have several helper methods which take a Cursor as input,
> when in reality the only input we ever pass is the record cursor
> itself (which is already stashed in a field) - so maybe we should get
> rid of these extra Cursor params and use the field?
> 
> Maurizio
> 
> On 25/01/2019 12:26, Jorn Vernee wrote:
>> Hi,
>> 
>> Based on JDK-8217664 [1], I have found the following bug with this 
>> layout:
>> 
>> ```
>> struct Foo {
>>     struct {
>>         union {
>>             int x;
>>         } Bar;
>>     };
>> };
>> ```
>> 
>> To find the offset of the anonymous struct in Foo, we have to find the 
>> offset of it's first field. But, the current code is looking for the 
>> first child _cursor_ of the anonymous struct, which is the union 
>> declaration, and not the field 'Bar'. This again tries to look up the 
>> first field of 'Bar' which is 'x', so we end up looking up the field 
>> 'x' in Foo, which throws an error.
>> 
>> The fix is simple, we just have to filter for anonymous struct/union 
>> and FieldDecl child cursors when doing a recursive offset lookup. I've 
>> also added an exception message to the recursive lookup, which helped 
>> debug this.
>> 
>> Please review the following.
>> 
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8217781
>> Webrev: 
>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8217781/webrev.00/
>> 
>> Thanks,
>> Jorn
>> 
>> [1] : https://bugs.openjdk.java.net/browse/JDK-8217664


More information about the panama-dev mailing list