| 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();
|
|
|