1.1 --- a/src/share/vm/prims/methodHandles.cpp Wed Feb 15 17:39:29 2017 +0000 1.2 +++ b/src/share/vm/prims/methodHandles.cpp Fri Feb 24 06:48:48 2017 -0800 1.3 @@ -173,7 +173,7 @@ 1.4 return NULL; 1.5 } 1.6 1.7 -oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) { 1.8 +oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, bool intern) { 1.9 assert(info.resolved_appendix().is_null(), "only normal methods here"); 1.10 methodHandle m = info.resolved_method(); 1.11 KlassHandle m_klass = m->method_holder(); 1.12 @@ -270,13 +270,7 @@ 1.13 // If relevant, the vtable or itable value is stored as vmindex. 1.14 // This is done eagerly, since it is readily available without 1.15 // constructing any new objects. 1.16 - // TO DO: maybe intern mname_oop 1.17 - if (m->method_holder()->add_member_name(mname)) { 1.18 - return mname(); 1.19 - } else { 1.20 - // Redefinition caused this to fail. Return NULL (and an exception?) 1.21 - return NULL; 1.22 - } 1.23 + return m->method_holder()->add_member_name(mname, intern); 1.24 } 1.25 1.26 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) { 1.27 @@ -917,7 +911,9 @@ 1.28 if (!java_lang_invoke_MemberName::is_instance(result())) 1.29 return -99; // caller bug! 1.30 CallInfo info(m); 1.31 - oop saved = MethodHandles::init_method_MemberName(result, info); 1.32 + // Since this is going through the methods to create MemberNames, don't search 1.33 + // for matching methods already in the table 1.34 + oop saved = MethodHandles::init_method_MemberName(result, info, /*intern*/false); 1.35 if (saved != result()) 1.36 results->obj_at_put(rfill-1, saved); // show saved instance to user 1.37 } else if (++overflow >= overflow_limit) { 1.38 @@ -949,9 +945,34 @@ 1.39 } 1.40 } 1.41 1.42 -void MemberNameTable::add_member_name(jweak mem_name_wref) { 1.43 +oop MemberNameTable::add_member_name(jweak mem_name_wref) { 1.44 assert_locked_or_safepoint(MemberNameTable_lock); 1.45 this->push(mem_name_wref); 1.46 + return JNIHandles::resolve(mem_name_wref); 1.47 +} 1.48 + 1.49 +oop MemberNameTable::find_or_add_member_name(jweak mem_name_wref) { 1.50 + assert_locked_or_safepoint(MemberNameTable_lock); 1.51 + oop new_mem_name = JNIHandles::resolve(mem_name_wref); 1.52 + 1.53 + // Find matching member name in the list. 1.54 + // This is linear because these are short lists. 1.55 + int len = this->length(); 1.56 + int new_index = len; 1.57 + for (int idx = 0; idx < len; idx++) { 1.58 + oop mname = JNIHandles::resolve(this->at(idx)); 1.59 + if (mname == NULL) { 1.60 + new_index = idx; 1.61 + continue; 1.62 + } 1.63 + if (java_lang_invoke_MemberName::equals(new_mem_name, mname)) { 1.64 + JNIHandles::destroy_weak_global(mem_name_wref); 1.65 + return mname; 1.66 + } 1.67 + } 1.68 + // Not found, push the new one, or reuse empty slot 1.69 + this->at_put_grow(new_index, mem_name_wref); 1.70 + return new_mem_name; 1.71 } 1.72 1.73 #if INCLUDE_JVMTI