< prev index next >

src/share/vm/prims/jni.cpp

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

@@ -334,11 +334,11 @@
     }
     class_name = SymbolTable::new_symbol(name, CHECK_NULL);
   }
   ResourceMark rm(THREAD);
   ClassFileStream st((u1*) buf, bufLen, NULL);
-  Handle class_loader (THREAD, JNIHandles::resolve(loaderRef));
+  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,10 +573,14 @@
 
   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,11 +819,13 @@
   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,11 +2066,11 @@
   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) {
+  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,11 +2471,11 @@
   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);
+  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,11 +2570,11 @@
 
 
 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));
+  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,10 +2719,11 @@
           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,10 +2778,11 @@
           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,10 +2829,11 @@
              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,10 +2880,11 @@
              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,11 +3079,11 @@
   // 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));
+  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,11 +3098,11 @@
   // 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));
+  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,17 +3117,19 @@
 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,10 +3166,11 @@
   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,10 +3199,11 @@
     *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 >