< prev index next >
src/hotspot/share/prims/methodHandles.cpp
Print this page
*** 133,142 ****
--- 133,146 ----
flags |= IS_CONSTRUCTOR;
}
return flags;
}
+ int MethodHandles::flags_to_ref_kind(int flags) {
+ return (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
+ }
+
Handle MethodHandles::resolve_MemberName_type(Handle mname, Klass* caller, TRAPS) {
Handle empty;
Handle type(THREAD, java_lang_invoke_MemberName::type(mname()));
if (!java_lang_String::is_instance_inlined(type())) {
return type; // already resolved
*** 678,687 ****
--- 682,720 ----
// An unresolved member name is a mere symbolic reference.
// Resolving it plants a vmtarget/vmindex in it,
// which refers directly to JVM internals.
Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller, TRAPS) {
Handle empty;
+ Handle resolved = MethodHandles::resolve_MemberName_helper(mname, caller, THREAD);
+ if (HAS_PENDING_EXCEPTION) {
+ if (PENDING_EXCEPTION->is_a(SystemDictionary::ClassNotFoundException_klass())) {
+ // Convert CNFE to NCDFE and don't worry about it on JDK side.
+ Handle e(THREAD, PENDING_EXCEPTION);
+ CLEAR_PENDING_EXCEPTION;
+ THROW_CAUSE_(vmSymbols::java_lang_NoClassDefFoundError(), e, empty);
+ }
+ return empty;
+ }
+ if (resolved.is_null()) {
+ int flags = java_lang_invoke_MemberName::flags(mname());
+ int ref_kind = flags_to_ref_kind(flags);
+ if (!MethodHandles::ref_kind_is_valid(ref_kind)) {
+ THROW_MSG_(vmSymbols::java_lang_InternalError(), "obsolete MemberName format", empty);
+ } else if ((flags & ALL_KINDS) == IS_FIELD) {
+ THROW_MSG_(vmSymbols::java_lang_NoSuchFieldError(), "field resolution failed", empty);
+ } else if ((flags & ALL_KINDS) == IS_METHOD ||
+ (flags & ALL_KINDS) == IS_CONSTRUCTOR) {
+ THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), "method resolution failed", empty);
+ } else {
+ THROW_MSG_(vmSymbols::java_lang_LinkageError(), "resolution failed", empty);
+ }
+ }
+ return resolved;
+ }
+
+ Handle MethodHandles::resolve_MemberName_helper(Handle mname, Klass* caller, TRAPS) {
+ Handle empty;
assert(java_lang_invoke_MemberName::is_instance(mname()), "");
if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) {
// Already resolved.
DEBUG_ONLY(int vmindex = java_lang_invoke_MemberName::vmindex(mname()));
*** 691,701 ****
Handle defc_oop(THREAD, java_lang_invoke_MemberName::clazz(mname()));
Handle name_str(THREAD, java_lang_invoke_MemberName::name( mname()));
Handle type_str(THREAD, java_lang_invoke_MemberName::type( mname()));
int flags = java_lang_invoke_MemberName::flags(mname());
! int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
if (!ref_kind_is_valid(ref_kind)) {
THROW_MSG_(vmSymbols::java_lang_InternalError(), "obsolete MemberName format", empty);
}
DEBUG_ONLY(int old_vmindex);
--- 724,734 ----
Handle defc_oop(THREAD, java_lang_invoke_MemberName::clazz(mname()));
Handle name_str(THREAD, java_lang_invoke_MemberName::name( mname()));
Handle type_str(THREAD, java_lang_invoke_MemberName::type( mname()));
int flags = java_lang_invoke_MemberName::flags(mname());
! int ref_kind = flags_to_ref_kind(flags);
if (!ref_kind_is_valid(ref_kind)) {
THROW_MSG_(vmSymbols::java_lang_InternalError(), "obsolete MemberName format", empty);
}
DEBUG_ONLY(int old_vmindex);
*** 1210,1236 ****
}
Klass* caller = caller_jh == NULL ? NULL :
java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL);
-
if (resolved.is_null()) {
! int flags = java_lang_invoke_MemberName::flags(mname());
! int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
! if (!MethodHandles::ref_kind_is_valid(ref_kind)) {
! THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "obsolete MemberName format");
}
- if ((flags & ALL_KINDS) == IS_FIELD) {
- THROW_MSG_NULL(vmSymbols::java_lang_NoSuchFieldError(), "field resolution failed");
- } else if ((flags & ALL_KINDS) == IS_METHOD ||
- (flags & ALL_KINDS) == IS_CONSTRUCTOR) {
- THROW_MSG_NULL(vmSymbols::java_lang_NoSuchMethodError(), "method resolution failed");
- } else {
- THROW_MSG_NULL(vmSymbols::java_lang_LinkageError(), "resolution failed");
- }
- }
-
return JNIHandles::make_local(THREAD, resolved());
}
JVM_END
static jlong find_member_field_offset(oop mname, bool must_be_static, TRAPS) {
--- 1243,1256 ----
}
Klass* caller = caller_jh == NULL ? NULL :
java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL);
if (resolved.is_null()) {
! // Resolution failure should already trigger an exception.
! THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "empty");
}
return JNIHandles::make_local(THREAD, resolved());
}
JVM_END
static jlong find_member_field_offset(oop mname, bool must_be_static, TRAPS) {
< prev index next >