< prev index next >
src/hotspot/share/prims/methodHandles.cpp
Print this page
*** 120,129 ****
--- 120,171 ----
SEARCH_SUPERCLASSES = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES,
SEARCH_INTERFACES = java_lang_invoke_MemberName::MN_SEARCH_INTERFACES,
ALL_KINDS = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE
};
+ int MethodHandles::ref_kind_to_flags(int ref_kind) {
+ assert(ref_kind_is_valid(ref_kind), "%d", ref_kind);
+ int flags = (ref_kind << REFERENCE_KIND_SHIFT);
+ if (ref_kind_is_field(ref_kind)) {
+ flags |= IS_FIELD;
+ } else if (ref_kind_is_method(ref_kind)) {
+ flags |= IS_METHOD;
+ } else if (ref_kind == JVM_REF_newInvokeSpecial) {
+ flags |= IS_CONSTRUCTOR;
+ }
+ return flags;
+ }
+
+ 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
+ }
+ Symbol* signature = java_lang_String::as_symbol_or_null(type());
+ if (signature == NULL) {
+ return empty; // no such signature exists in the VM
+ }
+ Handle resolved;
+ int flags = java_lang_invoke_MemberName::flags(mname());
+ switch (flags & ALL_KINDS) {
+ case IS_METHOD:
+ case IS_CONSTRUCTOR:
+ resolved = SystemDictionary::find_method_handle_type(signature, caller, CHECK_(empty));
+ break;
+ case IS_FIELD:
+ resolved = SystemDictionary::find_field_handle_type(signature, caller, CHECK_(empty));
+ break;
+ default:
+ THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format", empty);
+ }
+ if (resolved.is_null()) {
+ THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MemberName type", empty);
+ }
+ return resolved;
+ }
+
oop MethodHandles::init_MemberName(Handle mname, Handle target, TRAPS) {
// This method is used from java.lang.invoke.MemberName constructors.
// It fills in the new MemberName from a java.lang.reflect.Member.
Thread* thread = Thread::current();
oop target_oop = target();
< prev index next >