Index: src/code-stubs-hydrogen.cc |
diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc |
index 76786d151184ca0391ce82b5dec321b009452192..a7901796966b42c23e1a64d1a8bbab01ab4c2261 100644 |
--- a/src/code-stubs-hydrogen.cc |
+++ b/src/code-stubs-hydrogen.cc |
@@ -150,26 +150,24 @@ bool CodeStubGraphBuilderBase::BuildGraph() { |
next_block->SetJoinId(BailoutId::StubEntry()); |
set_current_block(next_block); |
+ bool runtime_stack_params = descriptor_->stack_parameter_count_.is_valid(); |
+ HInstruction* stack_parameter_count = NULL; |
for (int i = 0; i < param_count; ++i) { |
- HParameter* param = |
- Add<HParameter>(i, HParameter::REGISTER_PARAMETER); |
+ Representation r = descriptor_->IsParameterCountRegister(i) |
+ ? Representation::Integer32() |
+ : Representation::Tagged(); |
+ HParameter* param = Add<HParameter>(i, HParameter::REGISTER_PARAMETER, r); |
start_environment->Bind(i, param); |
parameters_[i] = param; |
+ if (descriptor_->IsParameterCountRegister(i)) { |
+ param->set_type(HType::Smi()); |
+ stack_parameter_count = param; |
+ arguments_length_ = stack_parameter_count; |
+ } |
} |
- HInstruction* stack_parameter_count; |
- if (descriptor_->stack_parameter_count_.is_valid()) { |
- ASSERT(descriptor_->environment_length() == (param_count + 1)); |
- stack_parameter_count = New<HParameter>(param_count, |
- HParameter::REGISTER_PARAMETER, |
- Representation::Integer32()); |
- stack_parameter_count->set_type(HType::Smi()); |
- // It's essential to bind this value to the environment in case of deopt. |
- AddInstruction(stack_parameter_count); |
- start_environment->Bind(param_count, stack_parameter_count); |
- arguments_length_ = stack_parameter_count; |
- } else { |
- ASSERT(descriptor_->environment_length() == param_count); |
+ ASSERT(!runtime_stack_params || arguments_length_ != NULL); |
+ if (!runtime_stack_params) { |
stack_parameter_count = graph()->GetConstantMinus1(); |
arguments_length_ = graph()->GetConstant0(); |
} |
@@ -189,10 +187,11 @@ bool CodeStubGraphBuilderBase::BuildGraph() { |
if (descriptor_->function_mode_ == JS_FUNCTION_STUB_MODE) { |
if (!stack_parameter_count->IsConstant() && |
descriptor_->hint_stack_parameter_count_ < 0) { |
- HInstruction* amount = graph()->GetConstant1(); |
- stack_pop_count = Add<HAdd>(stack_parameter_count, amount); |
- stack_pop_count->ChangeRepresentation(Representation::Integer32()); |
+ HInstruction* constant_one = graph()->GetConstant1(); |
+ stack_pop_count = Add<HAdd>(stack_parameter_count, constant_one); |
stack_pop_count->ClearFlag(HValue::kCanOverflow); |
+ // TODO(mvstanton): verify that stack_parameter_count+1 really fits in a |
+ // smi. |
} else { |
int count = descriptor_->hint_stack_parameter_count_; |
stack_pop_count = Add<HConstant>(count); |