Index: src/code-stubs-hydrogen.cc |
diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc |
index 0a8b9d5767db3f641979ea3b41aacfcf92feca73..3420c486b8085e0afd9eac8d1746cedbc243e749 100644 |
--- a/src/code-stubs-hydrogen.cc |
+++ b/src/code-stubs-hydrogen.cc |
@@ -129,7 +129,8 @@ bool CodeStubGraphBuilderBase::BuildGraph() { |
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); |
@@ -147,13 +148,26 @@ 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 |
+ HInstruction* stack_pop_count = stack_parameter_count; |
+ if (descriptor_->function_mode_ == JS_FUNCTION_STUB_MODE) { |
+ 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: |