Mercurial > hg > truffle
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 |