src/share/vm/interpreter/interpreterRuntime.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/interpreter/interpreterRuntime.cpp	Wed Jun 14 12:29:22 2017
--- new/src/share/vm/interpreter/interpreterRuntime.cpp	Wed Jun 14 12:29:22 2017

*** 381,391 **** --- 381,391 ---- thread->set_vm_result(((objArrayOop) array)->obj_at(index)); } else { // Early prototype: we don't have valorind support...just allocate aref and copy ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass); ! ValueKlass* vklass = (ValueKlass*)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_value_store_size(), true, true);
*** 394,410 **** --- 394,413 ---- IRT_END IRT_ENTRY(void, InterpreterRuntime::value_array_store(JavaThread* thread, arrayOopDesc* array, int index, void* val)) Klass* klass = array->klass(); assert(klass->is_valueArray_klass() || klass->is_objArray_klass(), "expected value or object array oop"); + if (((ArrayKlass*)klass)->element_klass() != ((oop)val)->klass()) { + THROW(vmSymbols::java_lang_ArrayStoreException()); + } if (klass->is_objArray_klass()) { ((objArrayOop) array)->obj_at_put(index, (oop)val); } else { valueArrayOop varray = (valueArrayOop)array; ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass); ! ValueKlass* vklass = (ValueKlass*)vaklass->element_klass(); const int lh = vaklass->layout_helper(); vklass->value_store(vklass->data_for_oop((oop)val), varray->value_at_addr(index, lh), vaklass->element_value_store_size(), true, false); } IRT_END

src/share/vm/interpreter/interpreterRuntime.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File