197 return; 198 } 199 if (HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value && 200 (!oopDesc::is_instanceof_or_null(elem, dst_klass))) { 201 // Check cast failed 202 throw_array_store_exception(src_obj, dst_obj, Thread::current()); 203 return; 204 } 205 206 // Cast is safe, since we know it's never a narrowOop 207 *(oop*)dst = elem; 208 } 209 } 210 211 template <DecoratorSet decorators, typename BarrierSetT> 212 inline void ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::clone_in_heap(oop src, oop dst, size_t size) { 213 ZBarrier::load_barrier_on_oop_fields(src); 214 Raw::clone_in_heap(src, dst, size); 215 } 216 217 // 218 // Not in heap 219 // 220 template <DecoratorSet decorators, typename BarrierSetT> 221 template <typename T> 222 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_not_in_heap(T* addr) { 223 verify_decorators_absent<ON_UNKNOWN_OOP_REF>(); 224 225 const oop o = Raw::oop_load_not_in_heap(addr); 226 return load_barrier_on_oop_field_preloaded(addr, o); 227 } 228 229 template <DecoratorSet decorators, typename BarrierSetT> 230 template <typename T> 231 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value) { 232 verify_decorators_present<ON_STRONG_OOP_REF>(); 233 verify_decorators_absent<AS_NO_KEEPALIVE>(); 234 235 return Raw::oop_atomic_cmpxchg_not_in_heap(new_value, addr, compare_value); 236 } | 197 return; 198 } 199 if (HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value && 200 (!oopDesc::is_instanceof_or_null(elem, dst_klass))) { 201 // Check cast failed 202 throw_array_store_exception(src_obj, dst_obj, Thread::current()); 203 return; 204 } 205 206 // Cast is safe, since we know it's never a narrowOop 207 *(oop*)dst = elem; 208 } 209 } 210 211 template <DecoratorSet decorators, typename BarrierSetT> 212 inline void ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::clone_in_heap(oop src, oop dst, size_t size) { 213 ZBarrier::load_barrier_on_oop_fields(src); 214 Raw::clone_in_heap(src, dst, size); 215 } 216 217 template <DecoratorSet decorators, typename BarrierSetT> 218 inline void ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::value_copy_in_heap(void* src, void* dst, ValueKlass* md) { 219 if (md->contains_oops()) { 220 // src/dst aren't oops, need offset to adjust oop map offset 221 const address src_oop_addr_offset = ((address) src) - md->first_field_offset(); 222 223 OopMapBlock* map = md->start_of_nonstatic_oop_maps(); 224 OopMapBlock* const end = map + md->nonstatic_oop_map_count(); 225 while (map != end) { 226 address soop_address = src_oop_addr_offset + map->offset(); 227 ZBarrier::load_barrier_on_oop_array((oop*) soop_address, map->count()); 228 map++; 229 } 230 } 231 Raw::value_copy_in_heap(src, dst, md); 232 } 233 234 // 235 // Not in heap 236 // 237 template <DecoratorSet decorators, typename BarrierSetT> 238 template <typename T> 239 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_not_in_heap(T* addr) { 240 verify_decorators_absent<ON_UNKNOWN_OOP_REF>(); 241 242 const oop o = Raw::oop_load_not_in_heap(addr); 243 return load_barrier_on_oop_field_preloaded(addr, o); 244 } 245 246 template <DecoratorSet decorators, typename BarrierSetT> 247 template <typename T> 248 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value) { 249 verify_decorators_present<ON_STRONG_OOP_REF>(); 250 verify_decorators_absent<AS_NO_KEEPALIVE>(); 251 252 return Raw::oop_atomic_cmpxchg_not_in_heap(new_value, addr, compare_value); 253 } |