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

Sundararajan Athijegannathan sundararajan.athijegannathan at oracle.com
Wed Jan 30 12:08:22 UTC 2019


+1

-Sundar

On 30/01/19, 4:58 PM, Jorn Vernee wrote:
> Thanks,
>
> Updated webrev: 
> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8217781/webrev.02/
>
> I also split the exception message I added in RecordLayoutComputer 
> since that was also pretty long.
>
> Jorn
>
> Sundararajan Athijegannathan schreef op 2019-01-30 04:58:
>> +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