--- old/src/hotspot/share/classfile/javaClasses.cpp 2018-06-03 14:16:01.028218429 +0200 +++ new/src/hotspot/share/classfile/javaClasses.cpp 2018-06-03 14:16:00.653224928 +0200 @@ -310,7 +310,7 @@ Handle h_obj = basic_create(length, is_latin1, CHECK_NH); if (length > 0) { if (!has_multibyte) { - ArrayAccess<>::arraycopy_from_native(reinterpret_cast(utf8_str), value(h_obj()), typeArrayOopDesc::element_offset(0), length); + ArrayAccess<>::arraycopy_from_native<>(reinterpret_cast(utf8_str), value(h_obj()), typeArrayOopDesc::element_offset(0), length); } else if (is_latin1) { UTF8::convert_to_unicode(utf8_str, value(h_obj())->byte_at_addr(0), length); } else { @@ -356,7 +356,7 @@ Handle h_obj = basic_create(length, is_latin1, CHECK_NH); if (length > 0) { if (!has_multibyte) { - ArrayAccess<>::arraycopy_from_native(reinterpret_cast(utf8_str), value(h_obj()), typeArrayOopDesc::element_offset(0), length); + ArrayAccess<>::arraycopy_from_native<>(reinterpret_cast(utf8_str), value(h_obj()), typeArrayOopDesc::element_offset(0), length); } else if (is_latin1) { UTF8::convert_to_unicode(utf8_str, value(h_obj())->byte_at_addr(0), length); } else { --- old/src/hotspot/share/classfile/systemDictionaryShared.cpp 2018-06-03 14:16:02.451193765 +0200 +++ new/src/hotspot/share/classfile/systemDictionaryShared.cpp 2018-06-03 14:16:02.078200230 +0200 @@ -87,8 +87,8 @@ assert(src != NULL, "No Manifest data"); typeArrayOop buf = oopFactory::new_byteArray(size, CHECK_NH); typeArrayHandle bufhandle(THREAD, buf); - ArrayAccess<>::arraycopy_from_native(reinterpret_cast(src), - buf, typeArrayOopDesc::element_offset(0), size); + ArrayAccess<>::arraycopy_from_native<>(reinterpret_cast(src), + buf, typeArrayOopDesc::element_offset(0), size); Handle bais = JavaCalls::construct_new_instance(SystemDictionary::ByteArrayInputStream_klass(), vmSymbols::byte_array_void_signature(), --- old/src/hotspot/share/oops/access.hpp 2018-06-03 14:16:03.797170436 +0200 +++ new/src/hotspot/share/oops/access.hpp 2018-06-03 14:16:03.417177022 +0200 @@ -156,10 +156,14 @@ } template - static inline void arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { - verify_decorators(); - AccessInternal::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + AccessInternal::arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } // Oop heap accesses @@ -194,9 +198,14 @@ } template - static inline bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { - verify_decorators(); - return AccessInternal::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + static inline bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { + verify_decorators(); + return AccessInternal::arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } // Clone an object from src to dst @@ -293,28 +302,37 @@ class ArrayAccess: public HeapAccess { public: template - static inline void arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, arrayOop dst_obj, size_t dst_offset_in_bytes, size_t length) { - HeapAccess::arraycopy(src_obj, src_offset_in_bytes, (const T*) NULL, dst_obj, dst_offset_in_bytes, (T*) NULL, length); + static inline void arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, + arrayOop dst_obj, size_t dst_offset_in_bytes, + size_t length) { + HeapAccess::arraycopy(src_obj, src_offset_in_bytes, (const T*) NULL, + dst_obj, dst_offset_in_bytes, (T*) NULL, + length); } template static inline void arraycopy_to_native(arrayOop src_obj, size_t src_offset_in_bytes, T* dst, size_t length) { - HeapAccess::arraycopy(src_obj, src_offset_in_bytes, (const T*) NULL, NULL, 0, dst, length); + HeapAccess::arraycopy(src_obj, src_offset_in_bytes, (const T*) NULL, + NULL, 0, dst, + length); } template static inline void arraycopy_from_native(const T* src, arrayOop dst_obj, size_t dst_offset_in_bytes, size_t length) { - HeapAccess::arraycopy(NULL, 0, src, dst_obj, dst_offset_in_bytes, (T*) NULL, length); + HeapAccess::arraycopy(NULL, 0, src, dst_obj, dst_offset_in_bytes, (T*) NULL, length); } template - static inline bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, arrayOop dst_obj, size_t dst_offset_in_bytes, size_t length) { - return HeapAccess::oop_arraycopy(src_obj, src_offset_in_bytes, (const T*) NULL, dst_obj, dst_offset_in_bytes, (T*) NULL, length); + static inline bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, + arrayOop dst_obj, size_t dst_offset_in_bytes, + size_t length) { + return HeapAccess::oop_arraycopy(src_obj, src_offset_in_bytes, (const T*) NULL, + dst_obj, dst_offset_in_bytes, (T*) NULL, length); } template static inline bool oop_arraycopy_raw(T* src, T* dst, size_t length) { - return HeapAccess::oop_arraycopy(NULL, 0, src, NULL, 0, dst, length); + return HeapAccess::oop_arraycopy(NULL, 0, src, NULL, 0, dst, length); } }; --- old/src/hotspot/share/oops/accessBackend.hpp 2018-06-03 14:16:05.107147731 +0200 +++ new/src/hotspot/share/oops/accessBackend.hpp 2018-06-03 14:16:04.760153745 +0200 @@ -110,7 +110,9 @@ typedef T (*atomic_cmpxchg_func_t)(T new_value, void* addr, T compare_value); typedef T (*atomic_xchg_func_t)(T new_value, void* addr); - typedef bool (*arraycopy_func_t)(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length); + typedef bool (*arraycopy_func_t)(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length); typedef void (*clone_func_t)(oop src, oop dst, size_t size); typedef oop (*resolve_func_t)(oop obj); typedef bool (*equals_func_t)(oop o1, oop o2); @@ -118,7 +120,9 @@ template struct AccessFunctionTypes { - typedef bool (*arraycopy_func_t)(arrayOop src_obj, size_t src_offset_in_bytes, const void* src, arrayOop dst_obj, size_t dst_offset_in_bytes, void* dst, size_t length); + typedef bool (*arraycopy_func_t)(arrayOop src_obj, size_t src_offset_in_bytes, const void* src, + arrayOop dst_obj, size_t dst_offset_in_bytes, void* dst, + size_t length); }; template struct AccessFunction {}; @@ -353,7 +357,9 @@ } template - static bool arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length); + static bool arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length); template static void oop_store(void* addr, T value); @@ -396,7 +402,9 @@ } template - static bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length); + static bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length); static void clone(oop src, oop dst, size_t size); @@ -559,10 +567,16 @@ typedef typename AccessFunction::type func_t; static func_t _arraycopy_func; - static bool arraycopy_init(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length); - - static inline bool arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { - return _arraycopy_func(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + static bool arraycopy_init(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length); + + static inline bool arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { + return _arraycopy_func(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } }; @@ -900,37 +914,55 @@ template inline static typename EnableIf< HasDecorator::value && CanHardwireRaw::value, bool>::type - arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { + arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { typedef RawAccessBarrier Raw; if (HasDecorator::value) { - return Raw::oop_arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + return Raw::oop_arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } else { - return Raw::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + return Raw::arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } } template inline static typename EnableIf< HasDecorator::value && !CanHardwireRaw::value, bool>::type - arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { + arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { if (UseCompressedOops) { const DecoratorSet expanded_decorators = decorators | convert_compressed_oops; - return PreRuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + return PreRuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } else { const DecoratorSet expanded_decorators = decorators & ~convert_compressed_oops; - return PreRuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + return PreRuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } } template inline static typename EnableIf< !HasDecorator::value, bool>::type - arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { + arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { if (is_hardwired_primitive()) { const DecoratorSet expanded_decorators = decorators | AS_RAW; - return PreRuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + return PreRuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } else { - return RuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + return RuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } } @@ -1092,21 +1124,33 @@ } template - inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { - return PreRuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { + return PreRuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } template - inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, const HeapWord* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, HeapWord* dst_raw, size_t length) { + inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, const HeapWord* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, HeapWord* dst_raw, + size_t length) { const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP; - return PreRuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + return PreRuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } template - inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, const narrowOop* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, narrowOop* dst_raw, size_t length) { + inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, const narrowOop* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, narrowOop* dst_raw, + size_t length) { const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP | INTERNAL_RT_USE_COMPRESSED_OOPS; - return PreRuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + return PreRuntimeDispatch::arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } // Step 1: Set default decorators. This step remembers if a type was volatile @@ -1239,7 +1283,9 @@ } template - inline bool arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { + inline bool arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { STATIC_ASSERT((HasDecorator::value || (IsSame::value || IsIntegral::value) || IsFloatingPoint::value)); // arraycopy allows type erased void elements --- old/src/hotspot/share/oops/objArrayKlass.cpp 2018-06-03 14:16:06.407125199 +0200 +++ new/src/hotspot/share/oops/objArrayKlass.cpp 2018-06-03 14:16:06.011132063 +0200 @@ -223,18 +223,18 @@ if (oopDesc::equals(s, d)) { // since source and destination are equal we do not need conversion checks. assert(length > 0, "sanity check"); - ArrayAccess<>::oop_arraycopy(s, src_offset, d, dst_offset, length); + ArrayAccess<>::template oop_arraycopy(s, src_offset, d, dst_offset, length); } else { // We have to make sure all elements conform to the destination array Klass* bound = ObjArrayKlass::cast(d->klass())->element_klass(); Klass* stype = ObjArrayKlass::cast(s->klass())->element_klass(); if (stype == bound || stype->is_subtype_of(bound)) { // elements are guaranteed to be subtypes, so no check necessary - ArrayAccess::oop_arraycopy(s, src_offset, d, dst_offset, length); + ArrayAccess::template oop_arraycopy(s, src_offset, d, dst_offset, length); } else { // slow case: need individual subtype checks // note: don't use obj_at_put below because it includes a redundant store check - if (!ArrayAccess::oop_arraycopy(s, src_offset, d, dst_offset, length)) { + if (!ArrayAccess::template oop_arraycopy(s, src_offset, d, dst_offset, length)) { THROW(vmSymbols::java_lang_ArrayStoreException()); } } --- old/src/hotspot/share/oops/typeArrayKlass.cpp 2018-06-03 14:16:07.717102494 +0200 +++ new/src/hotspot/share/oops/typeArrayKlass.cpp 2018-06-03 14:16:07.340109028 +0200 @@ -178,7 +178,7 @@ int ihs = array_header_in_bytes() / wordSize; size_t src_offset = arrayOopDesc::base_offset_in_bytes(element_type()) + ((size_t)src_pos << l2es); size_t dst_offset = arrayOopDesc::base_offset_in_bytes(element_type()) + ((size_t)dst_pos << l2es); - ArrayAccess::arraycopy(s, src_offset, d, dst_offset, (size_t)length << l2es); + ArrayAccess::template arraycopy(s, src_offset, d, dst_offset, (size_t)length << l2es); } // create a klass of array holding typeArrays --- old/src/hotspot/share/opto/runtime.cpp 2018-06-03 14:16:09.066079113 +0200 +++ new/src/hotspot/share/opto/runtime.cpp 2018-06-03 14:16:08.704085387 +0200 @@ -394,8 +394,8 @@ jint len = dims->length(); assert(len > 0, "Dimensions array should contain data"); jint *c_dims = NEW_RESOURCE_ARRAY(jint, len); - ArrayAccess<>::arraycopy_to_native(dims, typeArrayOopDesc::element_offset(0), - c_dims, len); + ArrayAccess<>::arraycopy_to_native<>(dims, typeArrayOopDesc::element_offset(0), + c_dims, len); Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive oop obj = ArrayKlass::cast(elem_type)->multi_allocate(len, c_dims, THREAD); --- old/src/hotspot/share/prims/jni.cpp 2018-06-03 14:16:10.448055160 +0200 +++ new/src/hotspot/share/prims/jni.cpp 2018-06-03 14:16:10.078061573 +0200 @@ -2466,8 +2466,8 @@ if (buf != NULL) { if (s_len > 0) { if (!is_latin1) { - ArrayAccess<>::arraycopy_to_native(s_value, (size_t) typeArrayOopDesc::element_offset(0), - buf, s_len); + ArrayAccess<>::arraycopy_to_native<>(s_value, (size_t) typeArrayOopDesc::element_offset(0), + buf, s_len); } else { for (int i = 0; i < s_len; i++) { buf[i] = ((jchar) s_value->byte_at(i)) & 0xff; @@ -2723,8 +2723,8 @@ result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \ if (result != NULL) { \ /* copy the array to the c chunk */ \ - ArrayAccess<>::arraycopy_to_native(a, typeArrayOopDesc::element_offset(0), \ - result, len); \ + ArrayAccess<>::arraycopy_to_native<>(a, typeArrayOopDesc::element_offset(0), \ + result, len); \ if (isCopy) { \ *isCopy = JNI_TRUE; \ } \ @@ -2773,7 +2773,7 @@ int len = a->length(); \ if (len != 0) { /* Empty array: nothing to free or copy. */ \ if ((mode == 0) || (mode == JNI_COMMIT)) { \ - ArrayAccess<>::arraycopy_from_native(buf, a, typeArrayOopDesc::element_offset(0), len); \ + ArrayAccess<>::arraycopy_from_native<>(buf, a, typeArrayOopDesc::element_offset(0), len); \ } \ if ((mode == 0) || (mode == JNI_ABORT)) { \ FreeHeap(buf); \ @@ -2824,7 +2824,7 @@ THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \ } else { \ if (len > 0) { \ - ArrayAccess<>::arraycopy_to_native(src, typeArrayOopDesc::element_offset(start), buf, len); \ + ArrayAccess<>::arraycopy_to_native<>(src, typeArrayOopDesc::element_offset(start), buf, len); \ } \ } \ JNI_END @@ -2871,7 +2871,7 @@ THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \ } else { \ if (len > 0) { \ - ArrayAccess<>::arraycopy_from_native(buf, dst, typeArrayOopDesc::element_offset(start), len); \ + ArrayAccess<>::arraycopy_from_native<>(buf, dst, typeArrayOopDesc::element_offset(start), len); \ } \ } \ JNI_END @@ -3107,8 +3107,8 @@ typeArrayOop s_value = java_lang_String::value(s); bool is_latin1 = java_lang_String::is_latin1(s); if (!is_latin1) { - ArrayAccess<>::arraycopy_to_native(s_value, typeArrayOopDesc::element_offset(start), - buf, len); + ArrayAccess<>::arraycopy_to_native<>(s_value, typeArrayOopDesc::element_offset(start), + buf, len); } else { for (int i = 0; i < len; i++) { buf[i] = ((jchar) s_value->byte_at(i + start)) & 0xff; --- old/src/hotspot/share/prims/unsafe.cpp 2018-06-03 14:16:11.847030912 +0200 +++ new/src/hotspot/share/prims/unsafe.cpp 2018-06-03 14:16:11.474037377 +0200 @@ -762,8 +762,8 @@ // caller responsible to free it: *temp_alloc = class_bytes; - ArrayAccess<>::arraycopy_to_native(arrayOop(JNIHandles::resolve_non_null(data)), typeArrayOopDesc::element_offset(0), - reinterpret_cast(class_bytes), length); + ArrayAccess<>::arraycopy_to_native<>(arrayOop(JNIHandles::resolve_non_null(data)), typeArrayOopDesc::element_offset(0), + reinterpret_cast(class_bytes), length); objArrayHandle cp_patches_h; if (cp_patches_jh != NULL) {