< prev index next >

src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/abi/x64/sysv/SysVVaList.java

Print this page
*** 29,14 ***
  import jdk.incubator.foreign.GroupLayout;
  import jdk.incubator.foreign.MemoryAddress;
  import jdk.incubator.foreign.MemoryHandles;
  import jdk.incubator.foreign.MemoryLayout;
  import jdk.incubator.foreign.MemorySegment;
- import jdk.internal.foreign.AbstractMemorySegmentImpl;
  import jdk.internal.foreign.NativeMemorySegmentImpl;
  import jdk.internal.foreign.Utils;
  import jdk.internal.foreign.abi.SharedUtils;
  
  import java.lang.invoke.VarHandle;
  import java.lang.ref.Cleaner;
  import java.nio.ByteOrder;
  import java.util.ArrayList;
--- 29,14 ---
  import jdk.incubator.foreign.GroupLayout;
  import jdk.incubator.foreign.MemoryAddress;
  import jdk.incubator.foreign.MemoryHandles;
  import jdk.incubator.foreign.MemoryLayout;
  import jdk.incubator.foreign.MemorySegment;
  import jdk.internal.foreign.NativeMemorySegmentImpl;
  import jdk.internal.foreign.Utils;
  import jdk.internal.foreign.abi.SharedUtils;
+ import jdk.internal.misc.Unsafe;
  
  import java.lang.invoke.VarHandle;
  import java.lang.ref.Cleaner;
  import java.nio.ByteOrder;
  import java.util.ArrayList;

*** 49,10 ***
--- 49,12 ---
  import static jdk.internal.foreign.abi.SharedUtils.checkCompatibleType;
  import static jdk.internal.foreign.abi.SharedUtils.vhPrimitiveOrAddress;
  
  // See https://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf "3.5.7 Variable Argument Lists"
  public class SysVVaList implements VaList {
+     private static final Unsafe U = Unsafe.getUnsafe();
+ 
      static final Class<?> CARRIER = MemoryAddress.class;
  
  //    struct typedef __va_list_tag __va_list_tag {
  //        unsigned int               gp_offset;            /*     0     4 */
  //        unsigned int               fp_offset;            /*     4     4 */

*** 126,11 ***
          regSaveArea = regSaveArea();
          slices.add(regSaveArea);
      }
  
      private static MemoryAddress emptyListAddress() {
!         MemorySegment ms = MemorySegment.allocateNative(LAYOUT);
          cleaner.register(SysVVaList.class, ms::close);
          MemoryAddress base = ms.baseAddress();
          VH_gp_offset.set(base, MAX_GP_OFFSET);
          VH_fp_offset.set(base, MAX_FP_OFFSET);
          VH_overflow_arg_area.set(base, MemoryAddress.NULL);
--- 128,13 ---
          regSaveArea = regSaveArea();
          slices.add(regSaveArea);
      }
  
      private static MemoryAddress emptyListAddress() {
!         long ptr = U.allocateMemory(LAYOUT.byteSize());
+         MemorySegment ms = NativeMemorySegmentImpl.makeNativeSegmentUnchecked(
+                 MemoryAddress.ofLong(ptr), LAYOUT.byteSize(), null, () -> U.freeMemory(ptr), null);
          cleaner.register(SysVVaList.class, ms::close);
          MemoryAddress base = ms.baseAddress();
          VH_gp_offset.set(base, MAX_GP_OFFSET);
          VH_fp_offset.set(base, MAX_FP_OFFSET);
          VH_overflow_arg_area.set(base, MemoryAddress.NULL);
< prev index next >