412 assert(klass->is_klass(), "not a class");
413 assert(rank >= 1, "rank must be nonzero");
414 Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
415 oop obj = ArrayKlass::cast(klass)->multi_allocate(rank, dims, CHECK);
416 thread->set_vm_result(obj);
417 JRT_END
418
419
420 JRT_ENTRY(void, Runtime1::load_flattened_array(JavaThread* thread, valueArrayOopDesc* array, int index))
421 NOT_PRODUCT(_load_flattened_array_slowcase_cnt++;)
422 Klass* klass = array->klass();
423 assert(klass->is_valueArray_klass(), "expected value array oop");
424 assert(array->length() > 0 && index < array->length(), "already checked");
425
426 ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
427 ValueKlass* vklass = vaklass->element_klass();
428
429 // We have a non-empty flattened array, so the element type must have been initialized.
430 assert(vklass->is_initialized(), "must be");
431 Handle holder(THREAD, vklass->klass_holder()); // keep the vklass alive
432 oop obj = vklass->allocate_instance(CHECK);
433
434 void* src = array->value_at_addr(index, vaklass->layout_helper());
435 vklass->value_store(src, vklass->data_for_oop(obj),
436 vaklass->element_byte_size(), true, false);
437 thread->set_vm_result(obj);
438 JRT_END
439
440
441 JRT_ENTRY(void, Runtime1::store_flattened_array(JavaThread* thread, valueArrayOopDesc* array, int index, oopDesc* value))
442 NOT_PRODUCT(_store_flattened_array_slowcase_cnt++;)
443 if (value == NULL) {
444 SharedRuntime::throw_and_post_jvmti_exception(thread, vmSymbols::java_lang_NullPointerException());
445 } else {
446 Klass* klass = array->klass();
447 assert(klass->is_valueArray_klass(), "expected value array");
448 assert(ArrayKlass::cast(klass)->element_klass() == value->klass(), "Store type incorrect");
449
450 ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
451 ValueKlass* vklass = vaklass->element_klass();
452 const int lh = vaklass->layout_helper();
453 vklass->value_store(vklass->data_for_oop(value), array->value_at_addr(index, lh),
454 vaklass->element_byte_size(), true, false);
|
412 assert(klass->is_klass(), "not a class");
413 assert(rank >= 1, "rank must be nonzero");
414 Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
415 oop obj = ArrayKlass::cast(klass)->multi_allocate(rank, dims, CHECK);
416 thread->set_vm_result(obj);
417 JRT_END
418
419
420 JRT_ENTRY(void, Runtime1::load_flattened_array(JavaThread* thread, valueArrayOopDesc* array, int index))
421 NOT_PRODUCT(_load_flattened_array_slowcase_cnt++;)
422 Klass* klass = array->klass();
423 assert(klass->is_valueArray_klass(), "expected value array oop");
424 assert(array->length() > 0 && index < array->length(), "already checked");
425
426 ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
427 ValueKlass* vklass = vaklass->element_klass();
428
429 // We have a non-empty flattened array, so the element type must have been initialized.
430 assert(vklass->is_initialized(), "must be");
431 Handle holder(THREAD, vklass->klass_holder()); // keep the vklass alive
432 valueArrayHandle ha(THREAD, array);
433 oop obj = vklass->allocate_instance(CHECK);
434
435 void* src = ha()->value_at_addr(index, vaklass->layout_helper());
436 vklass->value_store(src, vklass->data_for_oop(obj),
437 vaklass->element_byte_size(), true, false);
438 thread->set_vm_result(obj);
439 JRT_END
440
441
442 JRT_ENTRY(void, Runtime1::store_flattened_array(JavaThread* thread, valueArrayOopDesc* array, int index, oopDesc* value))
443 NOT_PRODUCT(_store_flattened_array_slowcase_cnt++;)
444 if (value == NULL) {
445 SharedRuntime::throw_and_post_jvmti_exception(thread, vmSymbols::java_lang_NullPointerException());
446 } else {
447 Klass* klass = array->klass();
448 assert(klass->is_valueArray_klass(), "expected value array");
449 assert(ArrayKlass::cast(klass)->element_klass() == value->klass(), "Store type incorrect");
450
451 ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
452 ValueKlass* vklass = vaklass->element_klass();
453 const int lh = vaklass->layout_helper();
454 vklass->value_store(vklass->data_for_oop(value), array->value_at_addr(index, lh),
455 vaklass->element_byte_size(), true, false);
|