Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8304803

NPE thrown during downcall classification under Linux/x64

XMLWordPrintable

      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.

            jvernee Jorn Vernee
            mcimadamore Maurizio Cimadamore
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: