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"); |