Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index cafe46cfb84c081936a9dc9c64270e8570c3be18..e0f507e1774bbd7c7d500994f40a07e74ae8f1e6 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -8178,6 +8178,31 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_LazyRecompile) { |
} |
+class ActivationsFinder : public ThreadVisitor { |
+ public: |
+ explicit ActivationsFinder(JSFunction* function) |
+ : function_(function), has_activations_(false) {} |
+ |
+ void VisitThread(Isolate* isolate, ThreadLocalTop* top) { |
+ if (has_activations_) return; |
+ |
+ for (JavaScriptFrameIterator it(isolate, top); !it.done(); it.Advance()) { |
+ JavaScriptFrame* frame = it.frame(); |
+ if (frame->is_optimized() && frame->function() == function_) { |
+ has_activations_ = true; |
+ return; |
+ } |
+ } |
+ } |
+ |
+ bool has_activations() { return has_activations_; } |
+ |
+ private: |
+ JSFunction* function_; |
+ bool has_activations_; |
+}; |
+ |
+ |
RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyDeoptimized) { |
HandleScope scope(isolate); |
ASSERT(args.length() == 1); |
@@ -8224,17 +8249,24 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyDeoptimized) { |
return isolate->heap()->undefined_value(); |
} |
- // Count the number of optimized activations of the function. |
- int activations = 0; |
+ // Find other optimized activations of the function. |
+ bool has_other_activations = false; |
while (!it.done()) { |
JavaScriptFrame* frame = it.frame(); |
if (frame->is_optimized() && frame->function() == *function) { |
- activations++; |
+ has_other_activations = true; |
+ break; |
} |
it.Advance(); |
} |
- if (activations == 0) { |
+ if (!has_other_activations) { |
+ ActivationsFinder activations_finder(*function); |
+ isolate->thread_manager()->IterateArchivedThreads(&activations_finder); |
+ has_other_activations = activations_finder.has_activations(); |
+ } |
+ |
+ if (!has_other_activations) { |
if (FLAG_trace_deopt) { |
PrintF("[removing optimized code for: "); |
function->PrintName(); |