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