src/hotspot/share/prims/resolvedMethodTable.cpp
changeset 53924 09cba396916f
parent 53904 9c3fe09f69bc
child 54431 ad9fa99fa48e
equal deleted inserted replaced
53923:c431ab7f9e85 53924:09cba396916f
   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());