Index: src/x64/deoptimizer-x64.cc |
diff --git a/src/x64/deoptimizer-x64.cc b/src/x64/deoptimizer-x64.cc |
index abac2b6b38c8979cd7dccdc31a45c4eca187ccae..787db5ac862e09737de0265ff6fceac6517e3573 100644 |
--- a/src/x64/deoptimizer-x64.cc |
+++ b/src/x64/deoptimizer-x64.cc |
@@ -340,6 +340,9 @@ void Deoptimizer::DoComputeOsrOutputFrame() { |
output_ = new FrameDescription*[1]; |
output_[0] = new(output_frame_size) FrameDescription( |
output_frame_size, function_); |
+#ifdef DEBUG |
+ output_[0]->SetKind(Code::OPTIMIZED_FUNCTION); |
+#endif |
// Clear the incoming parameters in the optimized frame to avoid |
// confusing the garbage collector. |
@@ -454,6 +457,9 @@ void Deoptimizer::DoComputeFrame(TranslationIterator* iterator, |
// Allocate and store the output frame description. |
FrameDescription* output_frame = |
new(output_frame_size) FrameDescription(output_frame_size, function); |
+#ifdef DEBUG |
+ output_frame->SetKind(Code::FUNCTION); |
+#endif |
bool is_bottommost = (0 == frame_index); |
bool is_topmost = (output_count_ - 1 == frame_index); |
@@ -584,7 +590,7 @@ void Deoptimizer::DoComputeFrame(TranslationIterator* iterator, |
output_frame->SetState(Smi::FromInt(state)); |
// Set the continuation for the topmost frame. |
- if (is_topmost) { |
+ if (is_topmost && bailout_type_ != DEBUGGER) { |
Code* continuation = (bailout_type_ == EAGER) |
? isolate_->builtins()->builtin(Builtins::kNotifyDeoptimized) |
: isolate_->builtins()->builtin(Builtins::kNotifyLazyDeoptimized); |
@@ -596,6 +602,26 @@ void Deoptimizer::DoComputeFrame(TranslationIterator* iterator, |
} |
+void Deoptimizer::FillInputFrame(Address tos, JavaScriptFrame* frame) { |
+ // Set the register values. The values are not important as there are no |
+ // callee saved registers in JavaScript frames, so all registers are |
+ // spilled. Registers rbp and rsp are set to the correct values though. |
+ for (int i = 0; i < Register::kNumRegisters; i++) { |
+ input_->SetRegister(i, i * 4); |
+ } |
+ input_->SetRegister(rsp.code(), reinterpret_cast<intptr_t>(frame->sp())); |
+ input_->SetRegister(rbp.code(), reinterpret_cast<intptr_t>(frame->fp())); |
+ for (int i = 0; i < DoubleRegister::kNumAllocatableRegisters; i++) { |
+ input_->SetDoubleRegister(i, 0.0); |
+ } |
+ |
+ // Fill the frame content from the actual data on the frame. |
+ for (intptr_t i = 0; i < input_->GetFrameSize(); i += kPointerSize) { |
+ input_->SetFrameSlot(i, Memory::uint64_at(tos + i)); |
+ } |
+} |
+ |
+ |
#define __ masm()-> |
void Deoptimizer::EntryGenerator::Generate() { |