| Index: src/compiler/instruction-selector.cc
|
| diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc
|
| index 0e3f341f4f2a1c16d88e4deece82138e7dc4bc27..b31ce4eb121ef629b71c329a12dd54527044d33e 100644
|
| --- a/src/compiler/instruction-selector.cc
|
| +++ b/src/compiler/instruction-selector.cc
|
| @@ -1001,15 +1001,21 @@ void InstructionSelector::VisitThrow(Node* value) {
|
|
|
| FrameStateDescriptor* InstructionSelector::GetFrameStateDescriptor(
|
| Node* state) {
|
| - DCHECK(state->op()->opcode() == IrOpcode::kFrameState);
|
| + DCHECK(state->opcode() == IrOpcode::kFrameState);
|
| + DCHECK_EQ(5, state->InputCount());
|
| FrameStateCallInfo state_info = OpParameter<FrameStateCallInfo>(state);
|
| - Node* parameters = state->InputAt(0);
|
| - Node* locals = state->InputAt(1);
|
| - Node* stack = state->InputAt(2);
|
| + int parameters = OpParameter<int>(state->InputAt(0));
|
| + int locals = OpParameter<int>(state->InputAt(1));
|
| + int stack = OpParameter<int>(state->InputAt(2));
|
| +
|
| + FrameStateDescriptor* outer_state = NULL;
|
| + Node* outer_node = state->InputAt(4);
|
| + if (outer_node->opcode() == IrOpcode::kFrameState) {
|
| + outer_state = GetFrameStateDescriptor(outer_node);
|
| + }
|
|
|
| return new (instruction_zone())
|
| - FrameStateDescriptor(state_info, OpParameter<int>(parameters),
|
| - OpParameter<int>(locals), OpParameter<int>(stack));
|
| + FrameStateDescriptor(state_info, parameters, locals, stack, outer_state);
|
| }
|
|
|
|
|
| @@ -1031,6 +1037,10 @@ void InstructionSelector::AddFrameStateInputs(
|
| FrameStateDescriptor* descriptor) {
|
| DCHECK_EQ(IrOpcode::kFrameState, state->op()->opcode());
|
|
|
| + if (descriptor->outer_state() != NULL) {
|
| + AddFrameStateInputs(state->InputAt(4), inputs, descriptor->outer_state());
|
| + }
|
| +
|
| Node* parameters = state->InputAt(0);
|
| Node* locals = state->InputAt(1);
|
| Node* stack = state->InputAt(2);
|
|
|