From 52f0c37d0912f3a348ef52788be604ccbd9d1a07 Mon Sep 17 00:00:00 2001 From: "vegorov@chromium.org" Date: Wed, 12 Oct 2011 10:35:42 +0000 Subject: [PATCH] Runtime_NotifyDeoptimized should search for function activation in all thread stacks. R=fschneider@chromium.org BUG=v8:1763 Review URL: http://codereview.chromium.org/8240004 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@9588 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- deps/v8/src/frames-inl.h | 9 +++++++++ deps/v8/src/frames.h | 2 ++ deps/v8/src/runtime.cc | 40 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/deps/v8/src/frames-inl.h b/deps/v8/src/frames-inl.h index 7ba79bf1b5..98a943a0e3 100644 --- a/deps/v8/src/frames-inl.h +++ b/deps/v8/src/frames-inl.h @@ -197,6 +197,15 @@ inline JavaScriptFrameIteratorTemp::JavaScriptFrameIteratorTemp( if (!done()) Advance(); } + +template +inline JavaScriptFrameIteratorTemp::JavaScriptFrameIteratorTemp( + Isolate* isolate, ThreadLocalTop* top) + : iterator_(isolate, top) { + if (!done()) Advance(); +} + + template inline JavaScriptFrame* JavaScriptFrameIteratorTemp::frame() const { // TODO(1233797): The frame hierarchy needs to change. It's diff --git a/deps/v8/src/frames.h b/deps/v8/src/frames.h index fed11c4faf..8d7d6a3260 100644 --- a/deps/v8/src/frames.h +++ b/deps/v8/src/frames.h @@ -710,6 +710,8 @@ class JavaScriptFrameIteratorTemp BASE_EMBEDDED { inline explicit JavaScriptFrameIteratorTemp(Isolate* isolate); + inline JavaScriptFrameIteratorTemp(Isolate* isolate, ThreadLocalTop* top); + // Skip frames until the frame with the given id is reached. explicit JavaScriptFrameIteratorTemp(StackFrame::Id id) { AdvanceToId(id); } diff --git a/deps/v8/src/runtime.cc b/deps/v8/src/runtime.cc index b1c4c102ec..9153312bec 100644 --- a/deps/v8/src/runtime.cc +++ b/deps/v8/src/runtime.cc @@ -8201,6 +8201,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); @@ -8247,17 +8272,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();