121 }; |
121 }; |
122 |
122 |
123 template <class GCBarrierType, DecoratorSet decorators> |
123 template <class GCBarrierType, DecoratorSet decorators> |
124 struct PostRuntimeDispatch<GCBarrierType, BARRIER_ARRAYCOPY, decorators>: public AllStatic { |
124 struct PostRuntimeDispatch<GCBarrierType, BARRIER_ARRAYCOPY, decorators>: public AllStatic { |
125 template <typename T> |
125 template <typename T> |
126 static bool access_barrier(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) { |
126 static bool access_barrier(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, |
127 GCBarrierType::arraycopy_in_heap(src_obj, dst_obj, src, dst, length); |
127 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
|
128 size_t length) { |
|
129 GCBarrierType::arraycopy_in_heap(src_obj, src_offset_in_bytes, src_raw, |
|
130 dst_obj, dst_offset_in_bytes, dst_raw, |
|
131 length); |
128 return true; |
132 return true; |
129 } |
133 } |
130 |
134 |
131 template <typename T> |
135 template <typename T> |
132 static bool oop_access_barrier(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) { |
136 static bool oop_access_barrier(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, |
133 typedef typename HeapOopType<decorators>::type OopType; |
137 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
134 return GCBarrierType::oop_arraycopy_in_heap(src_obj, dst_obj, |
138 size_t length) { |
135 reinterpret_cast<OopType*>(src), |
139 typedef typename HeapOopType<decorators>::type OopType; |
136 reinterpret_cast<OopType*>(dst), length); |
140 return GCBarrierType::oop_arraycopy_in_heap(src_obj, src_offset_in_bytes, reinterpret_cast<OopType*>(src_raw), |
|
141 dst_obj, dst_offset_in_bytes, reinterpret_cast<OopType*>(dst_raw), |
|
142 length); |
137 } |
143 } |
138 }; |
144 }; |
139 |
145 |
140 template <class GCBarrierType, DecoratorSet decorators> |
146 template <class GCBarrierType, DecoratorSet decorators> |
141 struct PostRuntimeDispatch<GCBarrierType, BARRIER_STORE_AT, decorators>: public AllStatic { |
147 struct PostRuntimeDispatch<GCBarrierType, BARRIER_STORE_AT, decorators>: public AllStatic { |
335 _atomic_xchg_at_func = function; |
341 _atomic_xchg_at_func = function; |
336 return function(new_value, base, offset); |
342 return function(new_value, base, offset); |
337 } |
343 } |
338 |
344 |
339 template <DecoratorSet decorators, typename T> |
345 template <DecoratorSet decorators, typename T> |
340 bool RuntimeDispatch<decorators, T, BARRIER_ARRAYCOPY>::arraycopy_init(arrayOop src_obj, arrayOop dst_obj, T *src, T* dst, size_t length) { |
346 bool RuntimeDispatch<decorators, T, BARRIER_ARRAYCOPY>::arraycopy_init(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, |
|
347 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
|
348 size_t length) { |
341 func_t function = BarrierResolver<decorators, func_t, BARRIER_ARRAYCOPY>::resolve_barrier(); |
349 func_t function = BarrierResolver<decorators, func_t, BARRIER_ARRAYCOPY>::resolve_barrier(); |
342 _arraycopy_func = function; |
350 _arraycopy_func = function; |
343 return function(src_obj, dst_obj, src, dst, length); |
351 return function(src_obj, src_offset_in_bytes, src_raw, |
|
352 dst_obj, dst_offset_in_bytes, dst_raw, |
|
353 length); |
344 } |
354 } |
345 |
355 |
346 template <DecoratorSet decorators, typename T> |
356 template <DecoratorSet decorators, typename T> |
347 void RuntimeDispatch<decorators, T, BARRIER_CLONE>::clone_init(oop src, oop dst, size_t size) { |
357 void RuntimeDispatch<decorators, T, BARRIER_CLONE>::clone_init(oop src, oop dst, size_t size) { |
348 func_t function = BarrierResolver<decorators, func_t, BARRIER_CLONE>::resolve_barrier(); |
358 func_t function = BarrierResolver<decorators, func_t, BARRIER_CLONE>::resolve_barrier(); |