< prev index next >
src/share/vm/oops/instanceKlass.cpp
Print this page
*** 2424,2444 ****
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();
--- 2424,2433 ----
*** 2785,2794 ****
--- 2774,2833 ----
}
}
}
}
}
+
+ 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,2943 ****
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
--- 2949,2958 ----
< prev index next >