comparison src/share/vm/oops/instanceKlass.cpp @ 20677:fe34c5ab0b35

8042235: redefining method used by multiple MethodHandles crashes VM Summary: note all MemberNames created on internal list for adjusting method entries. Reviewed-by: sspitsyn, dcubed, lfoltan
author coleenp
date Wed, 19 Nov 2014 13:02:11 -0500
parents 3c87c13918fb
children c4f1e23c4139 41c3c456e326
comparison
equal deleted inserted replaced
20666:bee8095780db 20677:fe34c5ab0b35
2945 return best; 2945 return best;
2946 } 2946 }
2947 return NULL; 2947 return NULL;
2948 } 2948 }
2949 2949
2950 void InstanceKlass::add_member_name(int index, Handle mem_name) { 2950 bool InstanceKlass::add_member_name(Handle mem_name) {
2951 jweak mem_name_wref = JNIHandles::make_weak_global(mem_name); 2951 jweak mem_name_wref = JNIHandles::make_weak_global(mem_name);
2952 MutexLocker ml(MemberNameTable_lock); 2952 MutexLocker ml(MemberNameTable_lock);
2953 assert(0 <= index && index < idnum_allocated_count(), "index is out of bounds");
2954 DEBUG_ONLY(No_Safepoint_Verifier nsv); 2953 DEBUG_ONLY(No_Safepoint_Verifier nsv);
2954
2955 // Check if method has been redefined while taking out MemberNameTable_lock, if so
2956 // return false. We cannot cache obsolete methods. They will crash when the function
2957 // is called!
2958 Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mem_name());
2959 if (method->is_obsolete()) {
2960 return false;
2961 } else if (method->is_old()) {
2962 // Replace method with redefined version
2963 java_lang_invoke_MemberName::set_vmtarget(mem_name(), method_with_idnum(method->method_idnum()));
2964 }
2955 2965
2956 if (_member_names == NULL) { 2966 if (_member_names == NULL) {
2957 _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable(idnum_allocated_count()); 2967 _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable(idnum_allocated_count());
2958 } 2968 }
2959 _member_names->add_member_name(index, mem_name_wref); 2969 _member_names->add_member_name(mem_name_wref);
2960 } 2970 return true;
2961
2962 oop InstanceKlass::get_member_name(int index) {
2963 MutexLocker ml(MemberNameTable_lock);
2964 assert(0 <= index && index < idnum_allocated_count(), "index is out of bounds");
2965 DEBUG_ONLY(No_Safepoint_Verifier nsv);
2966
2967 if (_member_names == NULL) {
2968 return NULL;
2969 }
2970 oop mem_name =_member_names->get_member_name(index);
2971 return mem_name;
2972 } 2971 }
2973 2972
2974 // ----------------------------------------------------------------------------------------------------- 2973 // -----------------------------------------------------------------------------------------------------
2975 // Printing 2974 // Printing
2976 2975