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

Sundararajan Athijegannathan sundararajan.athijegannathan at oracle.com
Wed Jan 30 03:58:29 UTC 2019


+1.

Good fix! subtle bug.

Minor: Cursor.toString is a very long line. Perhaps it can folded into 2 
lines.

-Sundar

On 30/01/19, 3:08 AM, Maurizio Cimadamore wrote:
> Looks good - Sundar please also take a look
>
> Cheers
> Maurizio
>
> On 25/01/2019 19:45, Jorn Vernee wrote:
>>> 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