Bug in DescriptorParser when names contain digits

sundararajan.athijegannathan at oracle.com sundararajan.athijegannathan at oracle.com
Mon Dec 9 06:47:41 UTC 2019


Looks good

-Sundar

On 09/12/19 12:01 pm, Henry Jen wrote:
> Added test case, please review webrev[1].
>
> [1] http://cr.openjdk.java.net/~henryjen/panama/8235406/0/webrev/
>
> Cheers,
> Henry
>
>
>> On Dec 5, 2019, at 3:22 AM, Maurizio Cimadamore <maurizio.cimadamore at oracle.com> wrote:
>>
>> Hi Sebastian,
>> thanks for the great bug report - it is indeed an issue in the parser. I've filed this:
>>
>> https://bugs.openjdk.java.net/browse/JDK-8235406
>>
>> The problem seems to be related to a bogus call to scanner::lastNumber() instead of scanner::lastString() - which then causes "00" to be interpreted as just "0".
>>
>> Maurizio
>>
>> On 05/12/2019 10:21, Sebastian Stenzel wrote:
>>> Hi,
>>>
>>> This is my first post to the mailing list, I hope this is the correct place to ask whether this is a bug or not. I noticed that the annotation parsing might not work as intended when names contain zero-padded numbers:
>>>
>>> I have a .h file (from osxfuse) that defines a struct with the following function pointers:
>>> 	int (*reserved00)(void *, void *, void *, void *, void *, void *, void *, void *);
>>> 	int (*reserved01)(void *, void *, void *, void *, void *, void *, void *, void *);
>>> 	int (*reserved02)(void *, void *, void *, void *, void *, void *, void *, void *);
>>>
>>> jextract correctly creates annotations from this, e.g.:
>>> 	u64(reserved00):(u64:vu64:vu64:vu64:vu64:vu64:vu64:vu64:v)i32
>>>
>>> However, at runtime the name of the Descriptors are incorrectly parsed: reserved0, reserved1 and reserved2.
>>>
>>> It appears to me that this is caused by the special handling of numeric tokens in DescriptorParser.parseAnnotationValue(), which should not happen for the "name" annotation.
>>>
>>> At a later point in time it is then not possible to find those fields by name, because the generated Layout does not contain the requested field "reserved00" leading to an exception:
>>>
>>> Exception in thread "main" java.lang.IllegalStateException: java.lang.RuntimeException: Failed to generate implementation for class interface com.example.fuse.fuse_h$fuse_operations
>>> 	at java.base/java.foreign.memory.Pointer.lambda$get$3(Pointer.java:170)
>>> 	at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
>>> 	at java.base/java.foreign.memory.Pointer.get(Pointer.java:166)
>>> 	at java.base/jdk.internal.foreign.ScopeImpl.allocateStruct(ScopeImpl.java:160)
>>> 	at com.example.fusepanama.Main.main(Main.java:28)
>>> Caused by: java.lang.RuntimeException: Failed to generate implementation for class interface com.example.fuse.fuse_h$fuse_operations
>>> 	at java.base/jdk.internal.foreign.LibrariesHelper.generateImpl(LibrariesHelper.java:67)
>>> 	at java.base/jdk.internal.foreign.LibrariesHelper$1.computeValue(LibrariesHelper.java:76)
>>> 	at java.base/jdk.internal.foreign.LibrariesHelper$1.computeValue(LibrariesHelper.java:72)
>>> 	at java.base/java.lang.ClassValue.getFromHashMap(ClassValue.java:226)
>>> 	at java.base/java.lang.ClassValue.getFromBackup(ClassValue.java:208)
>>> 	at java.base/java.lang.ClassValue.get(ClassValue.java:114)
>>> 	at java.base/jdk.internal.foreign.LibrariesHelper.getStructImplClass(LibrariesHelper.java:92)
>>> 	at java.base/jdk.internal.foreign.memory.References$OfStruct.makeSpecializedGetter(References.java:542)
>>> 	at java.base/jdk.internal.foreign.memory.References$OfStruct.getter(References.java:527)
>>> 	at java.base/jdk.internal.foreign.memory.LayoutTypeImpl.getter(LayoutTypeImpl.java:87)
>>> 	at java.base/java.foreign.memory.Pointer.lambda$get$3(Pointer.java:168)
>>> 	... 4 more
>>> Caused by: java.lang.RuntimeException: Failed to generate method public abstract java.foreign.memory.Callback com.example.fuse.fuse_h$fuse_operations.reserved00$get()
>>> 	at java.base/jdk.internal.foreign.BinderClassGenerator.generateMembers(BinderClassGenerator.java:159)
>>> 	at java.base/jdk.internal.foreign.StructImplGenerator.generateMembers(StructImplGenerator.java:59)
>>> 	at java.base/jdk.internal.foreign.BinderClassGenerator.generate(BinderClassGenerator.java:110)
>>> 	at java.base/jdk.internal.foreign.LibrariesHelper.lambda$generateImpl$0(LibrariesHelper.java:64)
>>> 	at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
>>> 	at java.base/jdk.internal.foreign.LibrariesHelper.generateImpl(LibrariesHelper.java:63)
>>> 	... 14 more
>>> Caused by: java.lang.NullPointerException
>>> 	at java.base/jdk.internal.foreign.StructImplGenerator.generateFieldAccessor(StructImplGenerator.java:113)
>>> 	at java.base/jdk.internal.foreign.StructImplGenerator.generateMethodImplementation(StructImplGenerator.java:105)
>>> 	at java.base/jdk.internal.foreign.BinderClassGenerator.generateMembers(BinderClassGenerator.java:156)
>>> 	... 19 more
>>>
>>> Cheers!
>>> Sebastian


More information about the panama-dev mailing list