< prev index next >

src/hotspot/share/oops/objArrayKlass.cpp

Print this page

        

@@ -224,14 +224,16 @@
 
 void ObjArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d,
                                int dst_pos, int length, TRAPS) {
   assert(s->is_objArray(), "must be obj array");
 
+  if (EnableValhalla) {
   if (d->is_valueArray()) {
     ValueArrayKlass::cast(d->klass())->copy_array(s, src_pos, d, dst_pos, length, THREAD);
     return;
   }
+  }
 
   if (!d->is_objArray()) {
     THROW(vmSymbols::java_lang_ArrayStoreException());
   }
 

@@ -272,11 +274,30 @@
   // This is correct, since the position is supposed to be an 'in between point', i.e., s.length(),
   // points to the right of the last element.
   if (length==0) {
     return;
   }
-  if (UseCompressedOops) {
+  if (EnableValhalla && ArrayKlass::cast(d->klass())->element_klass()->is_value()) {
+    assert(d->is_objArray(), "Expected objArray");
+    ValueKlass* d_elem_vklass = ValueKlass::cast(ArrayKlass::cast(d->klass())->element_klass());
+    objArrayOop da = objArrayOop(d);
+    objArrayOop sa = objArrayOop(s);
+    int src_end = src_pos + length;
+    while (src_pos < src_end) {
+      oop se = sa->obj_at(src_pos);
+      if (se == NULL) {
+        THROW(vmSymbols::java_lang_NullPointerException());
+      }
+      // Check exact type per element
+      if (se->klass() != d_elem_vklass) {
+        THROW(vmSymbols::java_lang_ArrayStoreException());
+      }
+      da->obj_at_put(dst_pos, se);  // TODO: review with ValueArrayKlass::copy_array and Access API
+      dst_pos++;
+      src_pos++;
+    }
+  } else 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);
< prev index next >