Commit 819323f2 authored by vegorov@chromium.org's avatar vegorov@chromium.org

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: http://v8.googlecode.com/svn/branches/bleeding_edge@9588 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 554a12fb
...@@ -262,6 +262,15 @@ inline JavaScriptFrameIteratorTemp<Iterator>::JavaScriptFrameIteratorTemp( ...@@ -262,6 +262,15 @@ inline JavaScriptFrameIteratorTemp<Iterator>::JavaScriptFrameIteratorTemp(
if (!done()) Advance(); if (!done()) Advance();
} }
template<typename Iterator>
inline JavaScriptFrameIteratorTemp<Iterator>::JavaScriptFrameIteratorTemp(
Isolate* isolate, ThreadLocalTop* top)
: iterator_(isolate, top) {
if (!done()) Advance();
}
template<typename Iterator> template<typename Iterator>
inline JavaScriptFrame* JavaScriptFrameIteratorTemp<Iterator>::frame() const { inline JavaScriptFrame* JavaScriptFrameIteratorTemp<Iterator>::frame() const {
// TODO(1233797): The frame hierarchy needs to change. It's // TODO(1233797): The frame hierarchy needs to change. It's
......
...@@ -702,6 +702,8 @@ class JavaScriptFrameIteratorTemp BASE_EMBEDDED { ...@@ -702,6 +702,8 @@ class JavaScriptFrameIteratorTemp BASE_EMBEDDED {
inline explicit JavaScriptFrameIteratorTemp(Isolate* isolate); inline explicit JavaScriptFrameIteratorTemp(Isolate* isolate);
inline JavaScriptFrameIteratorTemp(Isolate* isolate, ThreadLocalTop* top);
// Skip frames until the frame with the given id is reached. // Skip frames until the frame with the given id is reached.
explicit JavaScriptFrameIteratorTemp(StackFrame::Id id) { AdvanceToId(id); } explicit JavaScriptFrameIteratorTemp(StackFrame::Id id) { AdvanceToId(id); }
......
...@@ -8178,6 +8178,31 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_LazyRecompile) { ...@@ -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) { RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyDeoptimized) {
HandleScope scope(isolate); HandleScope scope(isolate);
ASSERT(args.length() == 1); ASSERT(args.length() == 1);
...@@ -8224,17 +8249,24 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyDeoptimized) { ...@@ -8224,17 +8249,24 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyDeoptimized) {
return isolate->heap()->undefined_value(); return isolate->heap()->undefined_value();
} }
// Count the number of optimized activations of the function. // Find other optimized activations of the function.
int activations = 0; bool has_other_activations = false;
while (!it.done()) { while (!it.done()) {
JavaScriptFrame* frame = it.frame(); JavaScriptFrame* frame = it.frame();
if (frame->is_optimized() && frame->function() == *function) { if (frame->is_optimized() && frame->function() == *function) {
activations++; has_other_activations = true;
break;
} }
it.Advance(); 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) { if (FLAG_trace_deopt) {
PrintF("[removing optimized code for: "); PrintF("[removing optimized code for: ");
function->PrintName(); function->PrintName();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment