< 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 >