-
Enhancement
-
Resolution: Fixed
-
P3
-
21, repo-panama
The following code:
```
Linker linker = Linker.nativeLinker();
var SDL_SURFACE_LAYOUT = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("flags"),
ValueLayout.ADDRESS.withName("format")
).withName("SDL_Surface");
linker.downcallHandle(MemorySegment.ofAddress(42), FunctionDescriptor.of(
SDL_SURFACE_LAYOUT, ValueLayout.JAVA_INT, ValueLayout.JAVA_INT,
ValueLayout.JAVA_INT, ValueLayout.JAVA_INT));
```
Fails with NPE:
Caused by: java.lang.NullPointerException: Cannot invoke "java.util.List.stream()" because "subclasses" is null
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.classifyStructType(TypeClass.java:137)
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.lambda$isInMemoryReturn$0(CallArranger.java:151)
at java.base/java.util.Optional.filter(Optional.java:218)
at java.base/jdk.internal.foreign.abi.x64.sysv.CallArranger.isInMemoryReturn(CallArranger.java:151)
at java.base/jdk.internal.foreign.abi.x64.sysv.CallArranger.getBindings(CallArranger.java:102)
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:71)
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:68)
at java.base/java.lang.foreign.Linker.downcallHandle(Linker.java:214)
at Main.<clinit>(Main.java:17)
The underlying issue is that the struct being passed is not aligned correctly.
```
Linker linker = Linker.nativeLinker();
var SDL_SURFACE_LAYOUT = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("flags"),
ValueLayout.ADDRESS.withName("format")
).withName("SDL_Surface");
linker.downcallHandle(MemorySegment.ofAddress(42), FunctionDescriptor.of(
SDL_SURFACE_LAYOUT, ValueLayout.JAVA_INT, ValueLayout.JAVA_INT,
ValueLayout.JAVA_INT, ValueLayout.JAVA_INT));
```
Fails with NPE:
Caused by: java.lang.NullPointerException: Cannot invoke "java.util.List.stream()" because "subclasses" is null
at java.base/jdk.internal.foreign.abi.x64.sysv.TypeClass.classifyStructType(TypeClass.java:137)
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.lambda$isInMemoryReturn$0(CallArranger.java:151)
at java.base/java.util.Optional.filter(Optional.java:218)
at java.base/jdk.internal.foreign.abi.x64.sysv.CallArranger.isInMemoryReturn(CallArranger.java:151)
at java.base/jdk.internal.foreign.abi.x64.sysv.CallArranger.getBindings(CallArranger.java:102)
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:71)
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:68)
at java.base/java.lang.foreign.Linker.downcallHandle(Linker.java:214)
at Main.<clinit>(Main.java:17)
The underlying issue is that the struct being passed is not aligned correctly.
- relates to
-
JDK-8303002 Reject packed structs from linker
-
- Closed
-