src/java.base/share/classes/jdk/internal/misc/Unsafe.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/java.base/share/classes/jdk/internal/misc/Unsafe.java	Fri Feb  5 13:30:06 2016
--- new/src/java.base/share/classes/jdk/internal/misc/Unsafe.java	Fri Feb  5 13:30:06 2016

*** 456,479 **** --- 456,522 ---- */ public void copyMemory(long srcAddress, long destAddress, long bytes) { copyMemory(null, srcAddress, null, destAddress, bytes); } + private boolean isPrimitiveArray(Class<?> c) { + Class<?> componentType = c.getComponentType(); + return componentType != null && componentType.isPrimitive(); + } + + private native void copySwapMemory0(Object srcBase, long srcOffset, + Object destBase, long destOffset, + long bytes, long elemSize); + + /** - * Copies all elements from one block of memory to another block, byte swapping the ! * *unconditionally* byte swapping the elements on the fly. * * <p>This method determines each block's base address by means of two parameters, * and so it provides (in effect) a <em>double-register</em> addressing mode, * as discussed in {@link #getInt(Object,long)}. When the object reference is null, * the offset supplies an absolute base address. * * @since 9 */ - public native void copySwapMemory(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes, long elemSize); + long bytes, long elemSize) { + if (bytes < 0 || srcOffset < 0 || destOffset < 0) { + throw new IllegalArgumentException(); + } + if (elemSize != 2 && elemSize != 4 && elemSize != 8) { + throw new IllegalArgumentException(); + } + if (bytes % elemSize != 0) { + throw new IllegalArgumentException(); + } + if ((srcBase == null && srcOffset == 0) || + (destBase == null && destOffset == 0)) { + throw new NullPointerException(); + } + + // Must be off-heap, or primitive heap arrays + if ((srcBase != null && !isPrimitiveArray(srcBase.getClass())) || + (destBase != null && !isPrimitiveArray(destBase.getClass()))) { + throw new IllegalArgumentException(); + } + + // Sanity check size and offsets on 32-bit platforms. Most + // significant 32 bits must be zero. + if (ADDRESS_SIZE == 4 && + (bytes >>> 32 != 0 || srcOffset >>> 32 != 0 || destOffset >>> 32 != 0)) { + throw new IllegalArgumentException(); + } + + if (bytes == 0) { + return; + } + + copySwapMemory0(srcBase, srcOffset, destBase, destOffset, bytes, elemSize); + } /** * Copies all elements from one block of memory to another block, byte swapping the * elements on the fly. *

src/java.base/share/classes/jdk/internal/misc/Unsafe.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File