src/hotspot/share/classfile/javaClasses.cpp
changeset 54511 fbfcebad8e66
parent 54486 7fd299216e97
child 54563 ba8ab3f67aec
equal deleted inserted replaced
54510:c97a91097f9f 54511:fbfcebad8e66
  3633 void java_lang_invoke_ResolvedMethodName::set_vmtarget(oop resolved_method, Method* m) {
  3633 void java_lang_invoke_ResolvedMethodName::set_vmtarget(oop resolved_method, Method* m) {
  3634   assert(is_instance(resolved_method), "wrong type");
  3634   assert(is_instance(resolved_method), "wrong type");
  3635   resolved_method->address_field_put(_vmtarget_offset, (address)m);
  3635   resolved_method->address_field_put(_vmtarget_offset, (address)m);
  3636 }
  3636 }
  3637 
  3637 
       
  3638 void java_lang_invoke_ResolvedMethodName::set_vmholder(oop resolved_method, oop holder) {
       
  3639   assert(is_instance(resolved_method), "wrong type");
       
  3640   resolved_method->obj_field_put(_vmholder_offset, holder);
       
  3641 }
       
  3642 
  3638 oop java_lang_invoke_ResolvedMethodName::find_resolved_method(const methodHandle& m, TRAPS) {
  3643 oop java_lang_invoke_ResolvedMethodName::find_resolved_method(const methodHandle& m, TRAPS) {
       
  3644   const Method* method = m();
       
  3645 
  3639   // lookup ResolvedMethod oop in the table, or create a new one and intern it
  3646   // lookup ResolvedMethod oop in the table, or create a new one and intern it
  3640   oop resolved_method = ResolvedMethodTable::find_method(m());
  3647   oop resolved_method = ResolvedMethodTable::find_method(method);
  3641   if (resolved_method == NULL) {
  3648   if (resolved_method != NULL) {
  3642     InstanceKlass* k = SystemDictionary::ResolvedMethodName_klass();
  3649     return resolved_method;
  3643     if (!k->is_initialized()) {
  3650   }
  3644       k->initialize(CHECK_NULL);
  3651 
  3645     }
  3652   InstanceKlass* k = SystemDictionary::ResolvedMethodName_klass();
  3646     oop new_resolved_method = k->allocate_instance(CHECK_NULL);
  3653   if (!k->is_initialized()) {
  3647     new_resolved_method->address_field_put(_vmtarget_offset, (address)m());
  3654     k->initialize(CHECK_NULL);
  3648     // Add a reference to the loader (actually mirror because unsafe anonymous classes will not have
  3655   }
  3649     // distinct loaders) to ensure the metadata is kept alive.
  3656 
  3650     // This mirror may be different than the one in clazz field.
  3657   oop new_resolved_method = k->allocate_instance(CHECK_NULL);
  3651     new_resolved_method->obj_field_put(_vmholder_offset, m->method_holder()->java_mirror());
  3658 
  3652     resolved_method = ResolvedMethodTable::add_method(m, Handle(THREAD, new_resolved_method));
  3659   NoSafepointVerifier nsv;
  3653   }
  3660 
  3654   return resolved_method;
  3661   if (method->is_old()) {
       
  3662     method = (method->is_deleted()) ? Universe::throw_no_such_method_error() :
       
  3663                                       method->get_new_method();
       
  3664   }
       
  3665 
       
  3666   InstanceKlass* holder = method->method_holder();
       
  3667 
       
  3668   set_vmtarget(new_resolved_method, const_cast<Method*>(method));
       
  3669   // Add a reference to the loader (actually mirror because unsafe anonymous classes will not have
       
  3670   // distinct loaders) to ensure the metadata is kept alive.
       
  3671   // This mirror may be different than the one in clazz field.
       
  3672   set_vmholder(new_resolved_method, holder->java_mirror());
       
  3673 
       
  3674   // Set flag in class to indicate this InstanceKlass has entries in the table
       
  3675   // to avoid walking table during redefinition if none of the redefined classes
       
  3676   // have any membernames in the table.
       
  3677   holder->set_has_resolved_methods();
       
  3678 
       
  3679   return ResolvedMethodTable::add_method(method, Handle(THREAD, new_resolved_method));
  3655 }
  3680 }
  3656 
  3681 
  3657 oop java_lang_invoke_LambdaForm::vmentry(oop lform) {
  3682 oop java_lang_invoke_LambdaForm::vmentry(oop lform) {
  3658   assert(is_instance(lform), "wrong type");
  3683   assert(is_instance(lform), "wrong type");
  3659   return lform->obj_field(_vmentry_offset);
  3684   return lform->obj_field(_vmentry_offset);