Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index f9bc02428f1f4ffb403a8d1f37215349b10d2a22..767671aae52fc415792365cf1f0df574fd6a38c6 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -813,6 +813,8 @@ void Deoptimizer::DoComputeOutputFrames() { |
void Deoptimizer::DoComputeJSFrame(int frame_index) { |
TranslatedFrame* translated_frame = |
&(translated_state_.frames()[frame_index]); |
+ SharedFunctionInfo* shared = translated_frame->raw_shared_info(); |
+ |
TranslatedFrame::iterator value_iterator = translated_frame->begin(); |
int input_index = 0; |
@@ -825,14 +827,15 @@ void Deoptimizer::DoComputeJSFrame(int frame_index) { |
input_index++; |
if (trace_scope_ != NULL) { |
PrintF(trace_scope_->file(), " translating frame "); |
- function->PrintName(trace_scope_->file()); |
+ base::SmartArrayPointer<char> name = shared->DebugName()->ToCString(); |
+ PrintF(trace_scope_->file(), "%s", name.get()); |
PrintF(trace_scope_->file(), |
" => node=%d, height=%d\n", node_id.ToInt(), height_in_bytes); |
} |
// The 'fixed' part of the frame consists of the incoming parameters and |
// the part described by JavaScriptFrameConstants. |
- unsigned fixed_frame_size = ComputeJavascriptFixedSize(function); |
+ unsigned fixed_frame_size = ComputeJavascriptFixedSize(shared); |
unsigned input_frame_size = input_->GetFrameSize(); |
unsigned output_frame_size = height_in_bytes + fixed_frame_size; |
@@ -856,9 +859,8 @@ void Deoptimizer::DoComputeJSFrame(int frame_index) { |
if (is_bottommost) { |
// Determine whether the input frame contains alignment padding. |
has_alignment_padding_ = |
- (!compiled_code_->is_turbofanned() && HasAlignmentPadding(function)) |
- ? 1 |
- : 0; |
+ (!compiled_code_->is_turbofanned() && HasAlignmentPadding(shared)) ? 1 |
+ : 0; |
// 2 = context and function in the frame. |
// If the optimized frame had alignment padding, adjust the frame pointer |
// to point to the new position of the old frame pointer after padding |
@@ -872,8 +874,7 @@ void Deoptimizer::DoComputeJSFrame(int frame_index) { |
output_frame->SetTop(top_address); |
// Compute the incoming parameter translation. |
- int parameter_count = |
- function->shared()->internal_formal_parameter_count() + 1; |
+ int parameter_count = shared->internal_formal_parameter_count() + 1; |
unsigned output_offset = output_frame_size; |
unsigned input_offset = input_frame_size; |
for (int i = 0; i < parameter_count; ++i) { |
@@ -988,11 +989,11 @@ void Deoptimizer::DoComputeJSFrame(int frame_index) { |
CHECK_EQ(0u, output_offset); |
// Compute this frame's PC, state, and continuation. |
- Code* non_optimized_code = function->shared()->code(); |
+ Code* non_optimized_code = shared->code(); |
FixedArray* raw_data = non_optimized_code->deoptimization_data(); |
DeoptimizationOutputData* data = DeoptimizationOutputData::cast(raw_data); |
Address start = non_optimized_code->instruction_start(); |
- unsigned pc_and_state = GetOutputInfo(data, node_id, function->shared()); |
+ unsigned pc_and_state = GetOutputInfo(data, node_id, shared); |
unsigned pc_offset = FullCodeGenerator::PcField::decode(pc_and_state); |
intptr_t pc_value = reinterpret_cast<intptr_t>(start + pc_offset); |
output_frame->SetPc(pc_value); |
@@ -1033,6 +1034,8 @@ void Deoptimizer::DoComputeJSFrame(int frame_index) { |
void Deoptimizer::DoComputeInterpretedFrame(int frame_index) { |
TranslatedFrame* translated_frame = |
&(translated_state_.frames()[frame_index]); |
+ SharedFunctionInfo* shared = translated_frame->raw_shared_info(); |
+ |
TranslatedFrame::iterator value_iterator = translated_frame->begin(); |
int input_index = 0; |
@@ -1044,14 +1047,15 @@ void Deoptimizer::DoComputeInterpretedFrame(int frame_index) { |
input_index++; |
if (trace_scope_ != NULL) { |
PrintF(trace_scope_->file(), " translating interpreted frame "); |
- function->PrintName(trace_scope_->file()); |
+ base::SmartArrayPointer<char> name = shared->DebugName()->ToCString(); |
+ PrintF(trace_scope_->file(), "%s", name.get()); |
PrintF(trace_scope_->file(), " => bytecode_offset=%d, height=%d\n", |
bytecode_offset.ToInt(), height_in_bytes); |
} |
// The 'fixed' part of the frame consists of the incoming parameters and |
// the part described by InterpreterFrameConstants. |
- unsigned fixed_frame_size = ComputeInterpretedFixedSize(function); |
+ unsigned fixed_frame_size = ComputeInterpretedFixedSize(shared); |
unsigned input_frame_size = input_->GetFrameSize(); |
unsigned output_frame_size = height_in_bytes + fixed_frame_size; |
@@ -1084,8 +1088,7 @@ void Deoptimizer::DoComputeInterpretedFrame(int frame_index) { |
output_frame->SetTop(top_address); |
// Compute the incoming parameter translation. |
- int parameter_count = |
- function->shared()->internal_formal_parameter_count() + 1; |
+ int parameter_count = shared->internal_formal_parameter_count() + 1; |
unsigned output_offset = output_frame_size; |
unsigned input_offset = input_frame_size; |
for (int i = 0; i < parameter_count; ++i) { |
@@ -1981,7 +1984,12 @@ void Deoptimizer::DebugPrintOutputSlot(intptr_t value, int frame_index, |
unsigned Deoptimizer::ComputeInputFrameSize() const { |
- unsigned fixed_size = ComputeJavascriptFixedSize(function_); |
+ unsigned fixed_size = StandardFrameConstants::kFixedFrameSize; |
+ if (!function_->IsSmi()) { |
+ fixed_size += ComputeIncomingArgumentSize(function_->shared()); |
+ } else { |
+ CHECK_EQ(Smi::cast(function_), Smi::FromInt(StackFrame::STUB)); |
+ } |
// The fp-to-sp delta already takes the context, constant pool pointer and the |
// function into account so we have to avoid double counting them. |
unsigned result = fixed_size + fp_to_sp_delta_ - |
@@ -1995,34 +2003,26 @@ unsigned Deoptimizer::ComputeInputFrameSize() const { |
return result; |
} |
- |
-unsigned Deoptimizer::ComputeJavascriptFixedSize(JSFunction* function) const { |
+// static |
+unsigned Deoptimizer::ComputeJavascriptFixedSize(SharedFunctionInfo* shared) { |
// The fixed part of the frame consists of the return address, frame |
// pointer, function, context, and all the incoming arguments. |
- return ComputeIncomingArgumentSize(function) + |
+ return ComputeIncomingArgumentSize(shared) + |
StandardFrameConstants::kFixedFrameSize; |
} |
- |
-unsigned Deoptimizer::ComputeInterpretedFixedSize(JSFunction* function) const { |
+// static |
+unsigned Deoptimizer::ComputeInterpretedFixedSize(SharedFunctionInfo* shared) { |
// The fixed part of the frame consists of the return address, frame |
// pointer, function, context, new.target, bytecode offset and all the |
// incoming arguments. |
- return ComputeIncomingArgumentSize(function) + |
+ return ComputeIncomingArgumentSize(shared) + |
InterpreterFrameConstants::kFixedFrameSize; |
} |
- |
-unsigned Deoptimizer::ComputeIncomingArgumentSize(JSFunction* function) const { |
- // The incoming arguments is the values for formal parameters and |
- // the receiver. Every slot contains a pointer. |
- if (function->IsSmi()) { |
- CHECK_EQ(Smi::cast(function), Smi::FromInt(StackFrame::STUB)); |
- return 0; |
- } |
- unsigned arguments = |
- function->shared()->internal_formal_parameter_count() + 1; |
- return arguments * kPointerSize; |
+// static |
+unsigned Deoptimizer::ComputeIncomingArgumentSize(SharedFunctionInfo* shared) { |
+ return (shared->internal_formal_parameter_count() + 1) * kPointerSize; |
} |