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