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




 366 
 367 IRT_ENTRY(void, InterpreterRuntime::anewarray(JavaThread* thread, ConstantPool* pool, int index, jint size))
 368   Klass*    klass = pool->klass_at(index, CHECK);
 369   if (klass->is_value()) { // Logically creates elements, ensure klass init
 370     klass->initialize(CHECK);
 371   }
 372   arrayOop obj = oopFactory::new_array(klass, size, CHECK);
 373   thread->set_vm_result(obj);
 374 IRT_END
 375 
 376 IRT_ENTRY(void, InterpreterRuntime::value_array_load(JavaThread* thread, arrayOopDesc* array, int index))
 377   Klass* klass = array->klass();
 378   assert(klass->is_valueArray_klass() || klass->is_objArray_klass(), "expected value or object array oop");
 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_value_store_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_value_store_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");
 419   assert(nof_dims >= 1, "multianewarray rank must be nonzero");
 420 
 421   if (klass->is_value()) { // Logically creates elements, ensure klass init
 422     klass->initialize(CHECK);
 423   }
 424 
 425   // We must create an array of jints to pass to multi_allocate.




 366 
 367 IRT_ENTRY(void, InterpreterRuntime::anewarray(JavaThread* thread, ConstantPool* pool, int index, jint size))
 368   Klass*    klass = pool->klass_at(index, CHECK);
 369   if (klass->is_value()) { // Logically creates elements, ensure klass init
 370     klass->initialize(CHECK);
 371   }
 372   arrayOop obj = oopFactory::new_array(klass, size, CHECK);
 373   thread->set_vm_result(obj);
 374 IRT_END
 375 
 376 IRT_ENTRY(void, InterpreterRuntime::value_array_load(JavaThread* thread, arrayOopDesc* array, int index))
 377   Klass* klass = array->klass();
 378   assert(klass->is_valueArray_klass() || klass->is_objArray_klass(), "expected value or object array oop");
 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 = (ValueKlass*)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_value_store_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 (((ArrayKlass*)klass)->element_klass() != ((oop)val)->klass()) {
 400     THROW(vmSymbols::java_lang_ArrayStoreException());
 401   }
 402   if (klass->is_objArray_klass()) {
 403     ((objArrayOop) array)->obj_at_put(index, (oop)val);
 404   }
 405   else {
 406     valueArrayOop varray = (valueArrayOop)array;
 407     ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
 408     ValueKlass* vklass = (ValueKlass*)vaklass->element_klass();
 409     const int lh = vaklass->layout_helper();
 410     vklass->value_store(vklass->data_for_oop((oop)val), varray->value_at_addr(index, lh),
 411                         vaklass->element_value_store_size(), true, false);
 412   }
 413 IRT_END
 414 
 415 IRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address))
 416   // We may want to pass in more arguments - could make this slightly faster
 417   ConstantPool* constants = method(thread)->constants();
 418   int          i = get_index_u2(thread, Bytecodes::_multianewarray);
 419   Klass* klass = constants->klass_at(i, CHECK);
 420   int   nof_dims = number_of_dimensions(thread);
 421   assert(klass->is_klass(), "not a class");
 422   assert(nof_dims >= 1, "multianewarray rank must be nonzero");
 423 
 424   if (klass->is_value()) { // Logically creates elements, ensure klass init
 425     klass->initialize(CHECK);
 426   }
 427 
 428   // We must create an array of jints to pass to multi_allocate.


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