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