< prev index next >
src/hotspot/share/gc/z/zBarrierSet.inline.hpp
Print this page
@@ -212,10 +212,27 @@
inline void ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::clone_in_heap(oop src, oop dst, size_t size) {
ZBarrier::load_barrier_on_oop_fields(src);
Raw::clone_in_heap(src, dst, size);
}
+template <DecoratorSet decorators, typename BarrierSetT>
+inline void ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::value_copy_in_heap(void* src, void* dst, ValueKlass* md) {
+ if (md->contains_oops()) {
+ // src/dst aren't oops, need offset to adjust oop map offset
+ const address src_oop_addr_offset = ((address) src) - md->first_field_offset();
+
+ OopMapBlock* map = md->start_of_nonstatic_oop_maps();
+ OopMapBlock* const end = map + md->nonstatic_oop_map_count();
+ while (map != end) {
+ address soop_address = src_oop_addr_offset + map->offset();
+ ZBarrier::load_barrier_on_oop_array((oop*) soop_address, map->count());
+ map++;
+ }
+ }
+ Raw::value_copy_in_heap(src, dst, md);
+}
+
//
// Not in heap
//
template <DecoratorSet decorators, typename BarrierSetT>
template <typename T>
< prev index next >