| Index: src/deoptimizer.cc
|
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
|
| index aab69c3422abb5450248ddc7cd695fa9192b2f81..5c9460aff95b27d8a6e6932ffe318d7698f35c36 100644
|
| --- a/src/deoptimizer.cc
|
| +++ b/src/deoptimizer.cc
|
| @@ -313,6 +313,7 @@ Deoptimizer::Deoptimizer(Isolate* isolate,
|
| fp_to_sp_delta_(fp_to_sp_delta),
|
| input_(NULL),
|
| output_count_(0),
|
| + jsframes_count_(0),
|
| output_(NULL),
|
| frame_alignment_marker_(isolate->heap()->frame_alignment_marker()),
|
| has_alignment_padding_(0),
|
| @@ -524,7 +525,21 @@ void Deoptimizer::DoComputeOutputFrames() {
|
|
|
| // Translate each output frame.
|
| for (int i = 0; i < count; ++i) {
|
| - DoComputeFrame(&iterator, i);
|
| + // Read the ast node id, function, and frame height for this output frame.
|
| + Translation::Opcode opcode =
|
| + static_cast<Translation::Opcode>(iterator.Next());
|
| + switch (opcode) {
|
| + case Translation::FRAME:
|
| + DoComputeFrame(&iterator, i);
|
| + jsframes_count_++;
|
| + break;
|
| + case Translation::ARGUMENTS_ADAPTOR_FRAME:
|
| + DoComputeArgumentsAdaptorFrame(&iterator, i);
|
| + break;
|
| + default:
|
| + UNREACHABLE();
|
| + break;
|
| + }
|
| }
|
|
|
| // Print some helpful diagnostic information.
|
| @@ -623,6 +638,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| switch (opcode) {
|
| case Translation::BEGIN:
|
| case Translation::FRAME:
|
| + case Translation::ARGUMENTS_ADAPTOR_FRAME:
|
| case Translation::DUPLICATE:
|
| UNREACHABLE();
|
| return;
|
| @@ -809,6 +825,7 @@ bool Deoptimizer::DoOsrTranslateCommand(TranslationIterator* iterator,
|
| switch (opcode) {
|
| case Translation::BEGIN:
|
| case Translation::FRAME:
|
| + case Translation::ARGUMENTS_ADAPTOR_FRAME:
|
| case Translation::DUPLICATE:
|
| UNREACHABLE(); // Malformed input.
|
| return false;
|
| @@ -1242,6 +1259,13 @@ Handle<ByteArray> TranslationBuffer::CreateByteArray() {
|
| }
|
|
|
|
|
| +void Translation::BeginArgumentsAdaptorFrame(int literal_id, unsigned height) {
|
| + buffer_->Add(ARGUMENTS_ADAPTOR_FRAME);
|
| + buffer_->Add(literal_id);
|
| + buffer_->Add(height);
|
| +}
|
| +
|
| +
|
| void Translation::BeginFrame(int node_id, int literal_id, unsigned height) {
|
| buffer_->Add(FRAME);
|
| buffer_->Add(node_id);
|
| @@ -1316,6 +1340,8 @@ int Translation::NumberOfOperandsFor(Opcode opcode) {
|
| case DOUBLE_STACK_SLOT:
|
| case LITERAL:
|
| return 1;
|
| + case ARGUMENTS_ADAPTOR_FRAME:
|
| + return 2;
|
| case FRAME:
|
| return 3;
|
| }
|
| @@ -1332,6 +1358,8 @@ const char* Translation::StringFor(Opcode opcode) {
|
| return "BEGIN";
|
| case FRAME:
|
| return "FRAME";
|
| + case ARGUMENTS_ADAPTOR_FRAME:
|
| + return "ARGUMENTS_ADAPTOR_FRAME";
|
| case REGISTER:
|
| return "REGISTER";
|
| case INT32_REGISTER:
|
| @@ -1386,6 +1414,7 @@ SlotRef SlotRef::ComputeSlotForNextArgument(TranslationIterator* iterator,
|
| switch (opcode) {
|
| case Translation::BEGIN:
|
| case Translation::FRAME:
|
| + case Translation::ARGUMENTS_ADAPTOR_FRAME:
|
| // Peeled off before getting here.
|
| break;
|
|
|
|
|