304 flags |= CALLER_SENSITIVE; |
304 flags |= CALLER_SENSITIVE; |
305 } |
305 } |
306 |
306 |
307 Handle resolved_method = info.resolved_method_name(); |
307 Handle resolved_method = info.resolved_method_name(); |
308 assert(java_lang_invoke_ResolvedMethodName::vmtarget(resolved_method()) == m(), |
308 assert(java_lang_invoke_ResolvedMethodName::vmtarget(resolved_method()) == m(), |
309 "Should not change after link resolultion"); |
309 "Should not change after link resolution"); |
310 |
310 |
311 oop mname_oop = mname(); |
311 oop mname_oop = mname(); |
312 java_lang_invoke_MemberName::set_flags (mname_oop, flags); |
312 java_lang_invoke_MemberName::set_flags (mname_oop, flags); |
313 java_lang_invoke_MemberName::set_method (mname_oop, resolved_method()); |
313 java_lang_invoke_MemberName::set_method (mname_oop, resolved_method()); |
314 java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex); // vtable/itable index |
314 java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex); // vtable/itable index |
680 |
680 |
681 |
681 |
682 // An unresolved member name is a mere symbolic reference. |
682 // An unresolved member name is a mere symbolic reference. |
683 // Resolving it plants a vmtarget/vmindex in it, |
683 // Resolving it plants a vmtarget/vmindex in it, |
684 // which refers directly to JVM internals. |
684 // which refers directly to JVM internals. |
685 Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller, TRAPS) { |
685 Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller, |
|
686 bool speculative_resolve, TRAPS) { |
686 Handle empty; |
687 Handle empty; |
687 assert(java_lang_invoke_MemberName::is_instance(mname()), ""); |
688 assert(java_lang_invoke_MemberName::is_instance(mname()), ""); |
688 |
689 |
689 if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) { |
690 if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) { |
690 // Already resolved. |
691 // Already resolved. |
779 link_info, false, THREAD); |
780 link_info, false, THREAD); |
780 } else { |
781 } else { |
781 assert(false, "ref_kind=%d", ref_kind); |
782 assert(false, "ref_kind=%d", ref_kind); |
782 } |
783 } |
783 if (HAS_PENDING_EXCEPTION) { |
784 if (HAS_PENDING_EXCEPTION) { |
|
785 if (speculative_resolve) { |
|
786 CLEAR_PENDING_EXCEPTION; |
|
787 } |
784 return empty; |
788 return empty; |
785 } |
789 } |
786 } |
790 } |
787 if (result.resolved_appendix().not_null()) { |
791 if (result.resolved_appendix().not_null()) { |
788 // The resolved MemberName must not be accompanied by an appendix argument, |
792 // The resolved MemberName must not be accompanied by an appendix argument, |
804 LinkResolver::resolve_special_call(result, Handle(), link_info, THREAD); |
808 LinkResolver::resolve_special_call(result, Handle(), link_info, THREAD); |
805 } else { |
809 } else { |
806 break; // will throw after end of switch |
810 break; // will throw after end of switch |
807 } |
811 } |
808 if (HAS_PENDING_EXCEPTION) { |
812 if (HAS_PENDING_EXCEPTION) { |
|
813 if (speculative_resolve) { |
|
814 CLEAR_PENDING_EXCEPTION; |
|
815 } |
809 return empty; |
816 return empty; |
810 } |
817 } |
811 } |
818 } |
812 assert(result.is_statically_bound(), ""); |
819 assert(result.is_statically_bound(), ""); |
813 result.set_resolved_method_name(CHECK_(empty)); |
820 result.set_resolved_method_name(CHECK_(empty)); |
820 { |
827 { |
821 assert(!HAS_PENDING_EXCEPTION, ""); |
828 assert(!HAS_PENDING_EXCEPTION, ""); |
822 LinkInfo link_info(defc, name, type, caller, LinkInfo::skip_access_check); |
829 LinkInfo link_info(defc, name, type, caller, LinkInfo::skip_access_check); |
823 LinkResolver::resolve_field(result, link_info, Bytecodes::_nop, false, THREAD); |
830 LinkResolver::resolve_field(result, link_info, Bytecodes::_nop, false, THREAD); |
824 if (HAS_PENDING_EXCEPTION) { |
831 if (HAS_PENDING_EXCEPTION) { |
|
832 if (speculative_resolve) { |
|
833 CLEAR_PENDING_EXCEPTION; |
|
834 } |
825 return empty; |
835 return empty; |
826 } |
836 } |
827 } |
837 } |
828 oop mname2 = init_field_MemberName(mname, result, ref_kind_is_setter(ref_kind)); |
838 oop mname2 = init_field_MemberName(mname, result, ref_kind_is_setter(ref_kind)); |
829 return Handle(THREAD, mname2); |
839 return Handle(THREAD, mname2); |
1185 MethodHandles::expand_MemberName(mname, 0, CHECK); |
1195 MethodHandles::expand_MemberName(mname, 0, CHECK); |
1186 } |
1196 } |
1187 JVM_END |
1197 JVM_END |
1188 |
1198 |
1189 // void resolve(MemberName self, Class<?> caller) |
1199 // void resolve(MemberName self, Class<?> caller) |
1190 JVM_ENTRY(jobject, MHN_resolve_Mem(JNIEnv *env, jobject igcls, jobject mname_jh, jclass caller_jh)) { |
1200 JVM_ENTRY(jobject, MHN_resolve_Mem(JNIEnv *env, jobject igcls, jobject mname_jh, jclass caller_jh, |
|
1201 jboolean speculative_resolve)) { |
1191 if (mname_jh == NULL) { THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "mname is null"); } |
1202 if (mname_jh == NULL) { THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "mname is null"); } |
1192 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh)); |
1203 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh)); |
1193 |
1204 |
1194 // The trusted Java code that calls this method should already have performed |
1205 // The trusted Java code that calls this method should already have performed |
1195 // access checks on behalf of the given caller. But, we can verify this. |
1206 // access checks on behalf of the given caller. But, we can verify this. |
1213 } |
1224 } |
1214 } |
1225 } |
1215 |
1226 |
1216 Klass* caller = caller_jh == NULL ? NULL : |
1227 Klass* caller = caller_jh == NULL ? NULL : |
1217 java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh)); |
1228 java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh)); |
1218 Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL); |
1229 Handle resolved = MethodHandles::resolve_MemberName(mname, caller, speculative_resolve, |
|
1230 CHECK_NULL); |
1219 |
1231 |
1220 if (resolved.is_null()) { |
1232 if (resolved.is_null()) { |
1221 int flags = java_lang_invoke_MemberName::flags(mname()); |
1233 int flags = java_lang_invoke_MemberName::flags(mname()); |
1222 int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK; |
1234 int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK; |
1223 if (!MethodHandles::ref_kind_is_valid(ref_kind)) { |
1235 if (!MethodHandles::ref_kind_is_valid(ref_kind)) { |
1224 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "obsolete MemberName format"); |
1236 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "obsolete MemberName format"); |
|
1237 } |
|
1238 if (speculative_resolve) { |
|
1239 assert(!HAS_PENDING_EXCEPTION, "No exceptions expected when resolving speculatively"); |
|
1240 return NULL; |
1225 } |
1241 } |
1226 if ((flags & ALL_KINDS) == IS_FIELD) { |
1242 if ((flags & ALL_KINDS) == IS_FIELD) { |
1227 THROW_MSG_NULL(vmSymbols::java_lang_NoSuchFieldError(), "field resolution failed"); |
1243 THROW_MSG_NULL(vmSymbols::java_lang_NoSuchFieldError(), "field resolution failed"); |
1228 } else if ((flags & ALL_KINDS) == IS_METHOD || |
1244 } else if ((flags & ALL_KINDS) == IS_METHOD || |
1229 (flags & ALL_KINDS) == IS_CONSTRUCTOR) { |
1245 (flags & ALL_KINDS) == IS_CONSTRUCTOR) { |
1512 |
1528 |
1513 // These are the native methods on java.lang.invoke.MethodHandleNatives. |
1529 // These are the native methods on java.lang.invoke.MethodHandleNatives. |
1514 static JNINativeMethod MHN_methods[] = { |
1530 static JNINativeMethod MHN_methods[] = { |
1515 {CC "init", CC "(" MEM "" OBJ ")V", FN_PTR(MHN_init_Mem)}, |
1531 {CC "init", CC "(" MEM "" OBJ ")V", FN_PTR(MHN_init_Mem)}, |
1516 {CC "expand", CC "(" MEM ")V", FN_PTR(MHN_expand_Mem)}, |
1532 {CC "expand", CC "(" MEM ")V", FN_PTR(MHN_expand_Mem)}, |
1517 {CC "resolve", CC "(" MEM "" CLS ")" MEM, FN_PTR(MHN_resolve_Mem)}, |
1533 {CC "resolve", CC "(" MEM "" CLS "Z)" MEM, FN_PTR(MHN_resolve_Mem)}, |
1518 // static native int getNamedCon(int which, Object[] name) |
1534 // static native int getNamedCon(int which, Object[] name) |
1519 {CC "getNamedCon", CC "(I[" OBJ ")I", FN_PTR(MHN_getNamedCon)}, |
1535 {CC "getNamedCon", CC "(I[" OBJ ")I", FN_PTR(MHN_getNamedCon)}, |
1520 // static native int getMembers(Class<?> defc, String matchName, String matchSig, |
1536 // static native int getMembers(Class<?> defc, String matchName, String matchSig, |
1521 // int matchFlags, Class<?> caller, int skip, MemberName[] results); |
1537 // int matchFlags, Class<?> caller, int skip, MemberName[] results); |
1522 {CC "getMembers", CC "(" CLS "" STRG "" STRG "I" CLS "I[" MEM ")I", FN_PTR(MHN_getMembers)}, |
1538 {CC "getMembers", CC "(" CLS "" STRG "" STRG "I" CLS "I[" MEM ")I", FN_PTR(MHN_getMembers)}, |