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,
|