[foreign] RFR: Fix UndefinedLayoutException exception message

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Jan 29 16:09:22 UTC 2019


On 29/01/2019 15:57, Jorn Vernee wrote:
> Maurizio Cimadamore schreef op 2019-01-29 16:46:
>> 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))
>
> No, that will fail with "UnsupportedOperationException: bitsSize on 
> Unresolved"

Then try with

scope.allocate(LayoutType.ofStruct(BadStruct.class)).get().foo()

Maurizio

>
> Scope.allocateStruct(BadStruct.class) will call allocateInternal first 
> which throws that UOE, only after that would the implementation be 
> generated when calling get() on the returned pointer;
>
> ```
> private <T> BoundedPointer<T> allocateInternal(LayoutType<T> type, 
> long count, int align) {
>     ...
>     long size = Util.alignUp(type.bytesSize(), align); // !!! calling 
> bitSize() on Unresolved throws UOE
>     ...
> }
>
> @Override
> public <T extends Struct<T>> T allocateStruct(Class<T> clazz) {
>     // FIXME: is this alignment needed?
>     return allocate(LayoutType.ofStruct(clazz), 8).get(); // call to 
> 'get()' triggers struct generation, and resolution of struct's layout.
> }
> ```
>
> Jorn
>
>> 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