--- a/src/hotspot/share/prims/resolvedMethodTable.cpp Wed Feb 13 12:01:09 2019 +0100
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp Tue Feb 26 08:01:20 2019 -0500
@@ -120,18 +120,21 @@
return entry;
}
-oop ResolvedMethodTable::add_method(Handle resolved_method_name) {
+oop ResolvedMethodTable::add_method(const methodHandle& m, Handle resolved_method_name) {
MutexLocker ml(ResolvedMethodTable_lock);
DEBUG_ONLY(NoSafepointVerifier nsv);
+ Method* method = m();
// Check if method has been redefined while taking out ResolvedMethodTable_lock, if so
- // use new method.
- Method* method = (Method*)java_lang_invoke_ResolvedMethodName::vmtarget(resolved_method_name());
- assert(method->is_method(), "must be method");
+ // use new method. The old method won't be deallocated because it's passed in as a Handle.
if (method->is_old()) {
// Replace method with redefined version
InstanceKlass* holder = method->method_holder();
method = holder->method_with_idnum(method->method_idnum());
+ if (method == NULL) {
+ // Replace deleted method with NSME.
+ method = Universe::throw_no_such_method_error();
+ }
java_lang_invoke_ResolvedMethodName::set_vmtarget(resolved_method_name(), method);
}
// Set flag in class to indicate this InstanceKlass has entries in the table
@@ -226,13 +229,9 @@
if (old_method->is_old()) {
- if (old_method->is_deleted()) {
- // leave deleted method in ResolvedMethod for now (this is a bug that we don't mark
- // these on_stack)
- continue;
- }
-
- Method* new_method = old_method->get_new_method();
+ Method* new_method = (old_method->is_deleted()) ?
+ Universe::throw_no_such_method_error() :
+ old_method->get_new_method();
java_lang_invoke_ResolvedMethodName::set_vmtarget(mem_name, new_method);
ResourceMark rm;