< 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 +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 CSupport.VaList {
+ 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 +149,18 @@
  
      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() {
+     public VaList copy() {
          return WinVaList.ofAddress(ptr);
      }
  
      @Override
      public MemoryAddress address() {

@@ -167,11 +170,11 @@
      @Override
      public boolean isAlive() {
          return segment.isAlive();
      }
  
-     static class Builder implements CSupport.VaList.Builder {
+     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 +205,14 @@
          @Override
          public Builder vargFromSegment(MemoryLayout layout, MemorySegment value) {
              return arg(MemorySegment.class, layout, value);
          }
  
-         public WinVaList build() {
+         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 >