174 } |
174 } |
175 } |
175 } |
176 return NULL; |
176 return NULL; |
177 } |
177 } |
178 |
178 |
179 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) { |
179 oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, bool intern) { |
180 assert(info.resolved_appendix().is_null(), "only normal methods here"); |
180 assert(info.resolved_appendix().is_null(), "only normal methods here"); |
181 methodHandle m = info.resolved_method(); |
181 methodHandle m = info.resolved_method(); |
182 assert(m.not_null(), "null method handle"); |
182 assert(m.not_null(), "null method handle"); |
183 KlassHandle m_klass = m->method_holder(); |
183 KlassHandle m_klass = m->method_holder(); |
184 assert(m.not_null(), "null holder for method handle"); |
184 assert(m.not_null(), "null holder for method handle"); |
275 // The clazz must be eagerly stored, because it provides a GC |
275 // The clazz must be eagerly stored, because it provides a GC |
276 // root to help keep alive the Method*. |
276 // root to help keep alive the Method*. |
277 // If relevant, the vtable or itable value is stored as vmindex. |
277 // If relevant, the vtable or itable value is stored as vmindex. |
278 // This is done eagerly, since it is readily available without |
278 // This is done eagerly, since it is readily available without |
279 // constructing any new objects. |
279 // constructing any new objects. |
280 // TO DO: maybe intern mname_oop |
280 return m->method_holder()->add_member_name(mname, intern); |
281 if (m->method_holder()->add_member_name(mname)) { |
|
282 return mname(); |
|
283 } else { |
|
284 // Redefinition caused this to fail. Return NULL (and an exception?) |
|
285 return NULL; |
|
286 } |
|
287 } |
281 } |
288 |
282 |
289 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) { |
283 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) { |
290 int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS ); |
284 int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS ); |
291 flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
285 flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
971 } else if (rfill < rlimit) { |
965 } else if (rfill < rlimit) { |
972 Handle result(thread, results->obj_at(rfill++)); |
966 Handle result(thread, results->obj_at(rfill++)); |
973 if (!java_lang_invoke_MemberName::is_instance(result())) |
967 if (!java_lang_invoke_MemberName::is_instance(result())) |
974 return -99; // caller bug! |
968 return -99; // caller bug! |
975 CallInfo info(m); |
969 CallInfo info(m); |
976 oop saved = MethodHandles::init_method_MemberName(result, info); |
970 // Since this is going through the methods to create MemberNames, don't search |
|
971 // for matching methods already in the table |
|
972 oop saved = MethodHandles::init_method_MemberName(result, info, /*intern*/false); |
977 if (saved != result()) |
973 if (saved != result()) |
978 results->obj_at_put(rfill-1, saved); // show saved instance to user |
974 results->obj_at_put(rfill-1, saved); // show saved instance to user |
979 } else if (++overflow >= overflow_limit) { |
975 } else if (++overflow >= overflow_limit) { |
980 match_flags = 0; break; // got tired of looking at overflow |
976 match_flags = 0; break; // got tired of looking at overflow |
981 } |
977 } |
1052 jweak ref = this->at(idx); |
1048 jweak ref = this->at(idx); |
1053 JNIHandles::destroy_weak_global(ref); |
1049 JNIHandles::destroy_weak_global(ref); |
1054 } |
1050 } |
1055 } |
1051 } |
1056 |
1052 |
1057 void MemberNameTable::add_member_name(jweak mem_name_wref) { |
1053 oop MemberNameTable::add_member_name(jweak mem_name_wref) { |
1058 assert_locked_or_safepoint(MemberNameTable_lock); |
1054 assert_locked_or_safepoint(MemberNameTable_lock); |
1059 this->push(mem_name_wref); |
1055 this->push(mem_name_wref); |
|
1056 return JNIHandles::resolve(mem_name_wref); |
|
1057 } |
|
1058 |
|
1059 oop MemberNameTable::find_or_add_member_name(jweak mem_name_wref) { |
|
1060 assert_locked_or_safepoint(MemberNameTable_lock); |
|
1061 oop new_mem_name = JNIHandles::resolve(mem_name_wref); |
|
1062 |
|
1063 // Find matching member name in the list. |
|
1064 // This is linear because these are short lists. |
|
1065 int len = this->length(); |
|
1066 int new_index = len; |
|
1067 for (int idx = 0; idx < len; idx++) { |
|
1068 oop mname = JNIHandles::resolve(this->at(idx)); |
|
1069 if (mname == NULL) { |
|
1070 new_index = idx; |
|
1071 continue; |
|
1072 } |
|
1073 if (java_lang_invoke_MemberName::equals(new_mem_name, mname)) { |
|
1074 JNIHandles::destroy_weak_global(mem_name_wref); |
|
1075 return mname; |
|
1076 } |
|
1077 } |
|
1078 // Not found, push the new one, or reuse empty slot |
|
1079 this->at_put_grow(new_index, mem_name_wref); |
|
1080 return new_mem_name; |
1060 } |
1081 } |
1061 |
1082 |
1062 #if INCLUDE_JVMTI |
1083 #if INCLUDE_JVMTI |
1063 // It is called at safepoint only for RedefineClasses |
1084 // It is called at safepoint only for RedefineClasses |
1064 void MemberNameTable::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) { |
1085 void MemberNameTable::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) { |