< prev index next >

src/hotspot/share/prims/methodHandles.cpp

Print this page

 754 
 755   // skip access check if it's trusted lookup
 756   LinkInfo::AccessCheck access_check = caller != nullptr ?
 757                                               LinkInfo::AccessCheck::required :
 758                                               LinkInfo::AccessCheck::skip;
 759   // skip loader constraints if it's trusted lookup or a public lookup
 760   LinkInfo::LoaderConstraintCheck loader_constraint_check = (caller != nullptr && (lookup_mode & LM_UNCONDITIONAL) == 0) ?
 761                                               LinkInfo::LoaderConstraintCheck::required :
 762                                               LinkInfo::LoaderConstraintCheck::skip;
 763 
 764   // Time to do the lookup.
 765   switch (flags & ALL_KINDS) {
 766   case IS_METHOD:
 767     {
 768       CallInfo result;
 769       LinkInfo link_info(defc, name, type, caller, access_check, loader_constraint_check);
 770       {
 771         assert(!HAS_PENDING_EXCEPTION, "");
 772         if (ref_kind == JVM_REF_invokeStatic) {
 773           LinkResolver::resolve_static_call(result,
 774                         link_info, false, THREAD);
 775         } else if (ref_kind == JVM_REF_invokeInterface) {
 776           LinkResolver::resolve_interface_call(result, Handle(), defc,
 777                         link_info, false, THREAD);
 778         } else if (mh_invoke_id != vmIntrinsics::_none) {
 779           assert(!is_signature_polymorphic_static(mh_invoke_id), "");
 780           LinkResolver::resolve_handle_call(result, link_info, THREAD);
 781         } else if (ref_kind == JVM_REF_invokeSpecial) {
 782           LinkResolver::resolve_special_call(result, Handle(),
 783                         link_info, THREAD);
 784         } else if (ref_kind == JVM_REF_invokeVirtual) {
 785           LinkResolver::resolve_virtual_call(result, Handle(), defc,
 786                         link_info, false, THREAD);
 787         } else {
 788           assert(false, "ref_kind=%d", ref_kind);
 789         }
 790         if (HAS_PENDING_EXCEPTION) {
 791           if (speculative_resolve) {
 792             CLEAR_PENDING_EXCEPTION;
 793           }
 794           return empty;

 816           break;                // will throw after end of switch
 817         }
 818         if (HAS_PENDING_EXCEPTION) {
 819           if (speculative_resolve) {
 820             CLEAR_PENDING_EXCEPTION;
 821           }
 822           return empty;
 823         }
 824       }
 825       assert(result.is_statically_bound(), "");
 826       result.set_resolved_method_name(CHECK_(empty));
 827       oop mname2 = init_method_MemberName(mname, result);
 828       return Handle(THREAD, mname2);
 829     }
 830   case IS_FIELD:
 831     {
 832       fieldDescriptor result; // find_field initializes fd if found
 833       {
 834         assert(!HAS_PENDING_EXCEPTION, "");
 835         LinkInfo link_info(defc, name, type, caller, LinkInfo::AccessCheck::skip, loader_constraint_check);
 836         LinkResolver::resolve_field(result, link_info, Bytecodes::_nop, false, THREAD);
 837         if (HAS_PENDING_EXCEPTION) {
 838           if (speculative_resolve) {
 839             CLEAR_PENDING_EXCEPTION;
 840           }
 841           return empty;
 842         }
 843       }
 844       oop mname2 = init_field_MemberName(mname, result, ref_kind_is_setter(ref_kind));
 845       return Handle(THREAD, mname2);
 846     }
 847   default:
 848     THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format", empty);
 849   }
 850 
 851   return empty;
 852 }
 853 
 854 // Conversely, a member name which is only initialized from JVM internals
 855 // may have null defc, name, and type fields.
 856 // Resolving it plants a vmtarget/vmindex in it,

 754 
 755   // skip access check if it's trusted lookup
 756   LinkInfo::AccessCheck access_check = caller != nullptr ?
 757                                               LinkInfo::AccessCheck::required :
 758                                               LinkInfo::AccessCheck::skip;
 759   // skip loader constraints if it's trusted lookup or a public lookup
 760   LinkInfo::LoaderConstraintCheck loader_constraint_check = (caller != nullptr && (lookup_mode & LM_UNCONDITIONAL) == 0) ?
 761                                               LinkInfo::LoaderConstraintCheck::required :
 762                                               LinkInfo::LoaderConstraintCheck::skip;
 763 
 764   // Time to do the lookup.
 765   switch (flags & ALL_KINDS) {
 766   case IS_METHOD:
 767     {
 768       CallInfo result;
 769       LinkInfo link_info(defc, name, type, caller, access_check, loader_constraint_check);
 770       {
 771         assert(!HAS_PENDING_EXCEPTION, "");
 772         if (ref_kind == JVM_REF_invokeStatic) {
 773           LinkResolver::resolve_static_call(result,
 774                         link_info, StaticMode::dont_initialize_klass, THREAD);
 775         } else if (ref_kind == JVM_REF_invokeInterface) {
 776           LinkResolver::resolve_interface_call(result, Handle(), defc,
 777                         link_info, false, THREAD);
 778         } else if (mh_invoke_id != vmIntrinsics::_none) {
 779           assert(!is_signature_polymorphic_static(mh_invoke_id), "");
 780           LinkResolver::resolve_handle_call(result, link_info, THREAD);
 781         } else if (ref_kind == JVM_REF_invokeSpecial) {
 782           LinkResolver::resolve_special_call(result, Handle(),
 783                         link_info, THREAD);
 784         } else if (ref_kind == JVM_REF_invokeVirtual) {
 785           LinkResolver::resolve_virtual_call(result, Handle(), defc,
 786                         link_info, false, THREAD);
 787         } else {
 788           assert(false, "ref_kind=%d", ref_kind);
 789         }
 790         if (HAS_PENDING_EXCEPTION) {
 791           if (speculative_resolve) {
 792             CLEAR_PENDING_EXCEPTION;
 793           }
 794           return empty;

 816           break;                // will throw after end of switch
 817         }
 818         if (HAS_PENDING_EXCEPTION) {
 819           if (speculative_resolve) {
 820             CLEAR_PENDING_EXCEPTION;
 821           }
 822           return empty;
 823         }
 824       }
 825       assert(result.is_statically_bound(), "");
 826       result.set_resolved_method_name(CHECK_(empty));
 827       oop mname2 = init_method_MemberName(mname, result);
 828       return Handle(THREAD, mname2);
 829     }
 830   case IS_FIELD:
 831     {
 832       fieldDescriptor result; // find_field initializes fd if found
 833       {
 834         assert(!HAS_PENDING_EXCEPTION, "");
 835         LinkInfo link_info(defc, name, type, caller, LinkInfo::AccessCheck::skip, loader_constraint_check);
 836         LinkResolver::resolve_field(result, link_info, Bytecodes::_nop, StaticMode::dont_initialize_klass, THREAD);
 837         if (HAS_PENDING_EXCEPTION) {
 838           if (speculative_resolve) {
 839             CLEAR_PENDING_EXCEPTION;
 840           }
 841           return empty;
 842         }
 843       }
 844       oop mname2 = init_field_MemberName(mname, result, ref_kind_is_setter(ref_kind));
 845       return Handle(THREAD, mname2);
 846     }
 847   default:
 848     THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format", empty);
 849   }
 850 
 851   return empty;
 852 }
 853 
 854 // Conversely, a member name which is only initialized from JVM internals
 855 // may have null defc, name, and type fields.
 856 // Resolving it plants a vmtarget/vmindex in it,
< prev index next >