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. |