1.1 --- a/src/share/vm/prims/methodHandles.cpp Thu Nov 20 11:06:26 2014 +0100 1.2 +++ b/src/share/vm/prims/methodHandles.cpp Wed Nov 19 13:02:11 2014 -0500 1.3 @@ -29,7 +29,6 @@ 1.4 #include "interpreter/oopMapCache.hpp" 1.5 #include "memory/allocation.inline.hpp" 1.6 #include "memory/oopFactory.hpp" 1.7 -#include "prims/jvmtiRedefineClassesTrace.hpp" 1.8 #include "prims/methodHandles.hpp" 1.9 #include "runtime/compilationPolicy.hpp" 1.10 #include "runtime/javaCalls.hpp" 1.11 @@ -271,9 +270,12 @@ 1.12 // This is done eagerly, since it is readily available without 1.13 // constructing any new objects. 1.14 // TO DO: maybe intern mname_oop 1.15 - m->method_holder()->add_member_name(m->method_idnum(), mname); 1.16 - 1.17 - return mname(); 1.18 + if (m->method_holder()->add_member_name(mname)) { 1.19 + return mname(); 1.20 + } else { 1.21 + // Redefinition caused this to fail. Return NULL (and an exception?) 1.22 + return NULL; 1.23 + } 1.24 } 1.25 1.26 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) { 1.27 @@ -946,63 +948,27 @@ 1.28 } 1.29 } 1.30 1.31 -void MemberNameTable::add_member_name(int index, jweak mem_name_wref) { 1.32 +void MemberNameTable::add_member_name(jweak mem_name_wref) { 1.33 assert_locked_or_safepoint(MemberNameTable_lock); 1.34 - this->at_put_grow(index, mem_name_wref); 1.35 -} 1.36 - 1.37 -// Return a member name oop or NULL. 1.38 -oop MemberNameTable::get_member_name(int index) { 1.39 - assert_locked_or_safepoint(MemberNameTable_lock); 1.40 - 1.41 - jweak ref = this->at(index); 1.42 - oop mem_name = JNIHandles::resolve(ref); 1.43 - return mem_name; 1.44 + this->push(mem_name_wref); 1.45 } 1.46 1.47 #if INCLUDE_JVMTI 1.48 -oop MemberNameTable::find_member_name_by_method(Method* old_method) { 1.49 - assert_locked_or_safepoint(MemberNameTable_lock); 1.50 - oop found = NULL; 1.51 - int len = this->length(); 1.52 - 1.53 - for (int idx = 0; idx < len; idx++) { 1.54 - oop mem_name = JNIHandles::resolve(this->at(idx)); 1.55 - if (mem_name == NULL) { 1.56 - continue; 1.57 - } 1.58 - Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mem_name); 1.59 - if (method == old_method) { 1.60 - found = mem_name; 1.61 - break; 1.62 - } 1.63 - } 1.64 - return found; 1.65 -} 1.66 - 1.67 -// It is called at safepoint only 1.68 +// It is called at safepoint only for RedefineClasses 1.69 void MemberNameTable::adjust_method_entries(Method** old_methods, Method** new_methods, 1.70 int methods_length, bool *trace_name_printed) { 1.71 assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint"); 1.72 - // search the MemberNameTable for uses of either obsolete or EMCP methods 1.73 + // For each redefined method 1.74 for (int j = 0; j < methods_length; j++) { 1.75 Method* old_method = old_methods[j]; 1.76 Method* new_method = new_methods[j]; 1.77 - oop mem_name = find_member_name_by_method(old_method); 1.78 - if (mem_name != NULL) { 1.79 - java_lang_invoke_MemberName::adjust_vmtarget(mem_name, new_method); 1.80 1.81 - if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) { 1.82 - if (!(*trace_name_printed)) { 1.83 - // RC_TRACE_MESG macro has an embedded ResourceMark 1.84 - RC_TRACE_MESG(("adjust: name=%s", 1.85 - old_method->method_holder()->external_name())); 1.86 - *trace_name_printed = true; 1.87 - } 1.88 - // RC_TRACE macro has an embedded ResourceMark 1.89 - RC_TRACE(0x00400000, ("MemberName method update: %s(%s)", 1.90 - new_method->name()->as_C_string(), 1.91 - new_method->signature()->as_C_string())); 1.92 + // search the MemberNameTable for uses of either obsolete or EMCP methods 1.93 + for (int idx = 0; idx < length(); idx++) { 1.94 + oop mem_name = JNIHandles::resolve(this->at(idx)); 1.95 + if (mem_name != NULL) { 1.96 + java_lang_invoke_MemberName::adjust_vmtarget(mem_name, old_method, new_method, 1.97 + trace_name_printed); 1.98 } 1.99 } 1.100 }