2588 ObjArrayKlass::cast(ak)->initialize(CHECK_NULL);
2589 objArrayOop result = ObjArrayKlass::cast(ak)->allocate(length, CHECK_NULL);
2590 oop initial_value = JNIHandles::resolve(initialElement);
2591 if (initial_value != NULL) { // array already initialized with NULL
2592 for (int index = 0; index < length; index++) {
2593 result->obj_at_put(index, initial_value);
2594 }
2595 }
2596 ret = (jobjectArray) JNIHandles::make_local(env, result);
2597 return ret;
2598 JNI_END
2599
2600 DT_RETURN_MARK_DECL(GetObjectArrayElement, jobject
2601 , HOTSPOT_JNI_GETOBJECTARRAYELEMENT_RETURN(_ret_ref));
2602
2603 JNI_ENTRY(jobject, jni_GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index))
2604 JNIWrapper("GetObjectArrayElement");
2605 HOTSPOT_JNI_GETOBJECTARRAYELEMENT_ENTRY(env, array, index);
2606 jobject ret = NULL;
2607 DT_RETURN_MARK(GetObjectArrayElement, jobject, (const jobject&)ret);
2608 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
2609 if (a->is_within_bounds(index)) {
2610 ret = JNIHandles::make_local(env, a->obj_at(index));
2611 return ret;
2612 } else {
2613 char buf[jintAsStringSize];
2614 sprintf(buf, "%d", index);
2615 THROW_MSG_0(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf);
2616 }
2617 JNI_END
2618
2619 DT_VOID_RETURN_MARK_DECL(SetObjectArrayElement
2620 , HOTSPOT_JNI_SETOBJECTARRAYELEMENT_RETURN());
2621
2622 JNI_ENTRY(void, jni_SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value))
2623 JNIWrapper("SetObjectArrayElement");
2624 HOTSPOT_JNI_SETOBJECTARRAYELEMENT_ENTRY(env, array, index, value);
2625 DT_VOID_RETURN_MARK(SetObjectArrayElement);
2626
2627 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
2628 oop v = JNIHandles::resolve(value);
2629 if (a->is_within_bounds(index)) {
2630 if (v == NULL || v->is_a(ObjArrayKlass::cast(a->klass())->element_klass())) {
2631 a->obj_at_put(index, v);
2632 } else {
2633 ResourceMark rm(THREAD);
2634 stringStream ss;
2635 Klass *bottom_kl = ObjArrayKlass::cast(a->klass())->bottom_klass();
2636 ss.print("type mismatch: can not store %s to %s[%d]",
2637 v->klass()->external_name(),
2638 bottom_kl->is_typeArray_klass() ? type2name_tab[ArrayKlass::cast(bottom_kl)->element_type()] : bottom_kl->external_name(),
2639 index);
2640 for (int dims = ArrayKlass::cast(a->klass())->dimension(); dims > 1; --dims) {
2641 ss.print("[]");
2642 }
2643 THROW_MSG(vmSymbols::java_lang_ArrayStoreException(), ss.as_string());
2644 }
2645 } else {
2646 char buf[jintAsStringSize];
2647 sprintf(buf, "%d", index);
|
2588 ObjArrayKlass::cast(ak)->initialize(CHECK_NULL);
2589 objArrayOop result = ObjArrayKlass::cast(ak)->allocate(length, CHECK_NULL);
2590 oop initial_value = JNIHandles::resolve(initialElement);
2591 if (initial_value != NULL) { // array already initialized with NULL
2592 for (int index = 0; index < length; index++) {
2593 result->obj_at_put(index, initial_value);
2594 }
2595 }
2596 ret = (jobjectArray) JNIHandles::make_local(env, result);
2597 return ret;
2598 JNI_END
2599
2600 DT_RETURN_MARK_DECL(GetObjectArrayElement, jobject
2601 , HOTSPOT_JNI_GETOBJECTARRAYELEMENT_RETURN(_ret_ref));
2602
2603 JNI_ENTRY(jobject, jni_GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index))
2604 JNIWrapper("GetObjectArrayElement");
2605 HOTSPOT_JNI_GETOBJECTARRAYELEMENT_ENTRY(env, array, index);
2606 jobject ret = NULL;
2607 DT_RETURN_MARK(GetObjectArrayElement, jobject, (const jobject&)ret);
2608 assert(array != NULL, "Input array is NULL");
2609 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
2610 assert(a->is_objArray() == true, "Input array is not an object array.");
2611 if (a->is_within_bounds(index)) {
2612 ret = JNIHandles::make_local(env, a->obj_at(index));
2613 return ret;
2614 } else {
2615 char buf[jintAsStringSize];
2616 sprintf(buf, "%d", index);
2617 THROW_MSG_0(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf);
2618 }
2619 JNI_END
2620
2621 DT_VOID_RETURN_MARK_DECL(SetObjectArrayElement
2622 , HOTSPOT_JNI_SETOBJECTARRAYELEMENT_RETURN());
2623
2624 JNI_ENTRY(void, jni_SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value))
2625 JNIWrapper("SetObjectArrayElement");
2626 HOTSPOT_JNI_SETOBJECTARRAYELEMENT_ENTRY(env, array, index, value);
2627 DT_VOID_RETURN_MARK(SetObjectArrayElement);
2628
2629 assert(array != NULL, "Input array is NULL");
2630 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
2631 assert(a->is_objArray() == true, "Input array is not an object array.");
2632 oop v = JNIHandles::resolve(value);
2633 if (a->is_within_bounds(index)) {
2634 if (v == NULL || v->is_a(ObjArrayKlass::cast(a->klass())->element_klass())) {
2635 a->obj_at_put(index, v);
2636 } else {
2637 ResourceMark rm(THREAD);
2638 stringStream ss;
2639 Klass *bottom_kl = ObjArrayKlass::cast(a->klass())->bottom_klass();
2640 ss.print("type mismatch: can not store %s to %s[%d]",
2641 v->klass()->external_name(),
2642 bottom_kl->is_typeArray_klass() ? type2name_tab[ArrayKlass::cast(bottom_kl)->element_type()] : bottom_kl->external_name(),
2643 index);
2644 for (int dims = ArrayKlass::cast(a->klass())->dimension(); dims > 1; --dims) {
2645 ss.print("[]");
2646 }
2647 THROW_MSG(vmSymbols::java_lang_ArrayStoreException(), ss.as_string());
2648 }
2649 } else {
2650 char buf[jintAsStringSize];
2651 sprintf(buf, "%d", index);
|