< prev index next >

src/share/vm/oops/instanceKlass.cpp

Print this page

        

@@ -2424,21 +2424,10 @@
   if (jmeths != (jmethodID*)NULL) {
     release_set_methods_jmethod_ids(NULL);
     FreeHeap(jmeths);
   }
 
-  // Deallocate MemberNameTable
-  {
-    Mutex* lock_or_null = SafepointSynchronize::is_at_safepoint() ? NULL : MemberNameTable_lock;
-    MutexLockerEx ml(lock_or_null, Mutex::_no_safepoint_check_flag);
-    MemberNameTable* mnt = member_names();
-    if (mnt != NULL) {
-      delete mnt;
-      set_member_names(NULL);
-    }
-  }
-
   // release dependencies
   nmethodBucket* b = _dependencies;
   _dependencies = NULL;
   while (b != NULL) {
     nmethodBucket* next = b->next();

@@ -2785,10 +2774,60 @@
         }
       }
     }
   }
 }
+
+static void adjust_member_name_by_method(oop publishedToVM, bool *trace_name_printed,
+                                      Method* old_method, Method* new_method) {
+  // A method may appear once or twice in the member name table with different
+  // ReferenceKind, so continue looking after the first one is found.
+  for (oop member_name = publishedToVM; member_name != NULL;
+          member_name = java_lang_invoke_MemberName::next(member_name)) {
+    Method* method = (Method*) java_lang_invoke_MemberName::vmtarget(member_name);
+    if (method == old_method) {
+      java_lang_invoke_MemberName::adjust_vmtarget(member_name, new_method);
+
+      if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) {
+        if (!(*trace_name_printed)) {
+          // RC_TRACE_MESG macro has an embedded ResourceMark
+          RC_TRACE_MESG(("adjust: name=%s",
+                         old_method->method_holder()->external_name()));
+          *trace_name_printed = true;
+        }
+        // RC_TRACE macro has an embedded ResourceMark
+        RC_TRACE(0x00400000, ("MemberName method update: %s(%s)",
+                              new_method->name()->as_C_string(),
+                              new_method->signature()->as_C_string()));
+      }
+    }
+  }
+}
+
+/**
+ * Adjust the java.lang.invoke.MemberName entries in the member name table in
+ * java.lang.Class$ClassData.memberNameTable.
+ *
+ * NOTE: This is called at a safepoint only!
+ */
+void InstanceKlass::adjust_member_name_table(Method** old_methods, Method** new_methods,
+                                             int methods_length, bool *trace_name_printed) {
+  assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
+
+  // Dig out the member name table array.
+  oop class_data = java_lang_Class::classData(java_mirror());
+  if (class_data == NULL)
+    return; // was never initialized
+  oop publishedToVM = java_lang_invoke_MemberName_ClassData::publishedToVM(class_data);
+
+  // Search the MemberNameTable for uses of either obsolete or EMCP methods.
+  for (int i = 0; i < methods_length; i++) {
+    Method* old_method = old_methods[i];
+    Method* new_method = new_methods[i];
+    adjust_member_name_by_method(publishedToVM, trace_name_printed, old_method, new_method);
+  }
+}
 #endif // INCLUDE_JVMTI
 
 // On-stack replacement stuff
 void InstanceKlass::add_osr_nmethod(nmethod* n) {
   // only one compilation can be active

@@ -2910,34 +2949,10 @@
     return best;
   }
   return NULL;
 }
 
-void InstanceKlass::add_member_name(int index, Handle mem_name) {
-  jweak mem_name_wref = JNIHandles::make_weak_global(mem_name);
-  MutexLocker ml(MemberNameTable_lock);
-  assert(0 <= index && index < idnum_allocated_count(), "index is out of bounds");
-  DEBUG_ONLY(No_Safepoint_Verifier nsv);
-
-  if (_member_names == NULL) {
-    _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable(idnum_allocated_count());
-  }
-  _member_names->add_member_name(index, mem_name_wref);
-}
-
-oop InstanceKlass::get_member_name(int index) {
-  MutexLocker ml(MemberNameTable_lock);
-  assert(0 <= index && index < idnum_allocated_count(), "index is out of bounds");
-  DEBUG_ONLY(No_Safepoint_Verifier nsv);
-
-  if (_member_names == NULL) {
-    return NULL;
-  }
-  oop mem_name =_member_names->get_member_name(index);
-  return mem_name;
-}
-
 // -----------------------------------------------------------------------------------------------------
 // Printing
 
 #ifndef PRODUCT
 
< prev index next >