| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index b2badcdb50c9096a4e073589af604fc1959a8cb3..05bf544d8fb3e47684375a6475793c8deb417a7b 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -3550,6 +3550,7 @@ FunctionState::FunctionState(HOptimizedGraphBuilder* owner,
|
| function_return_(NULL),
|
| test_context_(NULL),
|
| entry_(NULL),
|
| + arguments_object_(NULL),
|
| arguments_elements_(NULL),
|
| outer_(owner->function_state()) {
|
| if (outer_ != NULL) {
|
| @@ -4701,18 +4702,18 @@ void HOptimizedGraphBuilder::SetUpScope(Scope* scope) {
|
| AddInstruction(undefined_constant);
|
| graph()->set_undefined_constant(undefined_constant);
|
|
|
| - HArgumentsObject* object = new(zone()) HArgumentsObject;
|
| - AddInstruction(object);
|
| - graph()->SetArgumentsObject(object);
|
| -
|
| - // Set the initial values of parameters including "this". "This" has
|
| - // parameter index 0.
|
| + // Create an arguments object containing the initial parameters. Set the
|
| + // initial values of parameters including "this" having parameter index 0.
|
| ASSERT_EQ(scope->num_parameters() + 1, environment()->parameter_count());
|
| -
|
| + HArgumentsObject* arguments_object =
|
| + new(zone()) HArgumentsObject(environment()->parameter_count(), zone());
|
| for (int i = 0; i < environment()->parameter_count(); ++i) {
|
| HInstruction* parameter = AddInstruction(new(zone()) HParameter(i));
|
| + arguments_object->AddArgument(parameter, zone());
|
| environment()->Bind(i, parameter);
|
| }
|
| + AddInstruction(arguments_object);
|
| + graph()->SetArgumentsObject(arguments_object);
|
|
|
| // First special is HContext.
|
| HInstruction* context = AddInstruction(new(zone()) HContext);
|
| @@ -7430,7 +7431,8 @@ void HOptimizedGraphBuilder::EnsureArgumentsArePushedForAccess() {
|
| HEnterInlined* entry = function_state()->entry();
|
| entry->set_arguments_pushed();
|
|
|
| - ZoneList<HValue*>* arguments_values = entry->arguments_values();
|
| + HArgumentsObject* arguments = entry->arguments_object();
|
| + const ZoneList<HValue*>* arguments_values = arguments->arguments_values();
|
|
|
| HInstruction* insert_after = entry;
|
| for (int i = 0; i < arguments_values->length(); i++) {
|
| @@ -8031,17 +8033,20 @@ bool HOptimizedGraphBuilder::TryInline(CallKind call_kind,
|
|
|
| AddSimulate(return_id);
|
| current_block()->UpdateEnvironment(inner_env);
|
| - ZoneList<HValue*>* arguments_values = NULL;
|
| + HArgumentsObject* arguments_object = NULL;
|
|
|
| - // If the function uses arguments copy current arguments values
|
| - // to use them for materialization.
|
| + // If the function uses arguments object create and bind one, also copy
|
| + // current arguments values to use them for materialization.
|
| if (function->scope()->arguments() != NULL) {
|
| + ASSERT(function->scope()->arguments()->IsStackAllocated());
|
| HEnvironment* arguments_env = inner_env->arguments_environment();
|
| int arguments_count = arguments_env->parameter_count();
|
| - arguments_values = new(zone()) ZoneList<HValue*>(arguments_count, zone());
|
| + arguments_object = new(zone()) HArgumentsObject(arguments_count, zone());
|
| + inner_env->Bind(function->scope()->arguments(), arguments_object);
|
| for (int i = 0; i < arguments_count; i++) {
|
| - arguments_values->Add(arguments_env->Lookup(i), zone());
|
| + arguments_object->AddArgument(arguments_env->Lookup(i), zone());
|
| }
|
| + AddInstruction(arguments_object);
|
| }
|
|
|
| HEnterInlined* enter_inlined =
|
| @@ -8050,20 +8055,12 @@ bool HOptimizedGraphBuilder::TryInline(CallKind call_kind,
|
| function,
|
| function_state()->inlining_kind(),
|
| function->scope()->arguments(),
|
| - arguments_values,
|
| + arguments_object,
|
| undefined_receiver,
|
| zone());
|
| function_state()->set_entry(enter_inlined);
|
| AddInstruction(enter_inlined);
|
|
|
| - // If the function uses arguments object create and bind one.
|
| - if (function->scope()->arguments() != NULL) {
|
| - ASSERT(function->scope()->arguments()->IsStackAllocated());
|
| - inner_env->Bind(function->scope()->arguments(),
|
| - graph()->GetArgumentsObject());
|
| - }
|
| -
|
| -
|
| VisitDeclarations(target_info.scope()->declarations());
|
| VisitStatements(function->body());
|
| if (HasStackOverflow()) {
|
| @@ -8494,13 +8491,10 @@ bool HOptimizedGraphBuilder::TryCallApply(Call* expr) {
|
| } else {
|
| // We are inside inlined function and we know exactly what is inside
|
| // arguments object. But we need to be able to materialize at deopt.
|
| - // TODO(mstarzinger): For now we just ensure arguments are pushed
|
| - // right after HEnterInlined, but we could be smarter about this.
|
| - EnsureArgumentsArePushedForAccess();
|
| ASSERT_EQ(environment()->arguments_environment()->parameter_count(),
|
| - function_state()->entry()->arguments_values()->length());
|
| - HEnterInlined* entry = function_state()->entry();
|
| - ZoneList<HValue*>* arguments_values = entry->arguments_values();
|
| + function_state()->entry()->arguments_object()->arguments_count());
|
| + HArgumentsObject* args = function_state()->entry()->arguments_object();
|
| + const ZoneList<HValue*>* arguments_values = args->arguments_values();
|
| int arguments_count = arguments_values->length();
|
| PushAndAdd(new(zone()) HWrapReceiver(receiver, function));
|
| for (int i = 1; i < arguments_count; i++) {
|
| @@ -11005,6 +10999,7 @@ HEnvironment::HEnvironment(HEnvironment* outer,
|
| values_(arguments, zone),
|
| frame_type_(frame_type),
|
| parameter_count_(arguments),
|
| + specials_count_(0),
|
| local_count_(0),
|
| outer_(outer),
|
| entry_(NULL),
|
|
|