Mercurial > hg > graal-compiler
diff src/share/vm/oops/instanceKlass.cpp @ 21826:41c3c456e326 jdk8u45-b01
Merge
author | asaha |
---|---|
date | Fri, 12 Dec 2014 14:39:40 -0800 |
parents | d5b74c583ec1 fe34c5ab0b35 |
children | 7622232b7efa |
line wrap: on
line diff
--- a/src/share/vm/oops/instanceKlass.cpp Mon Dec 01 19:09:54 2014 -0800 +++ b/src/share/vm/oops/instanceKlass.cpp Fri Dec 12 14:39:40 2014 -0800 @@ -2957,28 +2957,27 @@ return NULL; } -void InstanceKlass::add_member_name(int index, Handle mem_name) { +bool InstanceKlass::add_member_name(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); + // 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(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; + _member_names->add_member_name(mem_name_wref); + return true; } // -----------------------------------------------------------------------------------------------------