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

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


2930       } else {
2931         if (best == NULL || (osr->comp_level() > best->comp_level())) {
2932           if (osr->comp_level() == CompLevel_highest_tier) {
2933             // Found the best possible - return it.
2934             OsrList_lock->unlock();
2935             return osr;
2936           }
2937           best = osr;
2938         }
2939       }
2940     }
2941     osr = osr->osr_link();
2942   }
2943   OsrList_lock->unlock();
2944   if (best != NULL && best->comp_level() >= comp_level && match_level == false) {
2945     return best;
2946   }
2947   return NULL;
2948 }
2949 
2950 void InstanceKlass::add_member_name(int index, Handle mem_name) {
2951   jweak mem_name_wref = JNIHandles::make_weak_global(mem_name);
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);
2955 
2956   if (_member_names == NULL) {
2957     _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable(idnum_allocated_count());







2958   }
2959   _member_names->add_member_name(index, mem_name_wref);
2960 }
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 }
2973 
2974 // -----------------------------------------------------------------------------------------------------
2975 // Printing
2976 
2977 #ifndef PRODUCT
2978 
2979 #define BULLET  " - "
2980 
2981 static const char* state_names[] = {
2982   "allocated", "loaded", "linked", "being_initialized", "fully_initialized", "initialization_error"
2983 };
2984 
2985 static void print_vtable(intptr_t* start, int len, outputStream* st) {
2986   for (int i = 0; i < len; i++) {
2987     intptr_t e = start[i];
2988     st->print("%d : " INTPTR_FORMAT, i, e);
2989     if (e != 0 && ((Metadata*)e)->is_metaspace_object()) {
2990       st->print(" ");
2991       ((Metadata*)e)->print_value_on(st);




2930       } else {
2931         if (best == NULL || (osr->comp_level() > best->comp_level())) {
2932           if (osr->comp_level() == CompLevel_highest_tier) {
2933             // Found the best possible - return it.
2934             OsrList_lock->unlock();
2935             return osr;
2936           }
2937           best = osr;
2938         }
2939       }
2940     }
2941     osr = osr->osr_link();
2942   }
2943   OsrList_lock->unlock();
2944   if (best != NULL && best->comp_level() >= comp_level && match_level == false) {
2945     return best;
2946   }
2947   return NULL;
2948 }
2949 
2950 bool InstanceKlass::add_member_name(Handle mem_name) {
2951   jweak mem_name_wref = JNIHandles::make_weak_global(mem_name);
2952   MutexLocker ml(MemberNameTable_lock);

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   }







2965 
2966   if (_member_names == NULL) {
2967     _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable(idnum_allocated_count());
2968   }
2969   _member_names->add_member_name(mem_name_wref);
2970   return true;
2971 }
2972 
2973 // -----------------------------------------------------------------------------------------------------
2974 // Printing
2975 
2976 #ifndef PRODUCT
2977 
2978 #define BULLET  " - "
2979 
2980 static const char* state_names[] = {
2981   "allocated", "loaded", "linked", "being_initialized", "fully_initialized", "initialization_error"
2982 };
2983 
2984 static void print_vtable(intptr_t* start, int len, outputStream* st) {
2985   for (int i = 0; i < len; i++) {
2986     intptr_t e = start[i];
2987     st->print("%d : " INTPTR_FORMAT, i, e);
2988     if (e != 0 && ((Metadata*)e)->is_metaspace_object()) {
2989       st->print(" ");
2990       ((Metadata*)e)->print_value_on(st);


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