Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index e00e5ab538a220a2244347d3c5fa3ba0f53eaccc..66c3f66c758340f77b112b90970e5712e97a7e53 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -1351,7 +1351,7 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame(int frame_index) { |
" translating arguments adaptor => height=%d\n", height_in_bytes); |
} |
- unsigned fixed_frame_size = ArgumentsAdaptorFrameConstants::kFrameSize; |
+ unsigned fixed_frame_size = ArgumentsAdaptorFrameConstants::kFixedFrameSize; |
unsigned output_frame_size = height_in_bytes + fixed_frame_size; |
// Allocate and store the output frame description. |
@@ -1459,7 +1459,7 @@ void Deoptimizer::DoComputeConstructStubFrame(int frame_index) { |
" translating construct stub => height=%d\n", height_in_bytes); |
} |
- unsigned fixed_frame_size = ConstructFrameConstants::kFrameSize; |
+ unsigned fixed_frame_size = ConstructFrameConstants::kFixedFrameSize; |
unsigned output_frame_size = height_in_bytes + fixed_frame_size; |
// Allocate and store the output frame description. |
@@ -1514,24 +1514,18 @@ void Deoptimizer::DoComputeConstructStubFrame(int frame_index) { |
"caller's constant_pool\n"); |
} |
- // The context can be gotten from the previous frame. |
- output_offset -= kPointerSize; |
- value = output_[frame_index - 1]->GetContext(); |
- output_frame->SetFrameSlot(output_offset, value); |
- DebugPrintOutputSlot(value, frame_index, output_offset, "context\n"); |
- |
- // A marker value is used in place of the function. |
+ // A marker value is used to mark the frame. |
output_offset -= kPointerSize; |
value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::CONSTRUCT)); |
output_frame->SetFrameSlot(output_offset, value); |
DebugPrintOutputSlot(value, frame_index, output_offset, |
- "function (construct sentinel)\n"); |
+ "typed frame marker\n"); |
- // The output frame reflects a JSConstructStubGeneric frame. |
+ // The context can be gotten from the previous frame. |
output_offset -= kPointerSize; |
- value = reinterpret_cast<intptr_t>(construct_stub); |
+ value = output_[frame_index - 1]->GetContext(); |
output_frame->SetFrameSlot(output_offset, value); |
- DebugPrintOutputSlot(value, frame_index, output_offset, "code object\n"); |
+ DebugPrintOutputSlot(value, frame_index, output_offset, "context\n"); |
// The allocation site. |
output_offset -= kPointerSize; |
@@ -1592,7 +1586,7 @@ void Deoptimizer::DoComputeAccessorStubFrame(int frame_index, |
} |
// We need 1 stack entry for the return address and enough entries for the |
- // StackFrame::INTERNAL (FP, context, frame type, code object and constant |
+ // StackFrame::INTERNAL (FP, frame type, context, code object and constant |
// pool (if enabled)- see MacroAssembler::EnterFrame). |
// For a setter stub frame we need one additional entry for the implicit |
// return value, see StoreStubCompiler::CompileStoreViaSetter. |
@@ -1642,17 +1636,11 @@ void Deoptimizer::DoComputeAccessorStubFrame(int frame_index, |
"caller's constant_pool\n"); |
} |
- // The context can be gotten from the previous frame. |
- output_offset -= kPointerSize; |
- value = output_[frame_index - 1]->GetContext(); |
- output_frame->SetFrameSlot(output_offset, value); |
- DebugPrintOutputSlot(value, frame_index, output_offset, "context\n"); |
- |
- // A marker value is used in place of the function. |
+ // Set the frame type. |
output_offset -= kPointerSize; |
value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::INTERNAL)); |
output_frame->SetFrameSlot(output_offset, value); |
- DebugPrintOutputSlot(value, frame_index, output_offset, "function "); |
+ DebugPrintOutputSlot(value, frame_index, output_offset, "frame type "); |
if (trace_scope_ != nullptr) { |
PrintF(trace_scope_->file(), "(%s sentinel)\n", kind); |
} |
@@ -1667,6 +1655,12 @@ void Deoptimizer::DoComputeAccessorStubFrame(int frame_index, |
output_frame->SetFrameSlot(output_offset, value); |
DebugPrintOutputSlot(value, frame_index, output_offset, "code object\n"); |
+ // The context can be gotten from the previous frame. |
+ output_offset -= kPointerSize; |
+ value = output_[frame_index - 1]->GetContext(); |
+ output_frame->SetFrameSlot(output_offset, value); |
+ DebugPrintOutputSlot(value, frame_index, output_offset, "context\n"); |
+ |
// Skip receiver. |
value_iterator++; |
input_index++; |
@@ -1751,9 +1745,8 @@ void Deoptimizer::DoComputeCompiledStubFrame(int frame_index) { |
CHECK_EQ(translated_frame->height(), param_count + 1); |
CHECK_GE(param_count, 0); |
- int height_in_bytes = kPointerSize * (param_count + stack_param_count) + |
- sizeof(Arguments) + kPointerSize; |
- int fixed_frame_size = StandardFrameConstants::kFixedFrameSize; |
+ int height_in_bytes = kPointerSize * (param_count + stack_param_count); |
+ int fixed_frame_size = StubFailureTrampolineFrameConstants::kFixedFrameSize; |
int input_frame_size = input_->GetFrameSize(); |
int output_frame_size = height_in_bytes + fixed_frame_size; |
if (trace_scope_ != NULL) { |
@@ -1774,8 +1767,10 @@ void Deoptimizer::DoComputeCompiledStubFrame(int frame_index) { |
// frame pointer and the output frame's height. Subtract space for the |
// context and function slots. |
Register fp_reg = StubFailureTrampolineFrame::fp_register(); |
- intptr_t top_address = input_->GetRegister(fp_reg.code()) - |
- StandardFrameConstants::kFixedFrameSizeFromFp - height_in_bytes; |
+ intptr_t top_address = |
+ input_->GetRegister(fp_reg.code()) - |
+ StubFailureTrampolineFrameConstants::kFixedFrameSizeFromFp - |
+ height_in_bytes; |
output_frame->SetTop(top_address); |
// Read caller's PC (JSFunction continuation) from the input frame. |
@@ -1788,13 +1783,13 @@ void Deoptimizer::DoComputeCompiledStubFrame(int frame_index) { |
// Read caller's FP from the input frame, and set this frame's FP. |
input_frame_offset -= kFPOnStackSize; |
- value = input_->GetFrameSlot(input_frame_offset); |
output_frame_offset -= kFPOnStackSize; |
- output_frame->SetCallerFp(output_frame_offset, value); |
+ intptr_t parent_frame_ptr = input_->GetFrameSlot(input_frame_offset); |
+ output_frame->SetCallerFp(output_frame_offset, parent_frame_ptr); |
intptr_t frame_ptr = input_->GetRegister(fp_reg.code()); |
output_frame->SetRegister(fp_reg.code(), frame_ptr); |
output_frame->SetFp(frame_ptr); |
- DebugPrintOutputSlot(value, frame_index, output_frame_offset, |
+ DebugPrintOutputSlot(frame_ptr, frame_index, output_frame_offset, |
"caller's fp\n"); |
if (FLAG_enable_embedded_constant_pool) { |
@@ -1807,12 +1802,7 @@ void Deoptimizer::DoComputeCompiledStubFrame(int frame_index) { |
"caller's constant_pool\n"); |
} |
- // Remember where the context will need to be written back from the deopt |
- // translation. |
- output_frame_offset -= kPointerSize; |
- unsigned context_frame_offset = output_frame_offset; |
- |
- // A marker value is used in place of the function. |
+ // The marker for the typed stack frame |
output_frame_offset -= kPointerSize; |
value = reinterpret_cast<intptr_t>( |
Smi::FromInt(StackFrame::STUB_FAILURE_TRAMPOLINE)); |
@@ -1873,8 +1863,6 @@ void Deoptimizer::DoComputeCompiledStubFrame(int frame_index) { |
Register context_reg = StubFailureTrampolineFrame::context_register(); |
value = reinterpret_cast<intptr_t>(maybe_context); |
output_frame->SetRegister(context_reg.code(), value); |
- output_frame->SetFrameSlot(context_frame_offset, value); |
- DebugPrintOutputSlot(value, frame_index, context_frame_offset, "context\n"); |
++value_iterator; |
// Copy constant stack parameters to the failure frame. If the number of stack |
@@ -2026,16 +2014,15 @@ void Deoptimizer::DebugPrintOutputSlot(intptr_t value, int frame_index, |
unsigned Deoptimizer::ComputeInputFrameSize() const { |
- unsigned fixed_size = StandardFrameConstants::kFixedFrameSize; |
- if (!function_->IsSmi()) { |
- fixed_size += ComputeIncomingArgumentSize(function_->shared()); |
- } else { |
- CHECK_EQ(Smi::cast(function_), Smi::FromInt(StackFrame::STUB)); |
- } |
+ unsigned fixed_size = (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) |
+ ? ComputeJavascriptFixedSize(function_->shared()) |
+ : TypedFrameConstants::kFixedFrameSize; |
// 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_ - |
- StandardFrameConstants::kFixedFrameSizeFromFp; |
+ ((compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) |
+ ? StandardFrameConstants::kFixedFrameSizeFromFp |
+ : TypedFrameConstants::kFixedFrameSizeFromFp); |
if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) { |
unsigned stack_slots = compiled_code_->stack_slots(); |
unsigned outgoing_size = |
@@ -2362,7 +2349,7 @@ void Translation::StoreArgumentsObject(bool args_known, |
void Translation::StoreJSFrameFunction() { |
StoreStackSlot((StandardFrameConstants::kCallerPCOffset - |
- StandardFrameConstants::kMarkerOffset) / |
+ StandardFrameConstants::kFunctionOffset) / |
kPointerSize); |
} |