src/share/vm/oops/instanceKlass.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8042235_8u40 Cdiff src/share/vm/oops/instanceKlass.cpp

src/share/vm/oops/instanceKlass.cpp

Print this page
rev 6917 : 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

*** 2945,2976 **** return best; } return NULL; } ! void InstanceKlass::add_member_name(int index, Handle mem_name) { jweak mem_name_wref = JNIHandles::make_weak_global(mem_name); MutexLocker ml(MemberNameTable_lock); - assert(0 <= index && index < idnum_allocated_count(), "index is out of bounds"); DEBUG_ONLY(No_Safepoint_Verifier nsv); ! if (_member_names == NULL) { ! _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable(idnum_allocated_count()); } - _member_names->add_member_name(index, mem_name_wref); - } - - oop InstanceKlass::get_member_name(int index) { - MutexLocker ml(MemberNameTable_lock); - assert(0 <= index && index < idnum_allocated_count(), "index is out of bounds"); - DEBUG_ONLY(No_Safepoint_Verifier nsv); if (_member_names == NULL) { ! return NULL; } ! oop mem_name =_member_names->get_member_name(index); ! return mem_name; } // ----------------------------------------------------------------------------------------------------- // Printing --- 2945,2975 ---- return best; } return NULL; } ! bool InstanceKlass::add_member_name(Handle mem_name) { jweak mem_name_wref = JNIHandles::make_weak_global(mem_name); MutexLocker ml(MemberNameTable_lock); DEBUG_ONLY(No_Safepoint_Verifier nsv); ! // Check if method has been redefined while taking out MemberNameTable_lock, if so ! // return false. We cannot cache obsolete methods. They will crash when the function ! // is called! ! Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mem_name()); ! if (method->is_obsolete()) { ! return false; ! } else if (method->is_old()) { ! // Replace method with redefined version ! java_lang_invoke_MemberName::set_vmtarget(mem_name(), method_with_idnum(method->method_idnum())); } if (_member_names == NULL) { ! _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable(idnum_allocated_count()); } ! _member_names->add_member_name(mem_name_wref); ! return true; } // ----------------------------------------------------------------------------------------------------- // Printing
src/share/vm/oops/instanceKlass.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File