< prev index next >

src/share/vm/code/compiledIC.cpp

Print this page

        

@@ -285,10 +285,11 @@
   CodeBlob* caller = CodeCache::find_blob_unsafe(instruction_address());
   bool is_c1_method = caller->is_compiled_by_c1();
   assert( is_c1_method ||
          !is_monomorphic ||
          is_optimized() ||
+         !caller->is_alive() ||
          (cached_metadata() != NULL && cached_metadata()->is_klass()), "sanity check");
 #endif // ASSERT
   return is_monomorphic;
 }
 

@@ -319,11 +320,11 @@
   }
   return is_call_to_interpreted;
 }
 
 
-void CompiledIC::set_to_clean() {
+void CompiledIC::set_to_clean(bool in_use) {
   assert(SafepointSynchronize::is_at_safepoint() || CompiledIC_lock->is_locked() , "MT-unsafe call");
   if (TraceInlineCacheClearing || TraceICs) {
     tty->print_cr("IC@" INTPTR_FORMAT ": set to clean", p2i(instruction_address()));
     print();
   }

@@ -335,11 +336,11 @@
     entry = SharedRuntime::get_resolve_virtual_call_stub();
   }
 
   // A zombie transition will always be safe, since the metadata has already been set to NULL, so
   // we only need to patch the destination
-  bool safe_transition = is_optimized() || SafepointSynchronize::is_at_safepoint();
+  bool safe_transition = !in_use || is_optimized() || SafepointSynchronize::is_at_safepoint();
 
   if (safe_transition) {
     // Kill any leftover stub we might have too
     clear_ic_stub();
     if (is_optimized()) {
< prev index next >