-
Enhancement
-
Resolution: Fixed
-
P3
-
21, repo-panama
When trying to link a function descriptor that contains an unbounded/max size sequence layout, an ArrayIndexOutOfBoundsException:
java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.groupByEightBytes(TypeClass.java:222)
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.groupByEightBytes(TypeClass.java:218)
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.groupByEightBytes(TypeClass.java:197)
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.classifyStructType(TypeClass.java:127)
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.ofStruct(TypeClass.java:70)
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.classifyLayout(TypeClass.java:181)
at java.base/jdk.internal.foreign.abi.x64.sysv.CallArranger$UnboxBindingCalculator.getBindings(CallArranger.java:253)
at java.base/jdk.internal.foreign.abi.x64.sysv.CallArranger.getBindings(CallArranger.java:116)
at java.base/jdk.internal.foreign.abi.x64.sysv.CallArranger.arrangeDowncall(CallArranger.java:129)
at java.base/jdk.internal.foreign.abi.x64.sysv.SysVx64Linker.arrangeDowncall(SysVx64Linker.java:54)
at java.base/jdk.internal.foreign.abi.AbstractLinker.lambda$downcallHandle$0(AbstractLinker.java:74)
at java.base/jdk.internal.foreign.abi.SoftReferenceCache$Node.get(SoftReferenceCache.java:52)
at java.base/jdk.internal.foreign.abi.SoftReferenceCache.get(SoftReferenceCache.java:38)
at java.base/jdk.internal.foreign.abi.AbstractLinker.downcallHandle(AbstractLinker.java:71)
The underlying issue is that the SysV classification has to devide the struct up in 8 bytes chunks, and classify each chunk individually. However, if the group layout is too large, this is not possible.
We can more explicitly check for this condition, and improve the error message that is reported.
java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.groupByEightBytes(TypeClass.java:222)
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.groupByEightBytes(TypeClass.java:218)
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.groupByEightBytes(TypeClass.java:197)
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.classifyStructType(TypeClass.java:127)
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.ofStruct(TypeClass.java:70)
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.classifyLayout(TypeClass.java:181)
at java.base/jdk.internal.foreign.abi.x64.sysv.CallArranger$UnboxBindingCalculator.getBindings(CallArranger.java:253)
at java.base/jdk.internal.foreign.abi.x64.sysv.CallArranger.getBindings(CallArranger.java:116)
at java.base/jdk.internal.foreign.abi.x64.sysv.CallArranger.arrangeDowncall(CallArranger.java:129)
at java.base/jdk.internal.foreign.abi.x64.sysv.SysVx64Linker.arrangeDowncall(SysVx64Linker.java:54)
at java.base/jdk.internal.foreign.abi.AbstractLinker.lambda$downcallHandle$0(AbstractLinker.java:74)
at java.base/jdk.internal.foreign.abi.SoftReferenceCache$Node.get(SoftReferenceCache.java:52)
at java.base/jdk.internal.foreign.abi.SoftReferenceCache.get(SoftReferenceCache.java:38)
at java.base/jdk.internal.foreign.abi.AbstractLinker.downcallHandle(AbstractLinker.java:71)
The underlying issue is that the SysV classification has to devide the struct up in 8 bytes chunks, and classify each chunk individually. However, if the group layout is too large, this is not possible.
We can more explicitly check for this condition, and improve the error message that is reported.