- 
    Enhancement 
- 
    Resolution: Fixed
- 
     P3 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
 
-         
 
        