< prev index next >

src/share/vm/prims/jni.cpp

Print this page
rev 8961 : [mq]: diff-shenandoah.patch

*** 334,344 **** } class_name = SymbolTable::new_symbol(name, CHECK_NULL); } ResourceMark rm(THREAD); ClassFileStream st((u1*) buf, bufLen, NULL); ! Handle class_loader (THREAD, JNIHandles::resolve(loaderRef)); if (UsePerfData && !class_loader.is_null()) { // check whether the current caller thread holds the lock or not. // If not, increment the corresponding counter if (ObjectSynchronizer:: --- 334,344 ---- } class_name = SymbolTable::new_symbol(name, CHECK_NULL); } ResourceMark rm(THREAD); ClassFileStream st((u1*) buf, bufLen, NULL); ! Handle class_loader (THREAD, oopDesc::bs()->resolve_and_maybe_copy_oop(JNIHandles::resolve(loaderRef))); if (UsePerfData && !class_loader.is_null()) { // check whether the current caller thread holds the lock or not. // If not, increment the corresponding counter if (ObjectSynchronizer::
*** 573,582 **** --- 573,586 ---- HOTSPOT_JNI_ISASSIGNABLEFROM_ENTRY(env, sub, super); oop sub_mirror = JNIHandles::resolve_non_null(sub); oop super_mirror = JNIHandles::resolve_non_null(super); + + sub_mirror = oopDesc::bs()->resolve_and_maybe_copy_oop(sub_mirror); + super_mirror = oopDesc::bs()->resolve_and_maybe_copy_oop(super_mirror); + if (java_lang_Class::is_primitive(sub_mirror) || java_lang_Class::is_primitive(super_mirror)) { jboolean ret = (sub_mirror == super_mirror); HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(ret);
*** 815,825 **** --- 819,831 ---- JNIWrapper("IsSameObject"); HOTSPOT_JNI_ISSAMEOBJECT_ENTRY(env, r1, r2); oop a = JNIHandles::resolve(r1); + a = oopDesc::bs()->resolve_and_maybe_copy_oop(a); oop b = JNIHandles::resolve(r2); + b = oopDesc::bs()->resolve_and_maybe_copy_oop(b); jboolean ret = (a == b) ? JNI_TRUE : JNI_FALSE; HOTSPOT_JNI_ISSAMEOBJECT_RETURN(ret); return ret; JNI_END
*** 2060,2070 **** jobject ret = JNIHandles::make_local(env, o->obj_field(offset)); #if INCLUDE_ALL_GCS // If G1 is enabled and we are accessing the value of the referent // field in a reference object then we need to register a non-null // referent with the SATB barrier. ! if (UseG1GC) { bool needs_barrier = false; if (ret != NULL && offset == java_lang_ref_Reference::referent_offset && InstanceKlass::cast(k)->reference_type() != REF_NONE) { --- 2066,2076 ---- jobject ret = JNIHandles::make_local(env, o->obj_field(offset)); #if INCLUDE_ALL_GCS // If G1 is enabled and we are accessing the value of the referent // field in a reference object then we need to register a non-null // referent with the SATB barrier. ! if (UseG1GC || UseShenandoahGC) { bool needs_barrier = false; if (ret != NULL && offset == java_lang_ref_Reference::referent_offset && InstanceKlass::cast(k)->reference_type() != REF_NONE) {
*** 2465,2475 **** JNIEnv *env, jstring string, jboolean *isCopy)) JNIWrapper("GetStringChars"); HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy); jchar* buf = NULL; oop s = JNIHandles::resolve_non_null(string); ! typeArrayOop s_value = java_lang_String::value(s); if (s_value != NULL) { int s_len = java_lang_String::length(s); int s_offset = java_lang_String::offset(s); buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination /* JNI Specification states return NULL on OOM */ --- 2471,2481 ---- JNIEnv *env, jstring string, jboolean *isCopy)) JNIWrapper("GetStringChars"); HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy); jchar* buf = NULL; oop s = JNIHandles::resolve_non_null(string); ! typeArrayOop s_value = typeArrayOop(oopDesc::bs()->resolve_oop(java_lang_String::value(s))); if (s_value != NULL) { int s_len = java_lang_String::length(s); int s_offset = java_lang_String::offset(s); buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination /* JNI Specification states return NULL on OOM */
*** 2564,2574 **** JNI_QUICK_ENTRY(jsize, jni_GetArrayLength(JNIEnv *env, jarray array)) JNIWrapper("GetArrayLength"); HOTSPOT_JNI_GETARRAYLENGTH_ENTRY(env, array); ! arrayOop a = arrayOop(JNIHandles::resolve_non_null(array)); assert(a->is_array(), "must be array"); jsize ret = a->length(); HOTSPOT_JNI_GETARRAYLENGTH_RETURN(ret); return ret; JNI_END --- 2570,2580 ---- JNI_QUICK_ENTRY(jsize, jni_GetArrayLength(JNIEnv *env, jarray array)) JNIWrapper("GetArrayLength"); HOTSPOT_JNI_GETARRAYLENGTH_ENTRY(env, array); ! arrayOop a = arrayOop(oopDesc::bs()->resolve_oop(JNIHandles::resolve_non_null(array))); assert(a->is_array(), "must be array"); jsize ret = a->length(); HOTSPOT_JNI_GETARRAYLENGTH_RETURN(ret); return ret; JNI_END
*** 2713,2722 **** --- 2719,2729 ---- jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \ JNIWrapper("Get" XSTR(Result) "ArrayElements"); \ EntryProbe; \ /* allocate an chunk of memory in c land */ \ typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \ + a = typeArrayOop(oopDesc::bs()->resolve_oop(a)); \ ElementType* result; \ int len = a->length(); \ if (len == 0) { \ /* Empty array: legal but useless, can't return NULL. \ * Return a pointer to something useless. \
*** 2771,2780 **** --- 2778,2788 ---- jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \ ElementType *buf, jint mode)) \ JNIWrapper("Release" XSTR(Result) "ArrayElements"); \ EntryProbe; \ typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \ + a = typeArrayOop(oopDesc::bs()->resolve_and_maybe_copy_oop(a)); \ int len = a->length(); \ if (len != 0) { /* Empty array: nothing to free or copy. */ \ if ((mode == 0) || (mode == JNI_COMMIT)) { \ memcpy(a->Tag##_at_addr(0), buf, sizeof(ElementType)*len); \ } \
*** 2821,2830 **** --- 2829,2839 ---- jsize len, ElementType *buf)) \ JNIWrapper("Get" XSTR(Result) "ArrayRegion"); \ EntryProbe; \ DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \ typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \ + src = typeArrayOop(oopDesc::bs()->resolve_oop(src)); \ if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)src->length())) { \ THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \ } else { \ if (len > 0) { \ int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
*** 2871,2880 **** --- 2880,2890 ---- jsize len, const ElementType *buf)) \ JNIWrapper("Set" XSTR(Result) "ArrayRegion"); \ EntryProbe; \ DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \ typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \ + dst = typeArrayOop(oopDesc::bs()->resolve_and_maybe_copy_oop(dst)); \ if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) { \ THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \ } else { \ if (len > 0) { \ int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
*** 3069,3079 **** // If the object is null, we can't do anything with it if (jobj == NULL) { THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR); } ! Handle obj(thread, JNIHandles::resolve_non_null(jobj)); ObjectSynchronizer::jni_enter(obj, CHECK_(JNI_ERR)); ret = JNI_OK; return ret; JNI_END --- 3079,3089 ---- // If the object is null, we can't do anything with it if (jobj == NULL) { THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR); } ! Handle obj(thread, oopDesc::bs()->resolve_and_maybe_copy_oop(JNIHandles::resolve_non_null(jobj))); ObjectSynchronizer::jni_enter(obj, CHECK_(JNI_ERR)); ret = JNI_OK; return ret; JNI_END
*** 3088,3098 **** // Don't do anything with a null object if (jobj == NULL) { THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR); } ! Handle obj(THREAD, JNIHandles::resolve_non_null(jobj)); ObjectSynchronizer::jni_exit(obj(), CHECK_(JNI_ERR)); ret = JNI_OK; return ret; JNI_END --- 3098,3108 ---- // Don't do anything with a null object if (jobj == NULL) { THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR); } ! Handle obj(THREAD, oopDesc::bs()->resolve_and_maybe_copy_oop(JNIHandles::resolve_non_null(jobj))); ObjectSynchronizer::jni_exit(obj(), CHECK_(JNI_ERR)); ret = JNI_OK; return ret; JNI_END
*** 3107,3123 **** --- 3117,3135 ---- JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf)) JNIWrapper("GetStringRegion"); HOTSPOT_JNI_GETSTRINGREGION_ENTRY(env, string, start, len, buf); DT_VOID_RETURN_MARK(GetStringRegion); oop s = JNIHandles::resolve_non_null(string); + s = oopDesc::bs()->resolve_oop(s); int s_len = java_lang_String::length(s); if (start < 0 || len < 0 || start + len > s_len) { THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException()); } else { if (len > 0) { int s_offset = java_lang_String::offset(s); typeArrayOop s_value = java_lang_String::value(s); + s_value = typeArrayOop(oopDesc::bs()->resolve_oop(s_value)); memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len); } } JNI_END
*** 3154,3163 **** --- 3166,3176 ---- GC_locker::lock_critical(thread); if (isCopy != NULL) { *isCopy = JNI_FALSE; } oop a = JNIHandles::resolve_non_null(array); + a = oopDesc::bs()->resolve_and_maybe_copy_oop(a); assert(a->is_array(), "just checking"); BasicType type; if (a->is_objArray()) { type = T_OBJECT; } else {
*** 3186,3195 **** --- 3199,3209 ---- *isCopy = JNI_FALSE; } oop s = JNIHandles::resolve_non_null(string); int s_len = java_lang_String::length(s); typeArrayOop s_value = java_lang_String::value(s); + s_value = typeArrayOop(oopDesc::bs()->resolve_oop(s_value)); int s_offset = java_lang_String::offset(s); const jchar* ret; if (s_len > 0) { ret = s_value->char_at_addr(s_offset); } else {
< prev index next >