< prev index next >

src/hotspot/share/gc/z/zBarrierSet.inline.hpp

Print this page

        

*** 168,203 **** return ZBarrier::load_barrier_on_oop(o); } template <DecoratorSet decorators, typename BarrierSetT> template <typename T> ! inline bool ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::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) { T* src = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); T* dst = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); ! if (!HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value) { // No check cast, bulk barrier and bulk copy ZBarrier::load_barrier_on_oop_array(src, length); ! return Raw::oop_arraycopy_in_heap(NULL, 0, src, NULL, 0, dst, length); } // Check cast and copy each elements Klass* const dst_klass = objArrayOop(dst_obj)->element_klass(); for (const T* const end = src + length; src < end; src++, dst++) { const oop elem = ZBarrier::load_barrier_on_oop_field(src); ! if (!oopDesc::is_instanceof_or_null(elem, dst_klass)) { // Check cast failed ! return false; } // Cast is safe, since we know it's never a narrowOop *(oop*)dst = elem; } - - return true; } template <DecoratorSet decorators, typename BarrierSetT> inline void ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::clone_in_heap(oop src, oop dst, size_t size) { ZBarrier::load_barrier_on_oop_fields(src); --- 168,209 ---- return ZBarrier::load_barrier_on_oop(o); } template <DecoratorSet decorators, typename BarrierSetT> template <typename T> ! inline void ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::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) { T* src = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); T* dst = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); ! if ((!HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value) && ! (!HasDecorator<decorators, ARRAYCOPY_NOTNULL>::value)) { // No check cast, bulk barrier and bulk copy ZBarrier::load_barrier_on_oop_array(src, length); ! Raw::oop_arraycopy_in_heap(NULL, 0, src, NULL, 0, dst, length); ! return; } // Check cast and copy each elements Klass* const dst_klass = objArrayOop(dst_obj)->element_klass(); for (const T* const end = src + length; src < end; src++, dst++) { const oop elem = ZBarrier::load_barrier_on_oop_field(src); ! if (HasDecorator<decorators, ARRAYCOPY_NOTNULL>::value && elem == NULL) { ! throw_array_null_pointer_store_exception(src_obj, dst_obj, Thread::current()); ! return; ! } ! if (HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value && ! (!oopDesc::is_instanceof_or_null(elem, dst_klass))) { // Check cast failed ! throw_array_store_exception(src_obj, dst_obj, Thread::current()); ! return; } // Cast is safe, since we know it's never a narrowOop *(oop*)dst = elem; } } template <DecoratorSet decorators, typename BarrierSetT> inline void ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::clone_in_heap(oop src, oop dst, size_t size) { ZBarrier::load_barrier_on_oop_fields(src);
< prev index next >