< prev index next >

src/hotspot/share/prims/jni.cpp

Print this page
rev 50625 : [mq]: 8205141-ArrayStoreExceptionTest-fails-with-assert


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


< prev index next >