Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index 525ccec5bab91ee5be43811162396fd7c322672c..c42d0c94c82ed7e9447f9cc9e7bca9b57ea13f41 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -170,8 +170,16 @@ DeoptimizedFrameInfo* Deoptimizer::DebuggerInspectableFrame( |
deoptimizer->output_[frame_index - 1]->GetFrameType() == |
StackFrame::ARGUMENTS_ADAPTOR; |
- DeoptimizedFrameInfo* info = |
- new DeoptimizedFrameInfo(deoptimizer, frame_index, has_arguments_adaptor); |
+ int construct_offset = has_arguments_adaptor ? 2 : 1; |
+ bool has_construct_stub = |
+ frame_index >= construct_offset && |
+ deoptimizer->output_[frame_index - construct_offset]->GetFrameType() == |
+ StackFrame::CONSTRUCT; |
+ |
+ DeoptimizedFrameInfo* info = new DeoptimizedFrameInfo(deoptimizer, |
+ frame_index, |
+ has_arguments_adaptor, |
+ has_construct_stub); |
isolate->deoptimizer_data()->deoptimized_frame_info_ = info; |
// Get the "simulated" top and size for the requested frame. |
@@ -570,6 +578,9 @@ void Deoptimizer::DoComputeOutputFrames() { |
case Translation::ARGUMENTS_ADAPTOR_FRAME: |
DoComputeArgumentsAdaptorFrame(&iterator, i); |
break; |
+ case Translation::CONSTRUCT_STUB_FRAME: |
+ DoComputeConstructStubFrame(&iterator, i); |
+ break; |
default: |
UNREACHABLE(); |
break; |
@@ -686,6 +697,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
case Translation::BEGIN: |
case Translation::JS_FRAME: |
case Translation::ARGUMENTS_ADAPTOR_FRAME: |
+ case Translation::CONSTRUCT_STUB_FRAME: |
case Translation::DUPLICATE: |
UNREACHABLE(); |
return; |
@@ -873,6 +885,7 @@ bool Deoptimizer::DoOsrTranslateCommand(TranslationIterator* iterator, |
case Translation::BEGIN: |
case Translation::JS_FRAME: |
case Translation::ARGUMENTS_ADAPTOR_FRAME: |
+ case Translation::CONSTRUCT_STUB_FRAME: |
case Translation::DUPLICATE: |
UNREACHABLE(); // Malformed input. |
return false; |
@@ -1205,7 +1218,8 @@ FrameDescription::FrameDescription(uint32_t frame_size, |
function_(function), |
top_(kZapUint32), |
pc_(kZapUint32), |
- fp_(kZapUint32) { |
+ fp_(kZapUint32), |
+ context_(kZapUint32) { |
// Zap all the registers. |
for (int r = 0; r < Register::kNumRegisters; r++) { |
SetRegister(r, kZapUint32); |
@@ -1319,6 +1333,13 @@ Handle<ByteArray> TranslationBuffer::CreateByteArray() { |
} |
+void Translation::BeginConstructStubFrame(int literal_id, unsigned height) { |
+ buffer_->Add(CONSTRUCT_STUB_FRAME); |
+ buffer_->Add(literal_id); |
+ buffer_->Add(height); |
+} |
+ |
+ |
void Translation::BeginArgumentsAdaptorFrame(int literal_id, unsigned height) { |
buffer_->Add(ARGUMENTS_ADAPTOR_FRAME); |
buffer_->Add(literal_id); |
@@ -1401,6 +1422,7 @@ int Translation::NumberOfOperandsFor(Opcode opcode) { |
return 1; |
case BEGIN: |
case ARGUMENTS_ADAPTOR_FRAME: |
+ case CONSTRUCT_STUB_FRAME: |
return 2; |
case JS_FRAME: |
return 3; |
@@ -1420,6 +1442,8 @@ const char* Translation::StringFor(Opcode opcode) { |
return "JS_FRAME"; |
case ARGUMENTS_ADAPTOR_FRAME: |
return "ARGUMENTS_ADAPTOR_FRAME"; |
+ case CONSTRUCT_STUB_FRAME: |
+ return "CONSTRUCT_STUB_FRAME"; |
case REGISTER: |
return "REGISTER"; |
case INT32_REGISTER: |
@@ -1475,6 +1499,7 @@ SlotRef SlotRef::ComputeSlotForNextArgument(TranslationIterator* iterator, |
case Translation::BEGIN: |
case Translation::JS_FRAME: |
case Translation::ARGUMENTS_ADAPTOR_FRAME: |
+ case Translation::CONSTRUCT_STUB_FRAME: |
// Peeled off before getting here. |
break; |
@@ -1597,10 +1622,13 @@ Vector<SlotRef> SlotRef::ComputeSlotMappingForArguments( |
#ifdef ENABLE_DEBUGGER_SUPPORT |
-DeoptimizedFrameInfo::DeoptimizedFrameInfo( |
- Deoptimizer* deoptimizer, int frame_index, bool has_arguments_adaptor) { |
+DeoptimizedFrameInfo::DeoptimizedFrameInfo(Deoptimizer* deoptimizer, |
+ int frame_index, |
+ bool has_arguments_adaptor, |
+ bool has_construct_stub) { |
FrameDescription* output_frame = deoptimizer->output_[frame_index]; |
- SetFunction(output_frame->GetFunction()); |
+ function_ = output_frame->GetFunction(); |
+ has_construct_stub_ = has_construct_stub; |
expression_count_ = output_frame->GetExpressionCount(); |
expression_stack_ = new Object*[expression_count_]; |
pc_ = output_frame->GetPc(); |