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