Chromium Code Reviews| Index: src/code-stubs-hydrogen.cc |
| diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc |
| index bb8bfe3fdc4447e90683ffc8df0cf77514ae1cd5..026e777901fa3e2e1b8bc9fae67e806c79a6d08b 100644 |
| --- a/src/code-stubs-hydrogen.cc |
| +++ b/src/code-stubs-hydrogen.cc |
| @@ -124,11 +124,13 @@ bool CodeStubGraphBuilderBase::BuildGraph() { |
| parameters_[i] = param; |
| } |
| + HInstruction* stack_pop_count; |
|
danno
2013/03/20 21:07:33
nit: Can you define this down where you initially
mvstanton
2013/03/21 11:47:35
Done.
|
| HInstruction* stack_parameter_count; |
| if (descriptor_->stack_parameter_count_ != NULL) { |
| ASSERT(descriptor_->environment_length() == (param_count + 1)); |
| stack_parameter_count = new(zone) HParameter(param_count, |
| - HParameter::REGISTER_PARAMETER); |
| + HParameter::REGISTER_PARAMETER, |
| + Representation::Integer32()); |
| // it's essential to bind this value to the environment in case of deopt |
| start_environment->Bind(param_count, stack_parameter_count); |
| AddInstruction(stack_parameter_count); |
| @@ -139,6 +141,8 @@ bool CodeStubGraphBuilderBase::BuildGraph() { |
| arguments_length_ = graph()->GetConstant0(); |
| } |
| + stack_pop_count = stack_parameter_count; |
| + |
| context_ = new(zone) HContext(); |
| AddInstruction(context_); |
| start_environment->BindContext(context_); |
| @@ -146,13 +150,25 @@ bool CodeStubGraphBuilderBase::BuildGraph() { |
| AddSimulate(BailoutId::StubEntry()); |
| HValue* return_value = BuildCodeStub(); |
| + |
| + // We might have extra expressions to pop from the stack in addition to the |
| + // arguments above |
| + if (descriptor_->acting_as_js_function_) { |
| + HInstruction* amount = graph()->GetConstant1(); |
| + stack_pop_count = AddInstruction( |
| + HAdd::New(zone, context_, stack_parameter_count, amount)); |
| + stack_pop_count->ChangeRepresentation(Representation::Integer32()); |
| + stack_pop_count->ClearFlag(HValue::kCanOverflow); |
| + } |
| + |
| HReturn* hreturn_instruction = new(zone) HReturn(return_value, |
| context_, |
| - stack_parameter_count); |
| + stack_pop_count); |
| current_block()->Finish(hreturn_instruction); |
| return true; |
| } |
| + |
| template <class Stub> |
| class CodeStubGraphBuilder: public CodeStubGraphBuilderBase { |
| public: |