RFR: 8263512: [macos_aarch64] issues with calling va_args functions from invoke_native [v3]

Nick Gasson ngasson at openjdk.java.net
Fri Jun 4 15:10:19 UTC 2021


On Fri, 4 Jun 2021 11:07:27 GMT, Jorn Vernee <jvernee at openjdk.org> wrote:

>> test/jdk/java/foreign/valist/VaListTest.java line 706:
>> 
>>> 704:                     vaList.skip(BigPoint_LAYOUT);
>>> 705:                     assertEquals((long) vaList.vargAsLong(C_LONG), 42);
>>> 706:                 })},
>> 
>> Looks like a carrier size mismatch here:
>> 
>> 
>> java.lang.IllegalArgumentException: Carrier size mismatch: long != b32[abi/kind=LONG]
>>         at jdk.incubator.foreign/jdk.internal.foreign.Utils.checkPrimitiveCarrierCompat(Utils.java:111)
>>         at jdk.incubator.foreign/jdk.internal.foreign.abi.SharedUtils.checkCompatibleType(SharedUtils.java:231)
>>         at jdk.incubator.foreign/jdk.internal.foreign.abi.x64.windows.WinVaList.read(WinVaList.java:114)
>>         at jdk.incubator.foreign/jdk.internal.foreign.abi.x64.windows.WinVaList.read(WinVaList.java:109)
>>         at jdk.incubator.foreign/jdk.internal.foreign.abi.x64.windows.WinVaList.vargAsLong(WinVaList.java:84)
>>         at VaListTest.lambda$upcalls$58(VaListTest.java:705)
>>         at jdk.incubator.foreign/jdk.internal.foreign.abi.ProgrammableInvoker.invokeNative(Native Method)
>>         at jdk.incubator.foreign/jdk.internal.foreign.abi.ProgrammableInvoker.invokeMoves(ProgrammableInvoker.java:290)
>>         at VaListTest.testUpcall(VaListTest.java:530)
>> 
>> 
>> Need to use `C_LONG_LONG` to be cross-platform compatible. (sorry for not noticing this).
>> 
>> Suggestion:
>> 
>>                 { linkVaListCB("upcallBigStructPlusScalar"), VaListConsumer.mh(vaList -> {
>>                     MemorySegment struct = vaList.vargAsSegment(BigPoint_LAYOUT, ResourceScope.newImplicitScope());
>>                     assertEquals((long) VH_BigPoint_x.get(struct), 8);
>>                     assertEquals((long) VH_BigPoint_y.get(struct), 16);
>> 
>>                     assertEquals((long) vaList.vargAsLong(C_LONG_LONG), 42);
>>                 })},
>>                 { linkVaListCB("upcallBigStructPlusScalar"), VaListConsumer.mh(vaList -> {
>>                     vaList.skip(BigPoint_LAYOUT);
>>                     assertEquals((long) vaList.vargAsLong(C_LONG_LONG), 42);
>>                 })},
>
> Also, it looks like the cast to `(long)` on the `vaList.vargAsLong` lines is redundant (thanks IntelliJ).

Thanks for your help! These are both fixed now.

-------------

PR: https://git.openjdk.java.net/jdk/pull/3617


More information about the core-libs-dev mailing list