| Index: src/deoptimizer.cc
|
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
|
| index 7335fa54612e341ad05e59b81663caa39663a9c5..21c39023b0353a3509a6166c6ba79db7497c406b 100644
|
| --- a/src/deoptimizer.cc
|
| +++ b/src/deoptimizer.cc
|
| @@ -2683,8 +2683,14 @@ DeoptimizedFrameInfo::DeoptimizedFrameInfo(TranslatedState* state,
|
| parameter_frame != state->begin() &&
|
| (parameter_frame - 1)->kind() == TranslatedFrame::kConstructStub;
|
|
|
| - source_position_ = Deoptimizer::ComputeSourcePosition(
|
| - *frame_it->shared_info(), frame_it->node_id());
|
| + if (frame_it->kind() == TranslatedFrame::kInterpretedFunction) {
|
| + source_position_ = Deoptimizer::ComputeSourcePositionFromBytecodeArray(
|
| + *frame_it->shared_info(), frame_it->node_id());
|
| + } else {
|
| + DCHECK_EQ(TranslatedFrame::kFunction, frame_it->kind());
|
| + source_position_ = Deoptimizer::ComputeSourcePositionFromBaselineCode(
|
| + *frame_it->shared_info(), frame_it->node_id());
|
| + }
|
|
|
| TranslatedFrame::iterator value_it = frame_it->begin();
|
| // Get the function. Note that this might materialize the function.
|
| @@ -2762,22 +2768,27 @@ Deoptimizer::DeoptInfo Deoptimizer::GetDeoptInfo(Code* code, Address pc) {
|
|
|
|
|
| // static
|
| -int Deoptimizer::ComputeSourcePosition(SharedFunctionInfo* shared,
|
| - BailoutId node_id) {
|
| - AbstractCode* abstract_code = shared->abstract_code();
|
| - int code_offset;
|
| - if (abstract_code->IsBytecodeArray()) {
|
| - // BailoutId points to the next bytecode in the bytecode aray. Subtract
|
| - // 1 to get the end of current bytecode.
|
| - code_offset = node_id.ToInt() - 1;
|
| - } else {
|
| - FixedArray* raw_data = abstract_code->GetCode()->deoptimization_data();
|
| - DeoptimizationOutputData* data = DeoptimizationOutputData::cast(raw_data);
|
| - unsigned pc_and_state = Deoptimizer::GetOutputInfo(data, node_id, shared);
|
| - code_offset =
|
| - static_cast<int>(FullCodeGenerator::PcField::decode(pc_and_state));
|
| - }
|
| - return abstract_code->SourcePosition(code_offset);
|
| +int Deoptimizer::ComputeSourcePositionFromBaselineCode(
|
| + SharedFunctionInfo* shared, BailoutId node_id) {
|
| + DCHECK(shared->HasBaselineCode());
|
| + Code* code = shared->code();
|
| + FixedArray* raw_data = code->deoptimization_data();
|
| + DeoptimizationOutputData* data = DeoptimizationOutputData::cast(raw_data);
|
| + unsigned pc_and_state = Deoptimizer::GetOutputInfo(data, node_id, shared);
|
| + int code_offset =
|
| + static_cast<int>(FullCodeGenerator::PcField::decode(pc_and_state));
|
| + return AbstractCode::cast(code)->SourcePosition(code_offset);
|
| +}
|
| +
|
| +// static
|
| +int Deoptimizer::ComputeSourcePositionFromBytecodeArray(
|
| + SharedFunctionInfo* shared, BailoutId node_id) {
|
| + DCHECK(shared->HasBytecodeArray());
|
| + // BailoutId points to the next bytecode in the bytecode aray. Subtract
|
| + // 1 to get the end of current bytecode.
|
| + int code_offset = node_id.ToInt() - 1;
|
| + return AbstractCode::cast(shared->bytecode_array())
|
| + ->SourcePosition(code_offset);
|
| }
|
|
|
| // static
|
|
|