Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index a460603871e805ad95e7e3b0e1aa51340bc28ac5..1d55279884bdf452ca0fa3d6245728598f85ff72 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -964,10 +964,6 @@ void Deoptimizer::DoComputeJSFrame(TranslatedFrame* translated_frame, |
} |
value = reinterpret_cast<intptr_t>(context); |
output_frame->SetContext(value); |
- if (is_topmost) { |
- Register context_reg = JavaScriptFrame::context_register(); |
- output_frame->SetRegister(context_reg.code(), value); |
- } |
WriteValueToOutput(context, context_input_index, frame_index, output_offset, |
"context "); |
if (context == isolate_->heap()->arguments_marker()) { |
@@ -1033,6 +1029,15 @@ void Deoptimizer::DoComputeJSFrame(TranslatedFrame* translated_frame, |
: FullCodeGenerator::BailoutStateField::decode(pc_and_state); |
output_frame->SetState(Smi::FromInt(static_cast<int>(state))); |
+ // Clear the context register. The context might be a de-materialized object |
+ // and will be materialized by {Runtime_NotifyDeoptimized}. For additional |
+ // safety we use Smi(0) instead of the potential {arguments_marker} here. |
+ if (is_topmost) { |
+ intptr_t context_value = reinterpret_cast<intptr_t>(Smi::FromInt(0)); |
+ Register context_reg = JavaScriptFrame::context_register(); |
+ output_frame->SetRegister(context_reg.code(), context_value); |
+ } |
+ |
// Set the continuation for the topmost frame. |
if (is_topmost) { |
Builtins* builtins = isolate_->builtins(); |
@@ -1191,10 +1196,6 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame, |
Object* context = context_pos->GetRawValue(); |
value = reinterpret_cast<intptr_t>(context); |
output_frame->SetContext(value); |
- if (is_topmost) { |
- Register context_reg = InterpretedFrame::context_register(); |
- output_frame->SetRegister(context_reg.code(), value); |
- } |
WriteValueToOutput(context, context_input_index, frame_index, output_offset, |
"context "); |
if (context == isolate_->heap()->arguments_marker()) { |
@@ -1288,6 +1289,15 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame, |
} |
} |
+ // Clear the context register. The context might be a de-materialized object |
+ // and will be materialized by {Runtime_NotifyDeoptimized}. For additional |
+ // safety we use Smi(0) instead of the potential {arguments_marker} here. |
+ if (is_topmost) { |
+ intptr_t context_value = reinterpret_cast<intptr_t>(Smi::FromInt(0)); |
+ Register context_reg = JavaScriptFrame::context_register(); |
+ output_frame->SetRegister(context_reg.code(), context_value); |
+ } |
+ |
// Set the continuation for the topmost frame. |
if (is_topmost) { |
Code* continuation = builtins->builtin(Builtins::kNotifyDeoptimized); |
@@ -1591,10 +1601,6 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame, |
output_offset -= kPointerSize; |
value = output_[frame_index - 1]->GetContext(); |
output_frame->SetFrameSlot(output_offset, value); |
- if (is_topmost) { |
- Register context_reg = JavaScriptFrame::context_register(); |
- output_frame->SetRegister(context_reg.code(), value); |
- } |
DebugPrintOutputSlot(value, frame_index, output_offset, "context\n"); |
// The allocation site. |
@@ -1650,6 +1656,15 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame, |
} |
} |
+ // Clear the context register. The context might be a de-materialized object |
+ // and will be materialized by {Runtime_NotifyDeoptimized}. For additional |
+ // safety we use Smi(0) instead of the potential {arguments_marker} here. |
+ if (is_topmost) { |
+ intptr_t context_value = reinterpret_cast<intptr_t>(Smi::FromInt(0)); |
+ Register context_reg = JavaScriptFrame::context_register(); |
+ output_frame->SetRegister(context_reg.code(), context_value); |
+ } |
+ |
// Set the continuation for the topmost frame. |
if (is_topmost) { |
Builtins* builtins = isolate_->builtins(); |
@@ -1776,10 +1791,6 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslatedFrame* translated_frame, |
output_offset -= kPointerSize; |
value = output_[frame_index - 1]->GetContext(); |
output_frame->SetFrameSlot(output_offset, value); |
- if (is_topmost) { |
- Register context_reg = JavaScriptFrame::context_register(); |
- output_frame->SetRegister(context_reg.code(), value); |
- } |
DebugPrintOutputSlot(value, frame_index, output_offset, "context\n"); |
// Skip receiver. |
@@ -1829,6 +1840,15 @@ void Deoptimizer::DoComputeAccessorStubFrame(TranslatedFrame* translated_frame, |
} |
} |
+ // Clear the context register. The context might be a de-materialized object |
+ // and will be materialized by {Runtime_NotifyDeoptimized}. For additional |
+ // safety we use Smi(0) instead of the potential {arguments_marker} here. |
+ if (is_topmost) { |
+ intptr_t context_value = reinterpret_cast<intptr_t>(Smi::FromInt(0)); |
+ Register context_reg = JavaScriptFrame::context_register(); |
+ output_frame->SetRegister(context_reg.code(), context_value); |
+ } |
+ |
// Set the continuation for the topmost frame. |
if (is_topmost) { |
Builtins* builtins = isolate_->builtins(); |