--- old/src/share/vm/oops/instanceKlass.cpp 2014-10-31 13:39:08.000000000 -0400 +++ new/src/share/vm/oops/instanceKlass.cpp 2014-10-31 13:39:08.000000000 -0400 @@ -2413,17 +2413,6 @@ 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; @@ -2774,6 +2763,59 @@ } } } + +static void adjust_member_name_by_method(objArrayOop array, int size, 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 find. Concurrent + // updates on the Java side may also temporarily duplicate array elements. + for (int i = 0; i < size; i++) { + oop member_name = array->obj_at(i); + assert(member_name != NULL, ""); + 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 + objArrayOop array = java_lang_Class_ClassData::elementData(class_data); + int size = java_lang_Class_ClassData::size(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(array, size, trace_name_printed, old_method, new_method); + } +} #endif // INCLUDE_JVMTI // On-stack replacement stuff @@ -2889,30 +2931,6 @@ 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