171 } |
171 } |
172 } |
172 } |
173 return NULL; |
173 return NULL; |
174 } |
174 } |
175 |
175 |
176 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) { |
176 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, bool intern) { |
177 assert(info.resolved_appendix().is_null(), "only normal methods here"); |
177 assert(info.resolved_appendix().is_null(), "only normal methods here"); |
178 methodHandle m = info.resolved_method(); |
178 methodHandle m = info.resolved_method(); |
179 KlassHandle m_klass = m->method_holder(); |
179 KlassHandle m_klass = m->method_holder(); |
180 int flags = (jushort)( m->access_flags().as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS ); |
180 int flags = (jushort)( m->access_flags().as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS ); |
181 int vmindex = Method::invalid_vtable_index; |
181 int vmindex = Method::invalid_vtable_index; |
268 // The clazz must be eagerly stored, because it provides a GC |
268 // The clazz must be eagerly stored, because it provides a GC |
269 // root to help keep alive the Method*. |
269 // root to help keep alive the Method*. |
270 // If relevant, the vtable or itable value is stored as vmindex. |
270 // If relevant, the vtable or itable value is stored as vmindex. |
271 // This is done eagerly, since it is readily available without |
271 // This is done eagerly, since it is readily available without |
272 // constructing any new objects. |
272 // constructing any new objects. |
273 // TO DO: maybe intern mname_oop |
273 return m->method_holder()->add_member_name(mname, intern); |
274 if (m->method_holder()->add_member_name(mname)) { |
|
275 return mname(); |
|
276 } else { |
|
277 // Redefinition caused this to fail. Return NULL (and an exception?) |
|
278 return NULL; |
|
279 } |
|
280 } |
274 } |
281 |
275 |
282 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) { |
276 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) { |
283 int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS ); |
277 int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS ); |
284 flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
278 flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
915 } else if (rfill < rlimit) { |
909 } else if (rfill < rlimit) { |
916 Handle result(thread, results->obj_at(rfill++)); |
910 Handle result(thread, results->obj_at(rfill++)); |
917 if (!java_lang_invoke_MemberName::is_instance(result())) |
911 if (!java_lang_invoke_MemberName::is_instance(result())) |
918 return -99; // caller bug! |
912 return -99; // caller bug! |
919 CallInfo info(m); |
913 CallInfo info(m); |
920 oop saved = MethodHandles::init_method_MemberName(result, info); |
914 // Since this is going through the methods to create MemberNames, don't search |
|
915 // for matching methods already in the table |
|
916 oop saved = MethodHandles::init_method_MemberName(result, info, /*intern*/false); |
921 if (saved != result()) |
917 if (saved != result()) |
922 results->obj_at_put(rfill-1, saved); // show saved instance to user |
918 results->obj_at_put(rfill-1, saved); // show saved instance to user |
923 } else if (++overflow >= overflow_limit) { |
919 } else if (++overflow >= overflow_limit) { |
924 match_flags = 0; break; // got tired of looking at overflow |
920 match_flags = 0; break; // got tired of looking at overflow |
925 } |
921 } |
947 jweak ref = this->at(idx); |
943 jweak ref = this->at(idx); |
948 JNIHandles::destroy_weak_global(ref); |
944 JNIHandles::destroy_weak_global(ref); |
949 } |
945 } |
950 } |
946 } |
951 |
947 |
952 void MemberNameTable::add_member_name(jweak mem_name_wref) { |
948 oop MemberNameTable::add_member_name(jweak mem_name_wref) { |
953 assert_locked_or_safepoint(MemberNameTable_lock); |
949 assert_locked_or_safepoint(MemberNameTable_lock); |
954 this->push(mem_name_wref); |
950 this->push(mem_name_wref); |
|
951 return JNIHandles::resolve(mem_name_wref); |
|
952 } |
|
953 |
|
954 oop MemberNameTable::find_or_add_member_name(jweak mem_name_wref) { |
|
955 assert_locked_or_safepoint(MemberNameTable_lock); |
|
956 oop new_mem_name = JNIHandles::resolve(mem_name_wref); |
|
957 |
|
958 // Find matching member name in the list. |
|
959 // This is linear because these are short lists. |
|
960 int len = this->length(); |
|
961 int new_index = len; |
|
962 for (int idx = 0; idx < len; idx++) { |
|
963 oop mname = JNIHandles::resolve(this->at(idx)); |
|
964 if (mname == NULL) { |
|
965 new_index = idx; |
|
966 continue; |
|
967 } |
|
968 if (java_lang_invoke_MemberName::equals(new_mem_name, mname)) { |
|
969 JNIHandles::destroy_weak_global(mem_name_wref); |
|
970 return mname; |
|
971 } |
|
972 } |
|
973 // Not found, push the new one, or reuse empty slot |
|
974 this->at_put_grow(new_index, mem_name_wref); |
|
975 return new_mem_name; |
955 } |
976 } |
956 |
977 |
957 #if INCLUDE_JVMTI |
978 #if INCLUDE_JVMTI |
958 // It is called at safepoint only for RedefineClasses |
979 // It is called at safepoint only for RedefineClasses |
959 void MemberNameTable::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) { |
980 void MemberNameTable::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) { |