118 MutexLocker ml(ResolvedMethodTable_lock); |
118 MutexLocker ml(ResolvedMethodTable_lock); |
119 oop entry = _the_table->lookup(method); |
119 oop entry = _the_table->lookup(method); |
120 return entry; |
120 return entry; |
121 } |
121 } |
122 |
122 |
123 oop ResolvedMethodTable::add_method(Handle resolved_method_name) { |
123 oop ResolvedMethodTable::add_method(const methodHandle& m, Handle resolved_method_name) { |
124 MutexLocker ml(ResolvedMethodTable_lock); |
124 MutexLocker ml(ResolvedMethodTable_lock); |
125 DEBUG_ONLY(NoSafepointVerifier nsv); |
125 DEBUG_ONLY(NoSafepointVerifier nsv); |
126 |
126 |
|
127 Method* method = m(); |
127 // Check if method has been redefined while taking out ResolvedMethodTable_lock, if so |
128 // Check if method has been redefined while taking out ResolvedMethodTable_lock, if so |
128 // use new method. |
129 // use new method. The old method won't be deallocated because it's passed in as a Handle. |
129 Method* method = (Method*)java_lang_invoke_ResolvedMethodName::vmtarget(resolved_method_name()); |
|
130 assert(method->is_method(), "must be method"); |
|
131 if (method->is_old()) { |
130 if (method->is_old()) { |
132 // Replace method with redefined version |
131 // Replace method with redefined version |
133 InstanceKlass* holder = method->method_holder(); |
132 InstanceKlass* holder = method->method_holder(); |
134 method = holder->method_with_idnum(method->method_idnum()); |
133 method = holder->method_with_idnum(method->method_idnum()); |
|
134 if (method == NULL) { |
|
135 // Replace deleted method with NSME. |
|
136 method = Universe::throw_no_such_method_error(); |
|
137 } |
135 java_lang_invoke_ResolvedMethodName::set_vmtarget(resolved_method_name(), method); |
138 java_lang_invoke_ResolvedMethodName::set_vmtarget(resolved_method_name(), method); |
136 } |
139 } |
137 // Set flag in class to indicate this InstanceKlass has entries in the table |
140 // Set flag in class to indicate this InstanceKlass has entries in the table |
138 // to avoid walking table during redefinition if none of the redefined classes |
141 // to avoid walking table during redefinition if none of the redefined classes |
139 // have any membernames in the table. |
142 // have any membernames in the table. |
224 } |
227 } |
225 Method* old_method = (Method*)java_lang_invoke_ResolvedMethodName::vmtarget(mem_name); |
228 Method* old_method = (Method*)java_lang_invoke_ResolvedMethodName::vmtarget(mem_name); |
226 |
229 |
227 if (old_method->is_old()) { |
230 if (old_method->is_old()) { |
228 |
231 |
229 if (old_method->is_deleted()) { |
232 Method* new_method = (old_method->is_deleted()) ? |
230 // leave deleted method in ResolvedMethod for now (this is a bug that we don't mark |
233 Universe::throw_no_such_method_error() : |
231 // these on_stack) |
234 old_method->get_new_method(); |
232 continue; |
|
233 } |
|
234 |
|
235 Method* new_method = old_method->get_new_method(); |
|
236 java_lang_invoke_ResolvedMethodName::set_vmtarget(mem_name, new_method); |
235 java_lang_invoke_ResolvedMethodName::set_vmtarget(mem_name, new_method); |
237 |
236 |
238 ResourceMark rm; |
237 ResourceMark rm; |
239 if (!(*trace_name_printed)) { |
238 if (!(*trace_name_printed)) { |
240 log_info(redefine, class, update)("adjust: name=%s", old_method->method_holder()->external_name()); |
239 log_info(redefine, class, update)("adjust: name=%s", old_method->method_holder()->external_name()); |