src/share/vm/prims/methodHandles.cpp

changeset 8951
0612a789929b
parent 8721
575f637864df
child 8758
e7db67a9ddfd
equal deleted inserted replaced
8950:0b3b35f008f2 8951:0612a789929b
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) {

mercurial