| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/ast/scopes.h" | 5 #include "src/ast/scopes.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 asm_module_ = false; | 198 asm_module_ = false; |
| 199 asm_function_ = false; | 199 asm_function_ = false; |
| 200 force_eager_compilation_ = false; | 200 force_eager_compilation_ = false; |
| 201 has_arguments_parameter_ = false; | 201 has_arguments_parameter_ = false; |
| 202 receiver_ = nullptr; | 202 receiver_ = nullptr; |
| 203 new_target_ = nullptr; | 203 new_target_ = nullptr; |
| 204 function_ = nullptr; | 204 function_ = nullptr; |
| 205 arguments_ = nullptr; | 205 arguments_ = nullptr; |
| 206 this_function_ = nullptr; | 206 this_function_ = nullptr; |
| 207 arity_ = 0; | 207 arity_ = 0; |
| 208 rest_parameter_ = nullptr; | |
| 209 rest_index_ = -1; | 208 rest_index_ = -1; |
| 210 } | 209 } |
| 211 | 210 |
| 212 void Scope::SetDefaults() { | 211 void Scope::SetDefaults() { |
| 213 #ifdef DEBUG | 212 #ifdef DEBUG |
| 214 scope_name_ = nullptr; | 213 scope_name_ = nullptr; |
| 215 already_resolved_ = false; | 214 already_resolved_ = false; |
| 216 #endif | 215 #endif |
| 217 inner_scope_ = nullptr; | 216 inner_scope_ = nullptr; |
| 218 sibling_ = nullptr; | 217 sibling_ = nullptr; |
| (...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 688 var = NewTemporary(name); | 687 var = NewTemporary(name); |
| 689 } else { | 688 } else { |
| 690 var = Declare(zone(), this, name, mode, Variable::NORMAL, | 689 var = Declare(zone(), this, name, mode, Variable::NORMAL, |
| 691 kCreatedInitialized); | 690 kCreatedInitialized); |
| 692 // TODO(wingo): Avoid O(n^2) check. | 691 // TODO(wingo): Avoid O(n^2) check. |
| 693 *is_duplicate = IsDeclaredParameter(name); | 692 *is_duplicate = IsDeclaredParameter(name); |
| 694 } | 693 } |
| 695 if (!is_optional && !is_rest && arity_ == params_.length()) { | 694 if (!is_optional && !is_rest && arity_ == params_.length()) { |
| 696 ++arity_; | 695 ++arity_; |
| 697 } | 696 } |
| 698 if (is_rest) { | 697 if (is_rest) rest_index_ = num_parameters(); |
| 699 DCHECK_NULL(rest_parameter_); | |
| 700 rest_parameter_ = var; | |
| 701 rest_index_ = num_parameters(); | |
| 702 } | |
| 703 params_.Add(var, zone()); | 698 params_.Add(var, zone()); |
| 704 if (name == ast_value_factory->arguments_string()) { | 699 if (name == ast_value_factory->arguments_string()) { |
| 705 has_arguments_parameter_ = true; | 700 has_arguments_parameter_ = true; |
| 706 } | 701 } |
| 707 return var; | 702 return var; |
| 708 } | 703 } |
| 709 | 704 |
| 710 Variable* Scope::DeclareLocal(const AstRawString* name, VariableMode mode, | 705 Variable* Scope::DeclareLocal(const AstRawString* name, VariableMode mode, |
| 711 InitializationFlag init_flag, Variable::Kind kind, | 706 InitializationFlag init_flag, Variable::Kind kind, |
| 712 MaybeAssignedFlag maybe_assigned_flag) { | 707 MaybeAssignedFlag maybe_assigned_flag) { |
| (...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1537 } else { | 1532 } else { |
| 1538 // 'arguments' is unused. Tell the code generator that it does not need to | 1533 // 'arguments' is unused. Tell the code generator that it does not need to |
| 1539 // allocate the arguments object by nulling out arguments_. | 1534 // allocate the arguments object by nulling out arguments_. |
| 1540 arguments_ = nullptr; | 1535 arguments_ = nullptr; |
| 1541 } | 1536 } |
| 1542 | 1537 |
| 1543 } else { | 1538 } else { |
| 1544 DCHECK(is_arrow_scope()); | 1539 DCHECK(is_arrow_scope()); |
| 1545 } | 1540 } |
| 1546 | 1541 |
| 1547 if (rest_parameter_ && !MustAllocate(rest_parameter_)) { | |
| 1548 rest_parameter_ = nullptr; | |
| 1549 } | |
| 1550 | |
| 1551 // The same parameter may occur multiple times in the parameters_ list. | 1542 // The same parameter may occur multiple times in the parameters_ list. |
| 1552 // If it does, and if it is not copied into the context object, it must | 1543 // If it does, and if it is not copied into the context object, it must |
| 1553 // receive the highest parameter index for that parameter; thus iteration | 1544 // receive the highest parameter index for that parameter; thus iteration |
| 1554 // order is relevant! | 1545 // order is relevant! |
| 1555 for (int i = params_.length() - 1; i >= 0; --i) { | 1546 for (int i = params_.length() - 1; i >= 0; --i) { |
| 1547 if (i == rest_index_) continue; |
| 1556 Variable* var = params_[i]; | 1548 Variable* var = params_[i]; |
| 1557 if (var == rest_parameter_) continue; | |
| 1558 | 1549 |
| 1559 DCHECK(var->scope() == this); | 1550 DCHECK(var->scope() == this); |
| 1560 if (uses_sloppy_arguments) { | 1551 if (uses_sloppy_arguments) { |
| 1561 var->ForceContextAllocation(); | 1552 var->ForceContextAllocation(); |
| 1562 } | 1553 } |
| 1563 AllocateParameter(var, i); | 1554 AllocateParameter(var, i); |
| 1564 } | 1555 } |
| 1565 } | 1556 } |
| 1566 | 1557 |
| 1567 void DeclarationScope::AllocateParameter(Variable* var, int index) { | 1558 void DeclarationScope::AllocateParameter(Variable* var, int index) { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1641 | 1632 |
| 1642 void DeclarationScope::AllocateLocals() { | 1633 void DeclarationScope::AllocateLocals() { |
| 1643 // For now, function_ must be allocated at the very end. If it gets | 1634 // For now, function_ must be allocated at the very end. If it gets |
| 1644 // allocated in the context, it must be the last slot in the context, | 1635 // allocated in the context, it must be the last slot in the context, |
| 1645 // because of the current ScopeInfo implementation (see | 1636 // because of the current ScopeInfo implementation (see |
| 1646 // ScopeInfo::ScopeInfo(FunctionScope* scope) constructor). | 1637 // ScopeInfo::ScopeInfo(FunctionScope* scope) constructor). |
| 1647 if (function_ != nullptr) { | 1638 if (function_ != nullptr) { |
| 1648 AllocateNonParameterLocal(function_); | 1639 AllocateNonParameterLocal(function_); |
| 1649 } | 1640 } |
| 1650 | 1641 |
| 1651 DCHECK(rest_parameter_ == nullptr || !rest_parameter_->IsUnallocated()); | 1642 DCHECK(!has_rest_parameter() || !MustAllocate(params_[rest_index_]) || |
| 1643 !params_[rest_index_]->IsUnallocated()); |
| 1652 | 1644 |
| 1653 if (new_target_ != nullptr && !MustAllocate(new_target_)) { | 1645 if (new_target_ != nullptr && !MustAllocate(new_target_)) { |
| 1654 new_target_ = nullptr; | 1646 new_target_ = nullptr; |
| 1655 } | 1647 } |
| 1656 | 1648 |
| 1657 if (this_function_ != nullptr && !MustAllocate(this_function_)) { | 1649 if (this_function_ != nullptr && !MustAllocate(this_function_)) { |
| 1658 this_function_ = nullptr; | 1650 this_function_ = nullptr; |
| 1659 } | 1651 } |
| 1660 } | 1652 } |
| 1661 | 1653 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1734 function != nullptr && function->IsContextSlot(); | 1726 function != nullptr && function->IsContextSlot(); |
| 1735 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - | 1727 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - |
| 1736 (is_function_var_in_context ? 1 : 0); | 1728 (is_function_var_in_context ? 1 : 0); |
| 1737 } | 1729 } |
| 1738 | 1730 |
| 1739 | 1731 |
| 1740 int Scope::ContextGlobalCount() const { return num_global_slots(); } | 1732 int Scope::ContextGlobalCount() const { return num_global_slots(); } |
| 1741 | 1733 |
| 1742 } // namespace internal | 1734 } // namespace internal |
| 1743 } // namespace v8 | 1735 } // namespace v8 |
| OLD | NEW |