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

src/share/vm/interpreter/interpreterRuntime.cpp

Print this page




 379 
 380   if (klass->is_objArray_klass()) {
 381     thread->set_vm_result(((objArrayOop) array)->obj_at(index));
 382   }
 383   else {
 384     // Early prototype: we don't have valorind support...just allocate aref and copy
 385     ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
 386     ValueKlass* vklass = vaklass->element_klass();
 387     arrayHandle ah(THREAD, array);
 388     instanceOop value_holder = vklass->allocate_instance(CHECK);
 389     void* src = ((valueArrayOop)ah())->value_at_addr(index, vaklass->layout_helper());
 390     vklass->value_store(src, vklass->data_for_oop(value_holder),
 391                           vaklass->element_byte_size(), true, true);
 392     thread->set_vm_result(value_holder);
 393   }
 394 IRT_END
 395 
 396 IRT_ENTRY(void, InterpreterRuntime::value_array_store(JavaThread* thread, arrayOopDesc* array, int index, void* val))
 397   Klass* klass = array->klass();
 398   assert(klass->is_valueArray_klass() || klass->is_objArray_klass(), "expected value or object array oop");




 399   if (klass->is_objArray_klass()) {
 400     ((objArrayOop) array)->obj_at_put(index, (oop)val);
 401   }
 402   else {
 403     valueArrayOop varray = (valueArrayOop)array;
 404     ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
 405     ValueKlass* vklass = vaklass->element_klass();
 406     const int lh = vaklass->layout_helper();
 407     vklass->value_store(vklass->data_for_oop((oop)val), varray->value_at_addr(index, lh),
 408                         vaklass->element_byte_size(), true, false);
 409   }
 410 IRT_END
 411 
 412 IRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address))
 413   // We may want to pass in more arguments - could make this slightly faster
 414   ConstantPool* constants = method(thread)->constants();
 415   int          i = get_index_u2(thread, Bytecodes::_multianewarray);
 416   Klass* klass = constants->klass_at(i, CHECK);
 417   int   nof_dims = number_of_dimensions(thread);
 418   assert(klass->is_klass(), "not a class");




 379 
 380   if (klass->is_objArray_klass()) {
 381     thread->set_vm_result(((objArrayOop) array)->obj_at(index));
 382   }
 383   else {
 384     // Early prototype: we don't have valorind support...just allocate aref and copy
 385     ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
 386     ValueKlass* vklass = vaklass->element_klass();
 387     arrayHandle ah(THREAD, array);
 388     instanceOop value_holder = vklass->allocate_instance(CHECK);
 389     void* src = ((valueArrayOop)ah())->value_at_addr(index, vaklass->layout_helper());
 390     vklass->value_store(src, vklass->data_for_oop(value_holder),
 391                           vaklass->element_byte_size(), true, true);
 392     thread->set_vm_result(value_holder);
 393   }
 394 IRT_END
 395 
 396 IRT_ENTRY(void, InterpreterRuntime::value_array_store(JavaThread* thread, arrayOopDesc* array, int index, void* val))
 397   Klass* klass = array->klass();
 398   assert(klass->is_valueArray_klass() || klass->is_objArray_klass(), "expected value or object array oop");
 399 
 400   if (ArrayKlass::cast(klass)->element_klass() != ((oop)val)->klass()) {
 401     THROW(vmSymbols::java_lang_ArrayStoreException());
 402   }
 403   if (klass->is_objArray_klass()) {
 404     ((objArrayOop) array)->obj_at_put(index, (oop)val);
 405   }
 406   else {
 407     valueArrayOop varray = (valueArrayOop)array;
 408     ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
 409     ValueKlass* vklass = vaklass->element_klass();
 410     const int lh = vaklass->layout_helper();
 411     vklass->value_store(vklass->data_for_oop((oop)val), varray->value_at_addr(index, lh),
 412                         vaklass->element_byte_size(), true, false);
 413   }
 414 IRT_END
 415 
 416 IRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address))
 417   // We may want to pass in more arguments - could make this slightly faster
 418   ConstantPool* constants = method(thread)->constants();
 419   int          i = get_index_u2(thread, Bytecodes::_multianewarray);
 420   Klass* klass = constants->klass_at(i, CHECK);
 421   int   nof_dims = number_of_dimensions(thread);
 422   assert(klass->is_klass(), "not a class");


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