391 assert(oop(dims)->is_typeArray(), "not an array"); |
391 assert(oop(dims)->is_typeArray(), "not an array"); |
392 |
392 |
393 ResourceMark rm; |
393 ResourceMark rm; |
394 jint len = dims->length(); |
394 jint len = dims->length(); |
395 assert(len > 0, "Dimensions array should contain data"); |
395 assert(len > 0, "Dimensions array should contain data"); |
396 jint *j_dims = typeArrayOop(dims)->int_at_addr(0); |
|
397 jint *c_dims = NEW_RESOURCE_ARRAY(jint, len); |
396 jint *c_dims = NEW_RESOURCE_ARRAY(jint, len); |
398 Copy::conjoint_jints_atomic(j_dims, c_dims, len); |
397 ArrayAccess<>::arraycopy_to_native<>(dims, typeArrayOopDesc::element_offset<jint>(0), |
|
398 c_dims, len); |
399 |
399 |
400 Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive |
400 Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive |
401 oop obj = ArrayKlass::cast(elem_type)->multi_allocate(len, c_dims, THREAD); |
401 oop obj = ArrayKlass::cast(elem_type)->multi_allocate(len, c_dims, THREAD); |
402 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION); |
402 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION); |
403 thread->set_vm_result(obj); |
403 thread->set_vm_result(obj); |