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 } |