--- old/src/share/vm/interpreter/interpreterRuntime.cpp 2017-06-14 12:29:22.932271121 +0200 +++ new/src/share/vm/interpreter/interpreterRuntime.cpp 2017-06-14 12:29:22.244271153 +0200 @@ -383,7 +383,7 @@ else { // Early prototype: we don't have valorind support...just allocate aref and copy ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass); - ValueKlass* vklass = vaklass->element_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()); @@ -396,13 +396,16 @@ 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 = vaklass->element_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);