< prev index next >

src/hotspot/share/interpreter/interpreterRuntime.cpp

Print this page

        

@@ -415,11 +415,13 @@
   assert(oopDesc::is_oop(value), "Sanity check");
   assert(oopDesc::is_oop(rcv), "Sanity check");
   assert(value->is_value(), "Sanity check");
 
   ValueKlass* vklass = ValueKlass::cast(value->klass());
+  if (!vklass->is_empty_value()) {
   vklass->value_store(vklass->data_for_oop(value), ((char*)(oopDesc*)rcv) + offset, true, true);
+  }
 JRT_END
 
 JRT_ENTRY(void, InterpreterRuntime::read_flattened_field(JavaThread* thread, oopDesc* obj, int index, Klass* field_holder))
   Handle obj_h(THREAD, obj);
 

@@ -431,15 +433,21 @@
   assert(klass->field_is_flattened(index), "Sanity check");
 
   ValueKlass* field_vklass = ValueKlass::cast(klass->get_value_field_klass(index));
   assert(field_vklass->is_initialized(), "Must be initialized at this point");
 
+  instanceOop res = NULL;
+  if (field_vklass->is_empty_value()) {
+    res = (instanceOop)field_vklass->default_value();
+  } else {
   // allocate instance
-  instanceOop res = field_vklass->allocate_instance(CHECK);
+    res = field_vklass->allocate_instance(CHECK);
   // copy value
   field_vklass->value_store(((char*)(oopDesc*)obj_h()) + klass->field_offset(index),
                             field_vklass->data_for_oop(res), true, true);
+  }
+  assert(res != NULL, "Must be set in one of two paths above");
   thread->set_vm_result(res);
 JRT_END
 
 JRT_ENTRY(void, InterpreterRuntime::newarray(JavaThread* thread, BasicType type, jint size))
   oop obj = oopFactory::new_typeArray(type, size, CHECK);

@@ -465,14 +473,20 @@
   assert(klass->is_valueArray_klass(), "expected value array oop");
 
   ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
   ValueKlass* vklass = vaklass->element_klass();
   arrayHandle ah(THREAD, array);
-  instanceOop value_holder = vklass->allocate_instance(CHECK);
+  instanceOop value_holder = NULL;
+  if (vklass->is_empty_value()) {
+    value_holder = (instanceOop)vklass->default_value();
+  } else {
+    value_holder = vklass->allocate_instance(CHECK);
   void* src = ((valueArrayOop)ah())->value_at_addr(index, vaklass->layout_helper());
   vklass->value_store(src, vklass->data_for_oop(value_holder),
                         vaklass->element_byte_size(), true, false);
+  }
+  assert(value_holder != NULL, "Must be set in one of two paths above");
   thread->set_vm_result(value_holder);
 JRT_END
 
 JRT_ENTRY(void, InterpreterRuntime::value_array_store(JavaThread* thread, void* val, arrayOopDesc* array, int index))
   assert(val != NULL, "can't store null into flat array");

@@ -481,13 +495,15 @@
   assert(ArrayKlass::cast(klass)->element_klass() == ((oop)val)->klass(), "Store type incorrect");
 
   valueArrayOop varray = (valueArrayOop)array;
   ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
   ValueKlass* vklass = vaklass->element_klass();
+  if (!vklass->is_empty_value()) {
   const int lh = vaklass->layout_helper();
   vklass->value_store(vklass->data_for_oop((oop)val), varray->value_at_addr(index, lh),
                       vaklass->element_byte_size(), true, false);
+  }
 JRT_END
 
 JRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address))
   // We may want to pass in more arguments - could make this slightly faster
   LastFrameAccessor last_frame(thread);
< prev index next >