From c1f95cca946cab059a0c60a7837e308821dfb3f3 Mon Sep 17 00:00:00 2001 From: "yangguo@chromium.org" Date: Tue, 31 Jan 2012 12:08:33 +0000 Subject: [PATCH] Add GC handling for new field in DeoptimizedFrameInfo. Review URL: https://chromiumcodereview.appspot.com/9301030 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10564 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/deoptimizer.cc | 7 ++++++- src/deoptimizer.h | 6 +++--- src/runtime.cc | 12 ++++++------ 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc index 327caa9..8c49cab 100644 --- a/src/deoptimizer.cc +++ b/src/deoptimizer.cc @@ -1604,7 +1604,11 @@ DeoptimizedFrameInfo::DeoptimizedFrameInfo( SetFunction(output_frame->GetFunction()); expression_count_ = output_frame->GetExpressionCount(); expression_stack_ = new Object*[expression_count_]; - pc_ = output_frame->GetPc(); + // Get the source position using the unoptimized code. + Address pc = reinterpret_cast
(output_frame->GetPc()); + Code* code = Code::cast(Isolate::Current()->heap()->FindCodeObject(pc)); + source_position_ = code->SourcePosition(pc); + for (int i = 0; i < expression_count_; i++) { SetExpression(i, output_frame->GetExpression(i)); } @@ -1627,6 +1631,7 @@ DeoptimizedFrameInfo::~DeoptimizedFrameInfo() { delete[] parameters_; } + void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) { v->VisitPointer(BitCast(&function_)); v->VisitPointers(parameters_, parameters_ + parameters_count_); diff --git a/src/deoptimizer.h b/src/deoptimizer.h index db6a59a..ef6e3ec 100644 --- a/src/deoptimizer.h +++ b/src/deoptimizer.h @@ -749,8 +749,8 @@ class DeoptimizedFrameInfo : public Malloced { return expression_stack_[index]; } - Address GetPc() { - return reinterpret_cast
(pc_); + int GetSourcePosition() { + return source_position_; } private: @@ -776,7 +776,7 @@ class DeoptimizedFrameInfo : public Malloced { int expression_count_; Object** parameters_; Object** expression_stack_; - intptr_t pc_; + int source_position_; friend class Deoptimizer; }; diff --git a/src/runtime.cc b/src/runtime.cc index 5e007e2..7f3d318 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -10747,10 +10747,10 @@ class FrameInspector { ? deoptimized_frame_->GetExpression(index) : frame_->GetExpression(index); } - Address GetPc() { + int GetSourcePosition() { return is_optimized_ - ? deoptimized_frame_->GetPc() - : frame_->pc(); + ? deoptimized_frame_->GetSourcePosition() + : frame_->LookupCode()->SourcePosition(frame_->pc()); } // To inspect all the provided arguments the frame might need to be @@ -10858,15 +10858,15 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameDetails) { Handle frame_id(WrapFrameId(it.frame()->id()), isolate); // Find source position in unoptimized code. - Handle function(JSFunction::cast(frame_inspector.GetFunction())); - Handle shared(function->shared()); - int position = shared->code()->SourcePosition(frame_inspector.GetPc()); + int position = frame_inspector.GetSourcePosition(); // Check for constructor frame. Inlined frames cannot be construct calls. bool inlined_frame = is_optimized && inlined_jsframe_index != 0; bool constructor = !inlined_frame && it.frame()->IsConstructor(); // Get scope info and read from it for local variable information. + Handle function(JSFunction::cast(frame_inspector.GetFunction())); + Handle shared(function->shared()); Handle scope_info(shared->scope_info()); ASSERT(*scope_info != ScopeInfo::Empty()); -- 2.7.4