< prev index next >
src/hotspot/share/interpreter/interpreterRuntime.cpp
Print this page
*** 415,425 ****
--- 415,427 ----
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,445 ****
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");
// allocate instance
! instanceOop 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);
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);
--- 433,453 ----
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
! 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,478 ****
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);
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);
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");
--- 473,492 ----
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 = 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,493 ****
--- 495,509 ----
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 >