< prev index next >

src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/abi/x64/windows/WinVaList.java

Print this page
*** 24,10 ***
--- 24,11 ---
   *
   */
  package jdk.internal.foreign.abi.x64.windows;
  
  import jdk.incubator.foreign.CSupport;
+ import jdk.incubator.foreign.CSupport.VaList;
  import jdk.incubator.foreign.MemoryAddress;
  import jdk.incubator.foreign.MemoryHandles;
  import jdk.incubator.foreign.MemoryLayout;
  import jdk.incubator.foreign.MemorySegment;
  import jdk.internal.foreign.abi.SharedUtils;

*** 55,15 ***
  //    #define __crt_va_arg(ap, t)                                               \
  //        ((sizeof(t) > sizeof(__int64) || (sizeof(t) & (sizeof(t) - 1)) != 0) \
  //            ? **(t**)((ap += sizeof(__int64)) - sizeof(__int64))             \
  //            :  *(t* )((ap += sizeof(__int64)) - sizeof(__int64)))
  //
! class WinVaList implements CSupport.VaList {
      public static final Class<?> CARRIER = MemoryAddress.class;
      private static final long VA_SLOT_SIZE_BYTES = 8;
      private static final VarHandle VH_address = MemoryHandles.asAddressVarHandle(C_POINTER.varHandle(long.class));
  
      private final MemorySegment segment;
      private MemoryAddress ptr;
      private final List<MemorySegment> copies;
  
      WinVaList(MemorySegment segment) {
--- 56,17 ---
  //    #define __crt_va_arg(ap, t)                                               \
  //        ((sizeof(t) > sizeof(__int64) || (sizeof(t) & (sizeof(t) - 1)) != 0) \
  //            ? **(t**)((ap += sizeof(__int64)) - sizeof(__int64))             \
  //            :  *(t* )((ap += sizeof(__int64)) - sizeof(__int64)))
  //
! class WinVaList implements VaList {
      public static final Class<?> CARRIER = MemoryAddress.class;
      private static final long VA_SLOT_SIZE_BYTES = 8;
      private static final VarHandle VH_address = MemoryHandles.asAddressVarHandle(C_POINTER.varHandle(long.class));
  
+     private static final VaList EMPTY = new SharedUtils.EmptyVaList(MemoryAddress.NULL);
+ 
      private final MemorySegment segment;
      private MemoryAddress ptr;
      private final List<MemorySegment> copies;
  
      WinVaList(MemorySegment segment) {

*** 74,10 ***
--- 77,14 ---
          this.segment = segment;
          this.ptr = segment.baseAddress();
          this.copies = copies;
      }
  
+     public static final VaList empty() {
+         return EMPTY;
+     }
+ 
      @Override
      public int vargAsInt(MemoryLayout layout) {
          return (int) read(int.class, layout);
      }
  

*** 142,22 ***
  
      static Builder builder() {
          return new Builder();
      }
  
-     MemorySegment getSegment() {
-         return segment;
-     }
- 
      @Override
      public void close() {
          segment.close();
          copies.forEach(MemorySegment::close);
      }
  
      @Override
!     public CSupport.VaList copy() {
          return WinVaList.ofAddress(ptr);
      }
  
      @Override
      public MemoryAddress address() {
--- 149,18 ---
  
      static Builder builder() {
          return new Builder();
      }
  
      @Override
      public void close() {
          segment.close();
          copies.forEach(MemorySegment::close);
      }
  
      @Override
!     public VaList copy() {
          return WinVaList.ofAddress(ptr);
      }
  
      @Override
      public MemoryAddress address() {

*** 167,11 ***
      @Override
      public boolean isAlive() {
          return segment.isAlive();
      }
  
!     static class Builder implements CSupport.VaList.Builder {
  
          private final List<SimpleVaArg> args = new ArrayList<>();
  
          private Builder arg(Class<?> carrier, MemoryLayout layout, Object value) {
              SharedUtils.checkCompatibleType(carrier, layout, Windowsx64Linker.ADDRESS_SIZE);
--- 170,11 ---
      @Override
      public boolean isAlive() {
          return segment.isAlive();
      }
  
!     static class Builder implements VaList.Builder {
  
          private final List<SimpleVaArg> args = new ArrayList<>();
  
          private Builder arg(Class<?> carrier, MemoryLayout layout, Object value) {
              SharedUtils.checkCompatibleType(carrier, layout, Windowsx64Linker.ADDRESS_SIZE);

*** 202,11 ***
          @Override
          public Builder vargFromSegment(MemoryLayout layout, MemorySegment value) {
              return arg(MemorySegment.class, layout, value);
          }
  
!         public WinVaList build() {
              MemorySegment ms = MemorySegment.allocateNative(VA_SLOT_SIZE_BYTES * args.size());
              List<MemorySegment> copies = new ArrayList<>();
  
              MemoryAddress addr = ms.baseAddress();
              for (SimpleVaArg arg : args) {
--- 205,14 ---
          @Override
          public Builder vargFromSegment(MemoryLayout layout, MemorySegment value) {
              return arg(MemorySegment.class, layout, value);
          }
  
!         public VaList build() {
+             if (args.isEmpty()) {
+                 return EMPTY;
+             }
              MemorySegment ms = MemorySegment.allocateNative(VA_SLOT_SIZE_BYTES * args.size());
              List<MemorySegment> copies = new ArrayList<>();
  
              MemoryAddress addr = ms.baseAddress();
              for (SimpleVaArg arg : args) {
< prev index next >