< prev index next >

src/hotspot/share/prims/methodHandles.cpp

Print this page




 105     _enabled = z;
 106   }
 107 }
 108 
 109 // MemberName support
 110 
 111 // import java_lang_invoke_MemberName.*
 112 enum {
 113   IS_METHOD            = java_lang_invoke_MemberName::MN_IS_METHOD,
 114   IS_CONSTRUCTOR       = java_lang_invoke_MemberName::MN_IS_CONSTRUCTOR,
 115   IS_FIELD             = java_lang_invoke_MemberName::MN_IS_FIELD,
 116   IS_TYPE              = java_lang_invoke_MemberName::MN_IS_TYPE,
 117   CALLER_SENSITIVE     = java_lang_invoke_MemberName::MN_CALLER_SENSITIVE,
 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 oop MethodHandles::init_MemberName(Handle mname, Handle target, TRAPS) {
 126   // This method is used from java.lang.invoke.MemberName constructors.
 127   // It fills in the new MemberName from a java.lang.reflect.Member.
 128   Thread* thread = Thread::current();
 129   oop target_oop = target();
 130   Klass* target_klass = target_oop->klass();
 131   if (target_klass == SystemDictionary::reflect_Field_klass()) {
 132     oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder()
 133     int slot  = java_lang_reflect_Field::slot(target_oop);  // fd.index()
 134     Klass* k = java_lang_Class::as_Klass(clazz);
 135     if (k != NULL && k->is_instance_klass()) {
 136       fieldDescriptor fd(InstanceKlass::cast(k), slot);
 137       oop mname2 = init_field_MemberName(mname, fd);
 138       if (mname2 != NULL) {
 139         // Since we have the reified name and type handy, add them to the result.
 140         if (java_lang_invoke_MemberName::name(mname2) == NULL)
 141           java_lang_invoke_MemberName::set_name(mname2, java_lang_reflect_Field::name(target_oop));
 142         if (java_lang_invoke_MemberName::type(mname2) == NULL)
 143           java_lang_invoke_MemberName::set_type(mname2, java_lang_reflect_Field::type(target_oop));
 144       }




 105     _enabled = z;
 106   }
 107 }
 108 
 109 // MemberName support
 110 
 111 // import java_lang_invoke_MemberName.*
 112 enum {
 113   IS_METHOD            = java_lang_invoke_MemberName::MN_IS_METHOD,
 114   IS_CONSTRUCTOR       = java_lang_invoke_MemberName::MN_IS_CONSTRUCTOR,
 115   IS_FIELD             = java_lang_invoke_MemberName::MN_IS_FIELD,
 116   IS_TYPE              = java_lang_invoke_MemberName::MN_IS_TYPE,
 117   CALLER_SENSITIVE     = java_lang_invoke_MemberName::MN_CALLER_SENSITIVE,
 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;
 158     default:
 159       THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format", empty);
 160   }
 161   if (resolved.is_null()) {
 162     THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MemberName type", empty);
 163   }
 164   return resolved;
 165 }
 166 
 167 oop MethodHandles::init_MemberName(Handle mname, Handle target, TRAPS) {
 168   // This method is used from java.lang.invoke.MemberName constructors.
 169   // It fills in the new MemberName from a java.lang.reflect.Member.
 170   Thread* thread = Thread::current();
 171   oop target_oop = target();
 172   Klass* target_klass = target_oop->klass();
 173   if (target_klass == SystemDictionary::reflect_Field_klass()) {
 174     oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder()
 175     int slot  = java_lang_reflect_Field::slot(target_oop);  // fd.index()
 176     Klass* k = java_lang_Class::as_Klass(clazz);
 177     if (k != NULL && k->is_instance_klass()) {
 178       fieldDescriptor fd(InstanceKlass::cast(k), slot);
 179       oop mname2 = init_field_MemberName(mname, fd);
 180       if (mname2 != NULL) {
 181         // Since we have the reified name and type handy, add them to the result.
 182         if (java_lang_invoke_MemberName::name(mname2) == NULL)
 183           java_lang_invoke_MemberName::set_name(mname2, java_lang_reflect_Field::name(target_oop));
 184         if (java_lang_invoke_MemberName::type(mname2) == NULL)
 185           java_lang_invoke_MemberName::set_type(mname2, java_lang_reflect_Field::type(target_oop));
 186       }


< prev index next >