Index: src/frames.cc |
diff --git a/src/frames.cc b/src/frames.cc |
index 912c822d1789c4b1e9b64133ea4428498c376f93..9549c2db653621210a28c72a050b14950512eb4e 100644 |
--- a/src/frames.cc |
+++ b/src/frames.cc |
@@ -984,14 +984,16 @@ void OptimizedFrame::Summarize(List<FrameSummary>* frames) { |
// to construct a stack trace, the receiver is always in a stack slot. |
opcode = static_cast<Translation::Opcode>(it.Next()); |
ASSERT(opcode == Translation::STACK_SLOT || |
- opcode == Translation::LITERAL); |
+ opcode == Translation::LITERAL || |
+ opcode == Translation::CAPTURED_OBJECT || |
+ opcode == Translation::DUPLICATED_OBJECT); |
int index = it.Next(); |
// Get the correct receiver in the optimized frame. |
Object* receiver = NULL; |
if (opcode == Translation::LITERAL) { |
receiver = data->LiteralArray()->get(index); |
- } else { |
+ } else if (opcode == Translation::STACK_SLOT) { |
// Positive index means the value is spilled to the locals |
// area. Negative means it is stored in the incoming parameter |
// area. |
@@ -1007,6 +1009,12 @@ void OptimizedFrame::Summarize(List<FrameSummary>* frames) { |
? this->receiver() |
: this->GetParameter(parameter_index); |
} |
+ } else { |
+ // TODO(3029): Materializing a captured object (or duplicated |
+ // object) is hard, we return undefined for now. This breaks the |
+ // produced stack trace, as constructor frames aren't marked as |
+ // such anymore. |
+ receiver = isolate()->heap()->undefined_value(); |
} |
Code* code = function->shared()->code(); |