< prev index next >

src/hotspot/share/interpreter/interpreterRuntime.cpp

Print this page

        

*** 46,59 **** #include "oops/methodData.hpp" #include "oops/objArrayKlass.hpp" #include "oops/objArrayOop.inline.hpp" #include "oops/oop.inline.hpp" #include "oops/symbol.hpp" - #include "oops/valueKlass.hpp" #include "oops/valueArrayKlass.hpp" - #include "oops/valueArrayOop.hpp" #include "oops/valueArrayOop.inline.hpp" #include "prims/jvmtiExport.hpp" #include "prims/nativeLookup.hpp" #include "runtime/atomic.hpp" #include "runtime/biasedLocking.hpp" #include "runtime/compilationPolicy.hpp" --- 46,58 ---- #include "oops/methodData.hpp" #include "oops/objArrayKlass.hpp" #include "oops/objArrayOop.inline.hpp" #include "oops/oop.inline.hpp" #include "oops/symbol.hpp" #include "oops/valueArrayKlass.hpp" #include "oops/valueArrayOop.inline.hpp" + #include "oops/valueKlass.inline.hpp" #include "prims/jvmtiExport.hpp" #include "prims/nativeLookup.hpp" #include "runtime/atomic.hpp" #include "runtime/biasedLocking.hpp" #include "runtime/compilationPolicy.hpp"
*** 335,347 **** // Creating new value by copying the one passed in argument instanceOop new_value = vklass->allocate_instance( CHECK_((type2size[field_type]) * AbstractInterpreter::stackElementSize)); Handle new_value_h = Handle(THREAD, new_value); ! int first_offset = vklass->first_field_offset(); ! vklass->value_store(vklass->data_for_oop(old_value_h()), ! vklass->data_for_oop(new_value_h()), true, false); // Updating the field specified in arguments if (field_type == T_ARRAY || field_type == T_OBJECT) { oop aoop = *(oop*)f.interpreter_frame_expression_stack_at(tos_idx); assert(aoop == NULL || oopDesc::is_oop(aoop),"argument must be a reference type"); --- 334,344 ---- // Creating new value by copying the one passed in argument instanceOop new_value = vklass->allocate_instance( CHECK_((type2size[field_type]) * AbstractInterpreter::stackElementSize)); Handle new_value_h = Handle(THREAD, new_value); ! vklass->value_copy_oop_to_new_oop(old_value_h(), new_value_h()); // Updating the field specified in arguments if (field_type == T_ARRAY || field_type == T_OBJECT) { oop aoop = *(oop*)f.interpreter_frame_expression_stack_at(tos_idx); assert(aoop == NULL || oopDesc::is_oop(aoop),"argument must be a reference type");
*** 355,366 **** } assert(vt_oop != NULL && oopDesc::is_oop(vt_oop) && vt_oop->is_value(),"argument must be a value type"); Klass* field_k = vklass->get_value_field_klass(field_index); ValueKlass* field_vk = ValueKlass::cast(field_k); assert(field_vk == vt_oop->klass(), "Must match"); ! field_vk->value_store(field_vk->data_for_oop(vt_oop), ! ((char*)(oopDesc*)new_value_h()) + field_offset, false, false); } else { // not flattened oop voop = *(oop*)f.interpreter_frame_expression_stack_at(tos_idx); if (voop == NULL && cp_entry->is_flattenable()) { THROW_(vmSymbols::java_lang_NullPointerException(), (type2size[field_type] * AbstractInterpreter::stackElementSize)); --- 352,362 ---- } assert(vt_oop != NULL && oopDesc::is_oop(vt_oop) && vt_oop->is_value(),"argument must be a value type"); Klass* field_k = vklass->get_value_field_klass(field_index); ValueKlass* field_vk = ValueKlass::cast(field_k); assert(field_vk == vt_oop->klass(), "Must match"); ! field_vk->value_copy_oop_to_new_payload(vt_oop, ((char*)(oopDesc*)new_value_h()) + field_offset); } else { // not flattened oop voop = *(oop*)f.interpreter_frame_expression_stack_at(tos_idx); if (voop == NULL && cp_entry->is_flattenable()) { THROW_(vmSymbols::java_lang_NullPointerException(), (type2size[field_type] * AbstractInterpreter::stackElementSize));
*** 443,453 **** 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); --- 439,449 ---- 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_copy_oop_to_payload(value, ((char*)(oopDesc*)rcv) + offset); } JRT_END JRT_ENTRY(void, InterpreterRuntime::read_flattened_field(JavaThread* thread, oopDesc* obj, int index, Klass* field_holder)) Handle obj_h(THREAD, obj);
*** 464,478 **** 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 --- 460,471 ---- instanceOop res = NULL; if (field_vklass->is_empty_value()) { res = (instanceOop)field_vklass->default_value(); } else { res = field_vklass->allocate_instance(CHECK); ! field_vklass->value_copy_payload_to_new_oop(((char*)(oopDesc*)obj_h()) + klass->field_offset(index), res); } assert(res != NULL, "Must be set in one of two paths above"); thread->set_vm_result(res); JRT_END
*** 494,536 **** } thread->set_vm_result(obj); JRT_END JRT_ENTRY(void, InterpreterRuntime::value_array_load(JavaThread* thread, arrayOopDesc* array, int index)) ! Klass* klass = array->klass(); ! 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"); ! Klass* klass = array->klass(); ! assert(klass->is_valueArray_klass(), "expected value array"); ! 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); --- 487,504 ---- } thread->set_vm_result(obj); JRT_END JRT_ENTRY(void, InterpreterRuntime::value_array_load(JavaThread* thread, arrayOopDesc* array, int index)) ! valueArrayHandle vah(thread, (valueArrayOop)array); ! oop value_holder = valueArrayOopDesc::value_copy_from_index(vah, index, CHECK); 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"); ! ((valueArrayOop)array)->value_copy_to_index((oop)val, index); 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 >