118 REFERENCE_KIND_SHIFT = java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT,
119 REFERENCE_KIND_MASK = java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK,
120 SEARCH_SUPERCLASSES = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES,
121 SEARCH_INTERFACES = java_lang_invoke_MemberName::MN_SEARCH_INTERFACES,
122 ALL_KINDS = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE
123 };
124
125 int MethodHandles::ref_kind_to_flags(int ref_kind) {
126 assert(ref_kind_is_valid(ref_kind), "%d", ref_kind);
127 int flags = (ref_kind << REFERENCE_KIND_SHIFT);
128 if (ref_kind_is_field(ref_kind)) {
129 flags |= IS_FIELD;
130 } else if (ref_kind_is_method(ref_kind)) {
131 flags |= IS_METHOD;
132 } else if (ref_kind == JVM_REF_newInvokeSpecial) {
133 flags |= IS_CONSTRUCTOR;
134 }
135 return flags;
136 }
137
138 Handle MethodHandles::resolve_MemberName_type(Handle mname, Klass* caller, TRAPS) {
139 Handle empty;
140 Handle type(THREAD, java_lang_invoke_MemberName::type(mname()));
141 if (!java_lang_String::is_instance_inlined(type())) {
142 return type; // already resolved
143 }
144 Symbol* signature = java_lang_String::as_symbol_or_null(type());
145 if (signature == NULL) {
146 return empty; // no such signature exists in the VM
147 }
148 Handle resolved;
149 int flags = java_lang_invoke_MemberName::flags(mname());
150 switch (flags & ALL_KINDS) {
151 case IS_METHOD:
152 case IS_CONSTRUCTOR:
153 resolved = SystemDictionary::find_method_handle_type(signature, caller, CHECK_(empty));
154 break;
155 case IS_FIELD:
156 resolved = SystemDictionary::find_field_handle_type(signature, caller, CHECK_(empty));
157 break;
663 // Here are some more short cuts for common types.
664 // They are optional, since reference types can be resolved lazily.
665 if (bt == T_OBJECT) {
666 if (s == vmSymbols::object_signature()) {
667 return object_java_mirror();
668 } else if (s == vmSymbols::class_signature()) {
669 return SystemDictionary::Class_klass()->java_mirror();
670 } else if (s == vmSymbols::string_signature()) {
671 return SystemDictionary::String_klass()->java_mirror();
672 }
673 }
674 return NULL;
675 }
676
677
678 // An unresolved member name is a mere symbolic reference.
679 // Resolving it plants a vmtarget/vmindex in it,
680 // which refers directly to JVM internals.
681 Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller, TRAPS) {
682 Handle empty;
683 assert(java_lang_invoke_MemberName::is_instance(mname()), "");
684
685 if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) {
686 // Already resolved.
687 DEBUG_ONLY(int vmindex = java_lang_invoke_MemberName::vmindex(mname()));
688 assert(vmindex >= Method::nonvirtual_vtable_index, "");
689 return mname;
690 }
691
692 Handle defc_oop(THREAD, java_lang_invoke_MemberName::clazz(mname()));
693 Handle name_str(THREAD, java_lang_invoke_MemberName::name( mname()));
694 Handle type_str(THREAD, java_lang_invoke_MemberName::type( mname()));
695 int flags = java_lang_invoke_MemberName::flags(mname());
696 int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
697 if (!ref_kind_is_valid(ref_kind)) {
698 THROW_MSG_(vmSymbols::java_lang_InternalError(), "obsolete MemberName format", empty);
699 }
700
701 DEBUG_ONLY(int old_vmindex);
702 assert((old_vmindex = java_lang_invoke_MemberName::vmindex(mname())) == 0, "clean input");
703
704 if (defc_oop.is_null() || name_str.is_null() || type_str.is_null()) {
705 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "nothing to resolve", empty);
706 }
707
708 InstanceKlass* defc = NULL;
709 {
710 Klass* defc_klass = java_lang_Class::as_Klass(defc_oop());
711 if (defc_klass == NULL) return empty; // a primitive; no resolution possible
712 if (!defc_klass->is_instance_klass()) {
713 if (!defc_klass->is_array_klass()) return empty;
714 defc_klass = SystemDictionary::Object_klass();
715 }
716 defc = InstanceKlass::cast(defc_klass);
1195 if (reference_klass != NULL && reference_klass->is_objArray_klass()) {
1196 reference_klass = ObjArrayKlass::cast(reference_klass)->bottom_klass();
1197 }
1198
1199 // Reflection::verify_class_access can only handle instance classes.
1200 if (reference_klass != NULL && reference_klass->is_instance_klass()) {
1201 // Emulate LinkResolver::check_klass_accessability.
1202 Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
1203 if (caller != SystemDictionary::Object_klass()
1204 && Reflection::verify_class_access(caller,
1205 InstanceKlass::cast(reference_klass),
1206 true) != Reflection::ACCESS_OK) {
1207 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), reference_klass->external_name());
1208 }
1209 }
1210 }
1211
1212 Klass* caller = caller_jh == NULL ? NULL :
1213 java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
1214 Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL);
1215
1216 if (resolved.is_null()) {
1217 int flags = java_lang_invoke_MemberName::flags(mname());
1218 int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
1219 if (!MethodHandles::ref_kind_is_valid(ref_kind)) {
1220 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "obsolete MemberName format");
1221 }
1222 if ((flags & ALL_KINDS) == IS_FIELD) {
1223 THROW_MSG_NULL(vmSymbols::java_lang_NoSuchFieldError(), "field resolution failed");
1224 } else if ((flags & ALL_KINDS) == IS_METHOD ||
1225 (flags & ALL_KINDS) == IS_CONSTRUCTOR) {
1226 THROW_MSG_NULL(vmSymbols::java_lang_NoSuchMethodError(), "method resolution failed");
1227 } else {
1228 THROW_MSG_NULL(vmSymbols::java_lang_LinkageError(), "resolution failed");
1229 }
1230 }
1231
1232 return JNIHandles::make_local(THREAD, resolved());
1233 }
1234 JVM_END
1235
1236 static jlong find_member_field_offset(oop mname, bool must_be_static, TRAPS) {
1237 if (mname == NULL ||
1238 java_lang_invoke_MemberName::clazz(mname) == NULL) {
1239 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "mname not resolved");
1240 } else {
1241 int flags = java_lang_invoke_MemberName::flags(mname);
1242 if ((flags & IS_FIELD) != 0 &&
1243 (must_be_static
1244 ? (flags & JVM_ACC_STATIC) != 0
1245 : (flags & JVM_ACC_STATIC) == 0)) {
1246 int vmindex = java_lang_invoke_MemberName::vmindex(mname);
1247 return (jlong) vmindex;
1248 }
1249 }
1250 const char* msg = (must_be_static ? "static field required" : "non-static field required");
1251 THROW_MSG_0(vmSymbols::java_lang_InternalError(), msg);
|
118 REFERENCE_KIND_SHIFT = java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT,
119 REFERENCE_KIND_MASK = java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK,
120 SEARCH_SUPERCLASSES = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES,
121 SEARCH_INTERFACES = java_lang_invoke_MemberName::MN_SEARCH_INTERFACES,
122 ALL_KINDS = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE
123 };
124
125 int MethodHandles::ref_kind_to_flags(int ref_kind) {
126 assert(ref_kind_is_valid(ref_kind), "%d", ref_kind);
127 int flags = (ref_kind << REFERENCE_KIND_SHIFT);
128 if (ref_kind_is_field(ref_kind)) {
129 flags |= IS_FIELD;
130 } else if (ref_kind_is_method(ref_kind)) {
131 flags |= IS_METHOD;
132 } else if (ref_kind == JVM_REF_newInvokeSpecial) {
133 flags |= IS_CONSTRUCTOR;
134 }
135 return flags;
136 }
137
138 int MethodHandles::flags_to_ref_kind(int flags) {
139 return (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
140 }
141
142 Handle MethodHandles::resolve_MemberName_type(Handle mname, Klass* caller, TRAPS) {
143 Handle empty;
144 Handle type(THREAD, java_lang_invoke_MemberName::type(mname()));
145 if (!java_lang_String::is_instance_inlined(type())) {
146 return type; // already resolved
147 }
148 Symbol* signature = java_lang_String::as_symbol_or_null(type());
149 if (signature == NULL) {
150 return empty; // no such signature exists in the VM
151 }
152 Handle resolved;
153 int flags = java_lang_invoke_MemberName::flags(mname());
154 switch (flags & ALL_KINDS) {
155 case IS_METHOD:
156 case IS_CONSTRUCTOR:
157 resolved = SystemDictionary::find_method_handle_type(signature, caller, CHECK_(empty));
158 break;
159 case IS_FIELD:
160 resolved = SystemDictionary::find_field_handle_type(signature, caller, CHECK_(empty));
161 break;
667 // Here are some more short cuts for common types.
668 // They are optional, since reference types can be resolved lazily.
669 if (bt == T_OBJECT) {
670 if (s == vmSymbols::object_signature()) {
671 return object_java_mirror();
672 } else if (s == vmSymbols::class_signature()) {
673 return SystemDictionary::Class_klass()->java_mirror();
674 } else if (s == vmSymbols::string_signature()) {
675 return SystemDictionary::String_klass()->java_mirror();
676 }
677 }
678 return NULL;
679 }
680
681
682 // An unresolved member name is a mere symbolic reference.
683 // Resolving it plants a vmtarget/vmindex in it,
684 // which refers directly to JVM internals.
685 Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller, TRAPS) {
686 Handle empty;
687 Handle resolved = MethodHandles::resolve_MemberName_helper(mname, caller, THREAD);
688 if (HAS_PENDING_EXCEPTION) {
689 if (PENDING_EXCEPTION->is_a(SystemDictionary::ClassNotFoundException_klass())) {
690 // Convert CNFE to NCDFE and don't worry about it on JDK side.
691 Handle e(THREAD, PENDING_EXCEPTION);
692 CLEAR_PENDING_EXCEPTION;
693 THROW_CAUSE_(vmSymbols::java_lang_NoClassDefFoundError(), e, empty);
694 }
695 return empty;
696 }
697 if (resolved.is_null()) {
698 int flags = java_lang_invoke_MemberName::flags(mname());
699 int ref_kind = flags_to_ref_kind(flags);
700 if (!MethodHandles::ref_kind_is_valid(ref_kind)) {
701 THROW_MSG_(vmSymbols::java_lang_InternalError(), "obsolete MemberName format", empty);
702 } else if ((flags & ALL_KINDS) == IS_FIELD) {
703 THROW_MSG_(vmSymbols::java_lang_NoSuchFieldError(), "field resolution failed", empty);
704 } else if ((flags & ALL_KINDS) == IS_METHOD ||
705 (flags & ALL_KINDS) == IS_CONSTRUCTOR) {
706 THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), "method resolution failed", empty);
707 } else {
708 THROW_MSG_(vmSymbols::java_lang_LinkageError(), "resolution failed", empty);
709 }
710 }
711 return resolved;
712 }
713
714 Handle MethodHandles::resolve_MemberName_helper(Handle mname, Klass* caller, TRAPS) {
715 Handle empty;
716 assert(java_lang_invoke_MemberName::is_instance(mname()), "");
717
718 if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) {
719 // Already resolved.
720 DEBUG_ONLY(int vmindex = java_lang_invoke_MemberName::vmindex(mname()));
721 assert(vmindex >= Method::nonvirtual_vtable_index, "");
722 return mname;
723 }
724
725 Handle defc_oop(THREAD, java_lang_invoke_MemberName::clazz(mname()));
726 Handle name_str(THREAD, java_lang_invoke_MemberName::name( mname()));
727 Handle type_str(THREAD, java_lang_invoke_MemberName::type( mname()));
728 int flags = java_lang_invoke_MemberName::flags(mname());
729 int ref_kind = flags_to_ref_kind(flags);
730 if (!ref_kind_is_valid(ref_kind)) {
731 THROW_MSG_(vmSymbols::java_lang_InternalError(), "obsolete MemberName format", empty);
732 }
733
734 DEBUG_ONLY(int old_vmindex);
735 assert((old_vmindex = java_lang_invoke_MemberName::vmindex(mname())) == 0, "clean input");
736
737 if (defc_oop.is_null() || name_str.is_null() || type_str.is_null()) {
738 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "nothing to resolve", empty);
739 }
740
741 InstanceKlass* defc = NULL;
742 {
743 Klass* defc_klass = java_lang_Class::as_Klass(defc_oop());
744 if (defc_klass == NULL) return empty; // a primitive; no resolution possible
745 if (!defc_klass->is_instance_klass()) {
746 if (!defc_klass->is_array_klass()) return empty;
747 defc_klass = SystemDictionary::Object_klass();
748 }
749 defc = InstanceKlass::cast(defc_klass);
1228 if (reference_klass != NULL && reference_klass->is_objArray_klass()) {
1229 reference_klass = ObjArrayKlass::cast(reference_klass)->bottom_klass();
1230 }
1231
1232 // Reflection::verify_class_access can only handle instance classes.
1233 if (reference_klass != NULL && reference_klass->is_instance_klass()) {
1234 // Emulate LinkResolver::check_klass_accessability.
1235 Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
1236 if (caller != SystemDictionary::Object_klass()
1237 && Reflection::verify_class_access(caller,
1238 InstanceKlass::cast(reference_klass),
1239 true) != Reflection::ACCESS_OK) {
1240 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), reference_klass->external_name());
1241 }
1242 }
1243 }
1244
1245 Klass* caller = caller_jh == NULL ? NULL :
1246 java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
1247 Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL);
1248 if (resolved.is_null()) {
1249 // Resolution failure should already trigger an exception.
1250 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "empty");
1251 }
1252 return JNIHandles::make_local(THREAD, resolved());
1253 }
1254 JVM_END
1255
1256 static jlong find_member_field_offset(oop mname, bool must_be_static, TRAPS) {
1257 if (mname == NULL ||
1258 java_lang_invoke_MemberName::clazz(mname) == NULL) {
1259 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "mname not resolved");
1260 } else {
1261 int flags = java_lang_invoke_MemberName::flags(mname);
1262 if ((flags & IS_FIELD) != 0 &&
1263 (must_be_static
1264 ? (flags & JVM_ACC_STATIC) != 0
1265 : (flags & JVM_ACC_STATIC) == 0)) {
1266 int vmindex = java_lang_invoke_MemberName::vmindex(mname);
1267 return (jlong) vmindex;
1268 }
1269 }
1270 const char* msg = (must_be_static ? "static field required" : "non-static field required");
1271 THROW_MSG_0(vmSymbols::java_lang_InternalError(), msg);
|