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); |