< prev index next >
src/hotspot/share/c1/c1_Runtime1.cpp
Print this page
rev 49182 : 8198445: Access API for primitive/native arraycopy
rev 49183 : [mq]: 8198445-1.patch
@@ -1400,17 +1400,12 @@
if (length == 0) return ac_ok;
if (src->is_typeArray()) {
Klass* klass_oop = src->klass();
if (klass_oop != dst->klass()) return ac_failed;
TypeArrayKlass* klass = TypeArrayKlass::cast(klass_oop);
- const int l2es = klass->log2_element_size();
- const int ihs = klass->array_header_in_bytes() / wordSize;
- char* src_addr = (char*) ((oopDesc**)src + ihs) + (src_pos << l2es);
- char* dst_addr = (char*) ((oopDesc**)dst + ihs) + (dst_pos << l2es);
- // Potential problem: memmove is not guaranteed to be word atomic
- // Revisit in Merlin
- return HeapAccess<>::arraycopy(arrayOop(src), arrayOop(dst), src_addr, dst_addr, length << l2es) ? ac_ok : ac_failed;
+ klass->copy_array(arrayOop(src), src_pos, arrayOop(dst), dst_pos, length, Thread::current());
+ return ac_ok;
} else if (src->is_objArray() && dst->is_objArray()) {
if (UseCompressedOops) {
narrowOop *src_addr = objArrayOop(src)->obj_at_addr<narrowOop>(src_pos);
narrowOop *dst_addr = objArrayOop(dst)->obj_at_addr<narrowOop>(dst_pos);
return obj_arraycopy_work(src, src_addr, dst, dst_addr, length);
< prev index next >