< prev index next >
src/hotspot/share/oops/objArrayKlass.cpp
Print this page
rev 50331 : 8198285: More consistent Access API for arraycopy
rev 50332 : [mq]: JDK-8203232-2.patch
rev 50333 : [mq]: JDK-8198285-3.patch
*** 216,242 ****
}
return h_array();
}
// Either oop or narrowOop depending on UseCompressedOops.
! template <class T> void ObjArrayKlass::do_copy(arrayOop s, T* src,
! arrayOop d, T* dst, 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");
! HeapAccess<>::oop_arraycopy(s, d, src, dst, 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
! HeapAccess<ARRAYCOPY_DISJOINT>::oop_arraycopy(s, d, src, dst, length);
} else {
// slow case: need individual subtype checks
// note: don't use obj_at_put below because it includes a redundant store check
! if (!HeapAccess<ARRAYCOPY_DISJOINT | ARRAYCOPY_CHECKCAST>::oop_arraycopy(s, d, src, dst, length)) {
THROW(vmSymbols::java_lang_ArrayStoreException());
}
}
}
}
--- 216,242 ----
}
return h_array();
}
// Either oop or narrowOop depending on UseCompressedOops.
! template <class T> 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<T>(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<ARRAYCOPY_DISJOINT>::template oop_arraycopy<T>(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<ARRAYCOPY_DISJOINT | ARRAYCOPY_CHECKCAST>::template oop_arraycopy<T>(s, src_offset, d, dst_offset, length)) {
THROW(vmSymbols::java_lang_ArrayStoreException());
}
}
}
}
*** 287,303 ****
// points to the right of the last element.
if (length==0) {
return;
}
if (UseCompressedOops) {
! narrowOop* const src = objArrayOop(s)->obj_at_addr<narrowOop>(src_pos);
! narrowOop* const dst = objArrayOop(d)->obj_at_addr<narrowOop>(dst_pos);
! do_copy<narrowOop>(s, src, d, dst, length, CHECK);
} else {
! oop* const src = objArrayOop(s)->obj_at_addr<oop>(src_pos);
! oop* const dst = objArrayOop(d)->obj_at_addr<oop>(dst_pos);
! do_copy<oop> (s, src, d, dst, length, CHECK);
}
}
Klass* ObjArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
--- 287,307 ----
// points to the right of the last element.
if (length==0) {
return;
}
if (UseCompressedOops) {
! size_t src_offset = (size_t) objArrayOopDesc::obj_at_offset<narrowOop>(src_pos);
! size_t dst_offset = (size_t) objArrayOopDesc::obj_at_offset<narrowOop>(dst_pos);
! assert(arrayOopDesc::obj_offset_to_raw<narrowOop>(s, src_offset, NULL) == objArrayOop(s)->obj_at_addr<narrowOop>(src_pos), "sanity");
! assert(arrayOopDesc::obj_offset_to_raw<narrowOop>(d, dst_offset, NULL) == objArrayOop(d)->obj_at_addr<narrowOop>(dst_pos), "sanity");
! do_copy<narrowOop>(s, src_offset, d, dst_offset, length, CHECK);
} else {
! size_t src_offset = (size_t) objArrayOopDesc::obj_at_offset<oop>(src_pos);
! size_t dst_offset = (size_t) objArrayOopDesc::obj_at_offset<oop>(dst_pos);
! assert(arrayOopDesc::obj_offset_to_raw<oop>(s, src_offset, NULL) == objArrayOop(s)->obj_at_addr<oop>(src_pos), "sanity");
! assert(arrayOopDesc::obj_offset_to_raw<oop>(d, dst_offset, NULL) == objArrayOop(d)->obj_at_addr<oop>(dst_pos), "sanity");
! do_copy<oop> (s, src_offset, d, dst_offset, length, CHECK);
}
}
Klass* ObjArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
< prev index next >