< prev index next >

src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java

Print this page
@@ -121,10 +121,21 @@
          checkRange(0, length, true);
          UNSAFE.setMemory(base(), min(), length, value);
          return this;
      }
  
+     public void copyFrom(MemorySegment src) {
+         long size = src.byteSize();
+         ((AbstractMemorySegmentImpl)src).checkRange(0, size, true);
+         checkRange(0, size, false);
+         long offsetSrc = ((AbstractMemorySegmentImpl) src).min();
+         long offsetDst = min();
+         Object baseSrc = ((AbstractMemorySegmentImpl) src).base();
+         Object baseDst = base();
+         UNSAFE.copyMemory(baseSrc, offsetSrc, baseDst, offsetDst, size);
+     }
+ 
      @Override
      @ForceInline
      public final MemoryAddress baseAddress() {
          return new MemoryAddressImpl(this, 0);
      }

@@ -226,11 +237,11 @@
      @Override
      public final byte[] toByteArray() {
          checkIntSize("byte[]");
          byte[] arr = new byte[(int)length];
          MemorySegment arrSegment = MemorySegment.ofArray(arr);
-         MemoryAddress.copy(baseAddress(), arrSegment.baseAddress(), length);
+         arrSegment.copyFrom(this);
          return arr;
      }
  
      boolean isSmall() {
          return isSet(SMALL);
< prev index next >