diff --git a/src/hotspot/share/classfile/javaClasses.cpp b/src/hotspot/share/classfile/javaClasses.cpp index 2e9b5b9..9ab7af0 100644 --- a/src/hotspot/share/classfile/javaClasses.cpp +++ b/src/hotspot/share/classfile/javaClasses.cpp @@ -310,7 +310,8 @@ Handle java_lang_String::create_from_str(const char* utf8_str, TRAPS) { 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); + const jbyte* src = reinterpret_cast(utf8_str); + ArrayAccess<>::arraycopy_from_native(src, 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 +357,8 @@ Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPS) { 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); + const jbyte* src = reinterpret_cast(utf8_str); + ArrayAccess<>::arraycopy_from_native(src, 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 { diff --git a/src/hotspot/share/classfile/systemDictionaryShared.cpp b/src/hotspot/share/classfile/systemDictionaryShared.cpp index b9f4e00..2d6a299 100644 --- a/src/hotspot/share/classfile/systemDictionaryShared.cpp +++ b/src/hotspot/share/classfile/systemDictionaryShared.cpp @@ -87,8 +87,8 @@ Handle SystemDictionaryShared::get_shared_jar_manifest(int shared_path_index, TR 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(), diff --git a/src/hotspot/share/gc/shared/barrierSet.hpp b/src/hotspot/share/gc/shared/barrierSet.hpp index 9d1a359..e7b5e21 100644 --- a/src/hotspot/share/gc/shared/barrierSet.hpp +++ b/src/hotspot/share/gc/shared/barrierSet.hpp @@ -213,8 +213,12 @@ public: } template - static void arraycopy_in_heap(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) { - Raw::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + static void arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { + Raw::arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } // Heap oop accesses. These accessors get resolved when @@ -257,8 +261,12 @@ public: } template - static bool oop_arraycopy_in_heap(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 Raw::oop_arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + static bool oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { + return Raw::oop_arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } // Off-heap oop accesses. These accessors get resolved when diff --git a/src/hotspot/share/gc/shared/modRefBarrierSet.hpp b/src/hotspot/share/gc/shared/modRefBarrierSet.hpp index 9cc9e02..72b6fd4 100644 --- a/src/hotspot/share/gc/shared/modRefBarrierSet.hpp +++ b/src/hotspot/share/gc/shared/modRefBarrierSet.hpp @@ -83,7 +83,9 @@ public: static oop oop_atomic_xchg_in_heap(oop new_value, T* addr); template - static bool oop_arraycopy_in_heap(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_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length); static void clone_in_heap(oop src, oop dst, size_t size); diff --git a/src/hotspot/share/gc/shared/modRefBarrierSet.inline.hpp b/src/hotspot/share/gc/shared/modRefBarrierSet.inline.hpp index 43fe623..d84f1aa 100644 --- a/src/hotspot/share/gc/shared/modRefBarrierSet.inline.hpp +++ b/src/hotspot/share/gc/shared/modRefBarrierSet.inline.hpp @@ -91,7 +91,9 @@ oop_atomic_xchg_in_heap(oop new_value, T* addr) { template template inline bool ModRefBarrierSet::AccessBarrier:: -oop_arraycopy_in_heap(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) { +oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { BarrierSetT *bs = barrier_set_cast(barrier_set()); src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); diff --git a/src/hotspot/share/oops/access.hpp b/src/hotspot/share/oops/access.hpp index be8b8a5..6e9ec4f 100644 --- a/src/hotspot/share/oops/access.hpp +++ b/src/hotspot/share/oops/access.hpp @@ -55,7 +55,7 @@ // * atomic_cmpxchg_at: Atomically compare-and-swap a new value at an internal pointer address if previous value matched the compared value. // * atomic_xchg: Atomically swap a new value at an address if previous value matched the compared value. // * atomic_xchg_at: Atomically swap a new value at an internal pointer address if previous value matched the compared value. -// * arraycopy: Copy data from one heap array to another heap array. +// * arraycopy: Copy data from one heap array to another heap array. The ArrayAccess class has convenience functions for this. // * clone: Clone the contents of an object to a newly allocated object. // * resolve: Resolve a stable to-space invariant oop that is guaranteed not to relocate its payload until a subsequent thread transition. // * equals: Object equality, e.g. when different copies of the same objects are in use (from-space vs. to-space) @@ -130,6 +130,29 @@ class Access: public AllStatic { static const DecoratorSet atomic_xchg_mo_decorators = MO_SEQ_CST; static const DecoratorSet atomic_cmpxchg_mo_decorators = MO_RELAXED | MO_SEQ_CST; +protected: + 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); + } + + 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); + } + public: // Primitive heap accesses static inline AccessInternal::LoadAtProxy load_at(oop base, ptrdiff_t offset) { @@ -155,17 +178,6 @@ public: return AccessInternal::atomic_xchg_at(new_value, base, offset); } - 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); - } - // Oop heap accesses static inline AccessInternal::OopLoadAtProxy oop_load_at(oop base, ptrdiff_t offset) { verify_heap_oop_decorators(); @@ -197,17 +209,6 @@ public: return AccessInternal::atomic_xchg_at(new_oop_value, base, offset); } - 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); - } - // Clone an object from src to dst static inline void clone(oop src, oop dst, size_t size) { verify_decorators(); @@ -300,39 +301,48 @@ class RootAccess: public Access {}; // Helper for array access. template class ArrayAccess: public HeapAccess { + typedef HeapAccess AccessT; 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); + AccessT::arraycopy(src_obj, src_offset_in_bytes, reinterpret_cast(NULL), + dst_obj, dst_offset_in_bytes, reinterpret_cast(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); + static inline void arraycopy_to_native(arrayOop src_obj, size_t src_offset_in_bytes, + T* dst, + size_t length) { + AccessT::arraycopy(src_obj, src_offset_in_bytes, reinterpret_cast(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); + static inline void arraycopy_from_native(const T* src, + arrayOop dst_obj, size_t dst_offset_in_bytes, + size_t length) { + AccessT::arraycopy(NULL, 0, src, + dst_obj, dst_offset_in_bytes, reinterpret_cast(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); + return AccessT::oop_arraycopy(src_obj, src_offset_in_bytes, reinterpret_cast(NULL), + dst_obj, dst_offset_in_bytes, reinterpret_cast(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 AccessT::oop_arraycopy(NULL, 0, src, + NULL, 0, dst, + length); } }; diff --git a/src/hotspot/share/oops/access.inline.hpp b/src/hotspot/share/oops/access.inline.hpp index 02b80dd..57f2a15 100644 --- a/src/hotspot/share/oops/access.inline.hpp +++ b/src/hotspot/share/oops/access.inline.hpp @@ -123,16 +123,23 @@ namespace AccessInternal { template struct PostRuntimeDispatch: public AllStatic { template - static bool access_barrier(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) { - GCBarrierType::arraycopy_in_heap(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + static bool access_barrier(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { + GCBarrierType::arraycopy_in_heap(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); return true; } template - static bool oop_access_barrier(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_access_barrier(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { typedef typename HeapOopType::type OopType; - return GCBarrierType::oop_arraycopy_in_heap(src_obj, src_offset_in_bytes, reinterpret_cast(src_raw), - dst_obj, dst_offset_in_bytes, reinterpret_cast(dst_raw), length); + return GCBarrierType::oop_arraycopy_in_heap(src_obj, src_offset_in_bytes, reinterpret_cast(src_raw), + dst_obj, dst_offset_in_bytes, reinterpret_cast(dst_raw), + length); } }; @@ -336,10 +343,14 @@ namespace AccessInternal { } template - bool RuntimeDispatch::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) { + bool RuntimeDispatch::arraycopy_init(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { func_t function = BarrierResolver::resolve_barrier(); _arraycopy_func = function; - return function(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); + return function(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } template diff --git a/src/hotspot/share/oops/accessBackend.hpp b/src/hotspot/share/oops/accessBackend.hpp index 9418bab..85cc0c6 100644 --- a/src/hotspot/share/oops/accessBackend.hpp +++ b/src/hotspot/share/oops/accessBackend.hpp @@ -110,7 +110,7 @@ namespace AccessInternal { 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, + typedef bool (*arraycopy_func_t)(arrayOop src_obj, size_t src_offset_in_bytes, 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); @@ -120,7 +120,7 @@ namespace AccessInternal { template struct AccessFunctionTypes { - typedef bool (*arraycopy_func_t)(arrayOop src_obj, size_t src_offset_in_bytes, const void* src, + typedef bool (*arraycopy_func_t)(arrayOop src_obj, size_t src_offset_in_bytes, void* src, arrayOop dst_obj, size_t dst_offset_in_bytes, void* dst, size_t length); }; @@ -260,7 +260,7 @@ protected: static inline typename EnableIf< HasDecorator::value, T>::type load_internal(void* addr) { - return *reinterpret_cast(addr); + return *reinterpret_cast(addr); } template @@ -357,7 +357,7 @@ public: } template - static bool arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + static bool arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length); @@ -402,7 +402,7 @@ public: } template - static bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + static bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length); @@ -567,11 +567,11 @@ namespace AccessInternal { 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, + static bool arraycopy_init(arrayOop src_obj, size_t src_offset_in_bytes, 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, + static inline bool arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, 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, @@ -914,7 +914,7 @@ namespace AccessInternal { 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, + arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { typedef RawAccessBarrier Raw; @@ -932,7 +932,7 @@ namespace AccessInternal { 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, + arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { if (UseCompressedOops) { @@ -951,7 +951,7 @@ namespace AccessInternal { template inline static typename EnableIf< !HasDecorator::value, bool>::type - arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { if (is_hardwired_primitive()) { @@ -1124,7 +1124,7 @@ namespace AccessInternal { } template - inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, + inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, 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, @@ -1133,7 +1133,7 @@ namespace AccessInternal { } template - inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, const HeapWord* src_raw, + inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, 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; @@ -1143,7 +1143,7 @@ namespace AccessInternal { } template - inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, const narrowOop* src_raw, + inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, 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 | @@ -1291,7 +1291,7 @@ namespace AccessInternal { IsFloatingPoint::value)); // arraycopy allows type erased void elements typedef typename Decay::type DecayedT; const DecoratorSet expanded_decorators = DecoratorFixup::value; - return arraycopy_reduce_types(src_obj, src_offset_in_bytes, const_cast(src_raw), + return arraycopy_reduce_types(src_obj, src_offset_in_bytes, const_cast(src_raw), dst_obj, dst_offset_in_bytes, const_cast(dst_raw), length); } diff --git a/src/hotspot/share/oops/accessBackend.inline.hpp b/src/hotspot/share/oops/accessBackend.inline.hpp index 02540c3..51ad1b5 100644 --- a/src/hotspot/share/oops/accessBackend.inline.hpp +++ b/src/hotspot/share/oops/accessBackend.inline.hpp @@ -118,8 +118,12 @@ inline T RawAccessBarrier::oop_atomic_xchg_at(T new_value, oop base, template template -inline bool RawAccessBarrier::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) { - return arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); +inline bool RawAccessBarrier::oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { + return arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); } template @@ -247,17 +251,19 @@ public: template static inline typename EnableIf< HasDecorator::value>::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, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); dst_raw = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); // We do not check for ARRAYCOPY_ATOMIC for oops, because they are unconditionally always atomic. if (HasDecorator::value) { - AccessInternal::arraycopy_arrayof_conjoint_oops(const_cast(src_raw), dst_raw, length); + AccessInternal::arraycopy_arrayof_conjoint_oops(src_raw, dst_raw, length); } else { typedef typename HeapOopType::type OopType; - AccessInternal::arraycopy_conjoint_oops(reinterpret_cast(const_cast(src_raw)), + AccessInternal::arraycopy_conjoint_oops(reinterpret_cast(src_raw), reinterpret_cast(dst_raw), length); } } @@ -291,7 +297,9 @@ public: template static inline typename EnableIf< !HasDecorator::value>::type - arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const void* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, void* dst_raw, size_t length) { + arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const void* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, void* dst_raw, + size_t length) { src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); dst_raw = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); @@ -306,8 +314,12 @@ public: template template -inline bool RawAccessBarrier::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) { - RawAccessBarrierArrayCopy::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); +inline bool RawAccessBarrier::arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { + RawAccessBarrierArrayCopy::arraycopy(src_obj, src_offset_in_bytes, src_raw, + dst_obj, dst_offset_in_bytes, dst_raw, + length); return true; } diff --git a/src/hotspot/share/oops/objArrayKlass.cpp b/src/hotspot/share/oops/objArrayKlass.cpp index 6f5d4b8..ab0c390 100644 --- a/src/hotspot/share/oops/objArrayKlass.cpp +++ b/src/hotspot/share/oops/objArrayKlass.cpp @@ -218,23 +218,23 @@ oop ObjArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) { } // Either oop or narrowOop depending on UseCompressedOops. -template void ObjArrayKlass::do_copy(arrayOop s, size_t src_offset, - arrayOop d, size_t dst_offset, int length, TRAPS) { +void ObjArrayKlass::do_copy(arrayOop s, size_t src_offset, + arrayOop d, size_t dst_offset, int length, TRAPS) { if (oopDesc::equals(s, d)) { // since source and destination are equal we do not need conversion checks. assert(length > 0, "sanity check"); - ArrayAccess<>::template oop_arraycopy(s, src_offset, d, dst_offset, length); + ArrayAccess<>::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::template oop_arraycopy(s, src_offset, d, dst_offset, length); + ArrayAccess::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::template oop_arraycopy(s, src_offset, d, dst_offset, length)) { + if (!ArrayAccess::oop_arraycopy(s, src_offset, d, dst_offset, length)) { THROW(vmSymbols::java_lang_ArrayStoreException()); } } @@ -291,15 +291,19 @@ void ObjArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, if (UseCompressedOops) { size_t src_offset = (size_t) objArrayOopDesc::obj_at_offset(src_pos); size_t dst_offset = (size_t) objArrayOopDesc::obj_at_offset(dst_pos); - assert(arrayOopDesc::obj_offset_to_raw(s, src_offset, NULL) == objArrayOop(s)->obj_at_addr(src_pos), "sanity"); - assert(arrayOopDesc::obj_offset_to_raw(d, dst_offset, NULL) == objArrayOop(d)->obj_at_addr(dst_pos), "sanity"); - do_copy(s, src_offset, d, dst_offset, length, CHECK); + assert(arrayOopDesc::obj_offset_to_raw(s, src_offset, NULL) == + objArrayOop(s)->obj_at_addr(src_pos), "sanity"); + assert(arrayOopDesc::obj_offset_to_raw(d, dst_offset, NULL) == + objArrayOop(d)->obj_at_addr(dst_pos), "sanity"); + do_copy(s, src_offset, d, dst_offset, length, CHECK); } else { size_t src_offset = (size_t) objArrayOopDesc::obj_at_offset(src_pos); size_t dst_offset = (size_t) objArrayOopDesc::obj_at_offset(dst_pos); - assert(arrayOopDesc::obj_offset_to_raw(s, src_offset, NULL) == objArrayOop(s)->obj_at_addr(src_pos), "sanity"); - assert(arrayOopDesc::obj_offset_to_raw(d, dst_offset, NULL) == objArrayOop(d)->obj_at_addr(dst_pos), "sanity"); - do_copy (s, src_offset, d, dst_offset, length, CHECK); + assert(arrayOopDesc::obj_offset_to_raw(s, src_offset, NULL) == + objArrayOop(s)->obj_at_addr(src_pos), "sanity"); + assert(arrayOopDesc::obj_offset_to_raw(d, dst_offset, NULL) == + objArrayOop(d)->obj_at_addr(dst_pos), "sanity"); + do_copy(s, src_offset, d, dst_offset, length, CHECK); } } diff --git a/src/hotspot/share/oops/objArrayKlass.hpp b/src/hotspot/share/oops/objArrayKlass.hpp index 7d9936b..8f86e6b 100644 --- a/src/hotspot/share/oops/objArrayKlass.hpp +++ b/src/hotspot/share/oops/objArrayKlass.hpp @@ -88,9 +88,9 @@ class ObjArrayKlass : public ArrayKlass { private: // Either oop or narrowOop depending on UseCompressedOops. // must be called from within ObjArrayKlass.cpp - template void do_copy(arrayOop s, size_t src_offset, - arrayOop d, size_t dst_offset, - int length, TRAPS); + void do_copy(arrayOop s, size_t src_offset, + arrayOop d, size_t dst_offset, + int length, TRAPS); protected: // Returns the ObjArrayKlass for n'th dimension. virtual Klass* array_klass_impl(bool or_null, int n, TRAPS); diff --git a/src/hotspot/share/oops/typeArrayKlass.cpp b/src/hotspot/share/oops/typeArrayKlass.cpp index 9ef412f..4e9fca7 100644 --- a/src/hotspot/share/oops/typeArrayKlass.cpp +++ b/src/hotspot/share/oops/typeArrayKlass.cpp @@ -175,10 +175,9 @@ void TypeArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos // This is an attempt to make the copy_array fast. int l2es = log2_element_size(); - 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::template arraycopy(s, src_offset, d, dst_offset, (size_t)length << l2es); + ArrayAccess::arraycopy(s, src_offset, d, dst_offset, (size_t)length << l2es); } // create a klass of array holding typeArrays diff --git a/src/hotspot/share/prims/jni.cpp b/src/hotspot/share/prims/jni.cpp index 86e6bc4..64deba4 100644 --- a/src/hotspot/share/prims/jni.cpp +++ b/src/hotspot/share/prims/jni.cpp @@ -2466,8 +2466,8 @@ JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars( 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 @@ JNI_QUICK_ENTRY(ElementType*, \ 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 @@ JNI_QUICK_ENTRY(void, \ 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 @@ jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, 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 @@ jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, 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 @@ JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, js 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; diff --git a/src/hotspot/share/prims/unsafe.cpp b/src/hotspot/share/prims/unsafe.cpp index d252d4f..8b437b2 100644 --- a/src/hotspot/share/prims/unsafe.cpp +++ b/src/hotspot/share/prims/unsafe.cpp @@ -762,8 +762,8 @@ Unsafe_DefineAnonymousClass_impl(JNIEnv *env, // 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) {