[foreign] RFR: Fix UndefinedLayoutException exception message

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Jan 29 15:46:47 UTC 2019


On 29/01/2019 15:19, Jorn Vernee wrote:
> Maurizio Cimadamore schreef op 2019-01-29 15:59:
>> Resolving references across interfaces is not expected to work
>> reliably. This is the primary reason which sends us towards an
>> extraction model that is library-centric, rather than header-centric,
>> so that all references in a library should be self-contained.
>
> I've been using a mitigating patch that also scans methods of a Struct 
> implementation in LayoutResolver when scanning a struct. Under the 
> assumption that a type's layout is defined on that type itself.
>
>> As for your test, it seems like you can get the same exception simply
>> by having a single struct interface whose layout has some dandling
>> unresolved layout (e.g. an unresolved layout whose layout expression
>> is not defined anywhere)?
>
> The tricky part is triggering the resolution of the layout through the 
> public API. Trying to allocate a struct will not resolve the struct's 
> layout. The only place I found that does this is either the test case 
> I've used, where the dangling layout is in a @NativeFunction 
> descriptor, or in StructImplGenerator's constructor, which is called 
> when de referencing a pointer to a struct.

So, I guess what I'm saying is:

@NativeStruct("[ ${foo}(foo) ]")
interface BadStruct extends Struct<BadStruct> {
     @NativeGetter("foo")
     Foo foo();

     interface Foo { }
}

Shouldn't this fail when trying to generate the struct implementation? 
(e.g. Scope.allocateStruct(BadStruct.class))

Maurizio

>
> Of course, I could also just use 
> `LayoutResolver.get(Object.class).resolve(Layout.of("${Undefined}"));`. 
> Would that be good enough?
>
> Jorn
>
>> Maurizio
>>
>> On 28/01/2019 14:52, Jorn Vernee wrote:
>>> Ok, it took a while to find a good test case. I was seeing the 
>>> exception due to a cross-header layout reference, so that's also the 
>>> test case I added. It seems that that is currently the only 
>>> realistic use-case where this exception is being thrown. I believe 
>>> not being able to resolve cross-header layout references is a known 
>>> issue as well?
>>>
>>> Updated webrev: 
>>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/fixmessage/webrev.01/ 
>>>
>>>
>>> Jorn
>>>
>>> Jorn Vernee schreef op 2019-01-28 14:16:
>>>> Yes, I will do that. (wasn't sure if it was useful enough).
>>>>
>>>> Jorn
>>>>
>>>> Sundararajan Athijegannathan schreef op 2019-01-28 14:12:
>>>>> Is it possible to add a test with invalid (unresolvable) name
>>>>> reference in a layout descriptor and check the exception message?
>>>>>
>>>>> -Sundar
>>>>>
>>>>> On 28/01/19, 6:36 PM, Jorn Vernee wrote:
>>>>>> Hi,
>>>>>>
>>>>>> JDK-8217245 changed the syntax for Unresolved layouts from 
>>>>>> `$(Name)` to `${Name}`. This also means Unresolved now has a 
>>>>>> dedicated `layoutExpression` field instead of relying on the name 
>>>>>> annotation.
>>>>>>
>>>>>> LayoutResolver.UndefinedLayoutException is still using the name 
>>>>>> annotation in the exception message, which is now incorrect. This 
>>>>>> small patch fixes that, and changes it to use 
>>>>>> Unresolved::layoutExpression().
>>>>>>
>>>>>> Please review.
>>>>>>
>>>>>> Webrev: 
>>>>>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/fixmessage/webrev.00/ 
>>>>>> Cheers,
>>>>>> Jorn


More information about the panama-dev mailing list