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