| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
| 6 | 6 |
| 7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/compiler/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
| 9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
| 10 #include "src/compiler/js-type-feedback.h" | 10 #include "src/compiler/js-type-feedback.h" |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 void AstGraphBuilder::CreateFunctionContext(bool constant_context) { | 422 void AstGraphBuilder::CreateFunctionContext(bool constant_context) { |
| 423 function_context_.set(constant_context | 423 function_context_.set(constant_context |
| 424 ? jsgraph()->HeapConstant(info()->context()) | 424 ? jsgraph()->HeapConstant(info()->context()) |
| 425 : NewOuterContextParam()); | 425 : NewOuterContextParam()); |
| 426 } | 426 } |
| 427 | 427 |
| 428 | 428 |
| 429 Node* AstGraphBuilder::NewOuterContextParam() { | 429 Node* AstGraphBuilder::NewOuterContextParam() { |
| 430 // Parameter (arity + 1) is special for the outer context of the function | 430 // Parameter (arity + 1) is special for the outer context of the function |
| 431 const Operator* op = | 431 const Operator* op = |
| 432 common()->Parameter(info()->num_parameters() + 1, "%context"); | 432 common()->Parameter(info()->num_parameters_including_this(), "%context"); |
| 433 return NewNode(op, graph()->start()); | 433 return NewNode(op, graph()->start()); |
| 434 } | 434 } |
| 435 | 435 |
| 436 | 436 |
| 437 Node* AstGraphBuilder::NewCurrentContextOsrValue() { | 437 Node* AstGraphBuilder::NewCurrentContextOsrValue() { |
| 438 // TODO(titzer): use a real OSR value here; a parameter works by accident. | 438 // TODO(titzer): use a real OSR value here; a parameter works by accident. |
| 439 // Parameter (arity + 1) is special for the outer context of the function | 439 // Parameter (arity + 1) is special for the outer context of the function |
| 440 const Operator* op = | 440 const Operator* op = common()->Parameter( |
| 441 common()->Parameter(info()->num_parameters() + 1, "%osr-context"); | 441 info()->num_parameters_including_this(), "%osr-context"); |
| 442 return NewNode(op, graph()->start()); | 442 return NewNode(op, graph()->start()); |
| 443 } | 443 } |
| 444 | 444 |
| 445 | 445 |
| 446 bool AstGraphBuilder::CreateGraph(bool constant_context, bool stack_check) { | 446 bool AstGraphBuilder::CreateGraph(bool constant_context, bool stack_check) { |
| 447 Scope* scope = info()->scope(); | 447 Scope* scope = info()->scope(); |
| 448 DCHECK(graph() != NULL); | 448 DCHECK(graph() != NULL); |
| 449 | 449 |
| 450 // Set up the basic structure of the graph. | 450 // Set up the basic structure of the graph. |
| 451 int parameter_count = info()->num_parameters(); | 451 int parameter_count = info()->num_parameters(); |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 608 values_(builder_->local_zone()), | 608 values_(builder_->local_zone()), |
| 609 contexts_(builder_->local_zone()), | 609 contexts_(builder_->local_zone()), |
| 610 control_dependency_(control_dependency), | 610 control_dependency_(control_dependency), |
| 611 effect_dependency_(control_dependency), | 611 effect_dependency_(control_dependency), |
| 612 parameters_node_(nullptr), | 612 parameters_node_(nullptr), |
| 613 locals_node_(nullptr), | 613 locals_node_(nullptr), |
| 614 stack_node_(nullptr) { | 614 stack_node_(nullptr) { |
| 615 DCHECK_EQ(scope->num_parameters() + 1, parameters_count()); | 615 DCHECK_EQ(scope->num_parameters() + 1, parameters_count()); |
| 616 | 616 |
| 617 // Bind the receiver variable. | 617 // Bind the receiver variable. |
| 618 Node* receiver = builder->graph()->NewNode(common()->Parameter(0, "%this"), | 618 int param_num = 0; |
| 619 builder->graph()->start()); | 619 if (builder->info()->is_this_defined()) { |
| 620 values()->push_back(receiver); | 620 Node* receiver = builder->graph()->NewNode( |
| 621 common()->Parameter(param_num++, "%this"), builder->graph()->start()); |
| 622 values()->push_back(receiver); |
| 623 } else { |
| 624 values()->push_back(builder->jsgraph()->UndefinedConstant()); |
| 625 } |
| 621 | 626 |
| 622 // Bind all parameter variables. The parameter indices are shifted by 1 | 627 // Bind all parameter variables. The parameter indices are shifted by 1 |
| 623 // (receiver is parameter index -1 but environment index 0). | 628 // (receiver is parameter index -1 but environment index 0). |
| 624 for (int i = 0; i < scope->num_parameters(); ++i) { | 629 for (int i = 0; i < scope->num_parameters(); ++i) { |
| 625 const char* debug_name = GetDebugParameterName(graph()->zone(), scope, i); | 630 const char* debug_name = GetDebugParameterName(graph()->zone(), scope, i); |
| 626 Node* parameter = builder->graph()->NewNode( | 631 Node* parameter = |
| 627 common()->Parameter(i + 1, debug_name), builder->graph()->start()); | 632 builder->graph()->NewNode(common()->Parameter(param_num++, debug_name), |
| 633 builder->graph()->start()); |
| 628 values()->push_back(parameter); | 634 values()->push_back(parameter); |
| 629 } | 635 } |
| 630 | 636 |
| 631 // Bind all local variables to undefined. | 637 // Bind all local variables to undefined. |
| 632 Node* undefined_constant = builder->jsgraph()->UndefinedConstant(); | 638 Node* undefined_constant = builder->jsgraph()->UndefinedConstant(); |
| 633 values()->insert(values()->end(), locals_count(), undefined_constant); | 639 values()->insert(values()->end(), locals_count(), undefined_constant); |
| 634 } | 640 } |
| 635 | 641 |
| 636 | 642 |
| 637 AstGraphBuilder::Environment::Environment(AstGraphBuilder::Environment* copy) | 643 AstGraphBuilder::Environment::Environment(AstGraphBuilder::Environment* copy) |
| (...skipping 2930 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3568 // Phi does not exist yet, introduce one. | 3574 // Phi does not exist yet, introduce one. |
| 3569 value = NewPhi(inputs, value, control); | 3575 value = NewPhi(inputs, value, control); |
| 3570 value->ReplaceInput(inputs - 1, other); | 3576 value->ReplaceInput(inputs - 1, other); |
| 3571 } | 3577 } |
| 3572 return value; | 3578 return value; |
| 3573 } | 3579 } |
| 3574 | 3580 |
| 3575 } // namespace compiler | 3581 } // namespace compiler |
| 3576 } // namespace internal | 3582 } // namespace internal |
| 3577 } // namespace v8 | 3583 } // namespace v8 |
| OLD | NEW |