< prev index next >

src/hotspot/share/oops/valueArrayOop.inline.hpp

Print this page

        

@@ -26,10 +26,11 @@
 #define SHARE_VM_OOPS_VALUEARRAYOOP_INLINE_HPP
 
 #include "oops/access.inline.hpp"
 #include "oops/arrayOop.inline.hpp"
 #include "oops/valueArrayOop.hpp"
+#include "oops/valueKlass.inline.hpp"
 #include "oops/oop.inline.hpp"
 #include "runtime/globals.hpp"
 
 inline void* valueArrayOopDesc::base() const { return arrayOopDesc::base(T_VALUETYPE); }
 

@@ -43,8 +44,41 @@
 
 inline int valueArrayOopDesc::object_size() const {
   return object_size(klass()->layout_helper(), length());
 }
 
+inline oop valueArrayOopDesc::value_copy_from_index(valueArrayHandle vah, int index, TRAPS) {
+  ValueArrayKlass* vaklass = ValueArrayKlass::cast(vah->klass());
+  ValueKlass* vklass = vaklass->element_klass();
+  if (vklass->is_empty_value()) {
+    return vklass->default_value();
+  } else {
+    oop buf = vklass->allocate_instance(CHECK_NULL);
+    vklass->value_copy_payload_to_new_oop(vah->value_at_addr(index, vaklass->layout_helper()) ,buf);
+    return buf;
+  }
+}
+
+inline void valueArrayOopDesc::value_copy_from_index(int index, oop dst) const {
+  ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass());
+  ValueKlass* vklass = vaklass->element_klass();
+  if (vklass->is_empty_value()) {
+    return; // Assumes dst was a new and clean buffer (OptoRuntime::load_unknown_value())
+  } else {
+    void* src = value_at_addr(index, vaklass->layout_helper());
+    return vklass->value_copy_payload_to_new_oop(src ,dst);
+  }
+}
+
+inline void valueArrayOopDesc::value_copy_to_index(oop src, int index) const {
+  ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass());
+  ValueKlass* vklass = vaklass->element_klass();
+  if (vklass->is_empty_value()) {
+    return;
+  }
+  void* dst = value_at_addr(index, vaklass->layout_helper());
+  vklass->value_copy_oop_to_payload(src, dst);
+}
+
 
 
 #endif // SHARE_VM_OOPS_VALUEARRAYOOP_INLINE_HPP
< prev index next >