| 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 #ifndef V8_AST_SCOPES_H_ | 5 #ifndef V8_AST_SCOPES_H_ |
| 6 #define V8_AST_SCOPES_H_ | 6 #define V8_AST_SCOPES_H_ |
| 7 | 7 |
| 8 #include "src/base/compiler-specific.h" | 8 #include "src/base/compiler-specific.h" |
| 9 #include "src/base/hashmap.h" | 9 #include "src/base/hashmap.h" |
| 10 #include "src/globals.h" | 10 #include "src/globals.h" |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 // from the current outer_scope_'s inner scope list). | 145 // from the current outer_scope_'s inner scope list). |
| 146 // Assumes outer_scope_ is non-null. | 146 // Assumes outer_scope_ is non-null. |
| 147 void ReplaceOuterScope(Scope* outer_scope); | 147 void ReplaceOuterScope(Scope* outer_scope); |
| 148 | 148 |
| 149 // Propagates any eagerly-gathered scope usage flags (such as calls_eval()) | 149 // Propagates any eagerly-gathered scope usage flags (such as calls_eval()) |
| 150 // to the passed-in scope. | 150 // to the passed-in scope. |
| 151 void PropagateUsageFlagsToScope(Scope* other); | 151 void PropagateUsageFlagsToScope(Scope* other); |
| 152 | 152 |
| 153 Zone* zone() const { return zone_; } | 153 Zone* zone() const { return zone_; } |
| 154 | 154 |
| 155 // --------------------------------------------------------------------------- | 155 // ------------------/--------------------------------------------------------
- |
| 156 // Declarations | 156 // Declarations |
| 157 | 157 |
| 158 // Lookup a variable in this scope. Returns the variable or NULL if not found. | 158 // Lookup a variable in this scope. Returns the variable or NULL if not found. |
| 159 Variable* LookupLocal(const AstRawString* name) { | 159 Variable* LookupLocal(const AstRawString* name) { |
| 160 Variable* result = variables_.Lookup(name); | 160 Variable* result = variables_.Lookup(name); |
| 161 if (result != nullptr || scope_info_.is_null()) return result; | 161 if (result != nullptr || scope_info_.is_null()) return result; |
| 162 return LookupInScopeInfo(name); | 162 return LookupInScopeInfo(name); |
| 163 } | 163 } |
| 164 | 164 |
| 165 Variable* LookupInScopeInfo(const AstRawString* name); | 165 Variable* LookupInScopeInfo(const AstRawString* name); |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 // During formal parameter list parsing the scope only contains | 421 // During formal parameter list parsing the scope only contains |
| 422 // two variables inserted at initialization: "this" and "arguments". | 422 // two variables inserted at initialization: "this" and "arguments". |
| 423 // "this" is an invalid parameter name and "arguments" is invalid parameter | 423 // "this" is an invalid parameter name and "arguments" is invalid parameter |
| 424 // name in strict mode. Therefore looking up with the map which includes | 424 // name in strict mode. Therefore looking up with the map which includes |
| 425 // "this" and "arguments" in addition to all formal parameters is safe. | 425 // "this" and "arguments" in addition to all formal parameters is safe. |
| 426 return variables_.Lookup(name) != NULL; | 426 return variables_.Lookup(name) != NULL; |
| 427 } | 427 } |
| 428 | 428 |
| 429 int num_var() const { return variables_.occupancy(); } | 429 int num_var() const { return variables_.occupancy(); } |
| 430 | 430 |
| 431 bool HasLazilyParsedInnerFunctionScope() const; |
| 432 |
| 431 // --------------------------------------------------------------------------- | 433 // --------------------------------------------------------------------------- |
| 432 // Debugging. | 434 // Debugging. |
| 433 | 435 |
| 434 #ifdef DEBUG | 436 #ifdef DEBUG |
| 435 void Print(int n = 0); // n = indentation; n < 0 => don't print recursively | 437 void Print(int n = 0); // n = indentation; n < 0 => don't print recursively |
| 436 | 438 |
| 437 // Check that the scope has positions assigned. | 439 // Check that the scope has positions assigned. |
| 438 void CheckScopePositions(); | 440 void CheckScopePositions(); |
| 439 | 441 |
| 440 // Check that all Scopes in the scope tree use the same Zone. | 442 // Check that all Scopes in the scope tree use the same Zone. |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 672 // Declare the function variable for a function literal. This variable | 674 // Declare the function variable for a function literal. This variable |
| 673 // is in an intermediate scope between this function scope and the the | 675 // is in an intermediate scope between this function scope and the the |
| 674 // outer scope. Only possible for function scopes; at most one variable. | 676 // outer scope. Only possible for function scopes; at most one variable. |
| 675 // | 677 // |
| 676 // This function needs to be called after all other variables have been | 678 // This function needs to be called after all other variables have been |
| 677 // declared in the scope. It will add a variable for {name} to {variables_}; | 679 // declared in the scope. It will add a variable for {name} to {variables_}; |
| 678 // either the function variable itself, or a non-local in case the function | 680 // either the function variable itself, or a non-local in case the function |
| 679 // calls sloppy eval. | 681 // calls sloppy eval. |
| 680 Variable* DeclareFunctionVar(const AstRawString* name); | 682 Variable* DeclareFunctionVar(const AstRawString* name); |
| 681 | 683 |
| 684 // Declare some special internal variables which must be accessible to |
| 685 // Ignition without ScopeInfo. |
| 686 Variable* DeclareGeneratorObjectVar(const AstRawString* name); |
| 687 Variable* DeclarePromiseVar(const AstRawString* name); |
| 688 |
| 682 // Declare a parameter in this scope. When there are duplicated | 689 // Declare a parameter in this scope. When there are duplicated |
| 683 // parameters the rightmost one 'wins'. However, the implementation | 690 // parameters the rightmost one 'wins'. However, the implementation |
| 684 // expects all parameters to be declared and from left to right. | 691 // expects all parameters to be declared and from left to right. |
| 685 Variable* DeclareParameter(const AstRawString* name, VariableMode mode, | 692 Variable* DeclareParameter(const AstRawString* name, VariableMode mode, |
| 686 bool is_optional, bool is_rest, bool* is_duplicate, | 693 bool is_optional, bool is_rest, bool* is_duplicate, |
| 687 AstValueFactory* ast_value_factory); | 694 AstValueFactory* ast_value_factory); |
| 688 | 695 |
| 689 // Declare an implicit global variable in this scope which must be a | 696 // Declare an implicit global variable in this scope which must be a |
| 690 // script scope. The variable was introduced (possibly from an inner | 697 // script scope. The variable was introduced (possibly from an inner |
| 691 // scope) by a reference to an unresolved variable with no intervening | 698 // scope) by a reference to an unresolved variable with no intervening |
| (...skipping 18 matching lines...) Expand all Loading... |
| 710 // The variable corresponding to the 'new.target' value. | 717 // The variable corresponding to the 'new.target' value. |
| 711 Variable* new_target_var() { return new_target_; } | 718 Variable* new_target_var() { return new_target_; } |
| 712 | 719 |
| 713 // The variable holding the function literal for named function | 720 // The variable holding the function literal for named function |
| 714 // literals, or NULL. Only valid for function scopes. | 721 // literals, or NULL. Only valid for function scopes. |
| 715 Variable* function_var() const { | 722 Variable* function_var() const { |
| 716 DCHECK(is_function_scope()); | 723 DCHECK(is_function_scope()); |
| 717 return function_; | 724 return function_; |
| 718 } | 725 } |
| 719 | 726 |
| 727 Variable* generator_object_var() const { |
| 728 DCHECK(is_function_scope() || is_module_scope()); |
| 729 return generator_object_; |
| 730 } |
| 731 |
| 732 Variable* promise_var() const { |
| 733 DCHECK(is_function_scope()); |
| 734 DCHECK(IsAsyncFunction(function_kind_)); |
| 735 return promise_; |
| 736 } |
| 737 |
| 720 // Parameters. The left-most parameter has index 0. | 738 // Parameters. The left-most parameter has index 0. |
| 721 // Only valid for function and module scopes. | 739 // Only valid for function and module scopes. |
| 722 Variable* parameter(int index) const { | 740 Variable* parameter(int index) const { |
| 723 DCHECK(is_function_scope() || is_module_scope()); | 741 DCHECK(is_function_scope() || is_module_scope()); |
| 724 return params_[index]; | 742 return params_[index]; |
| 725 } | 743 } |
| 726 | 744 |
| 727 // Returns the number of formal parameters, excluding a possible rest | 745 // Returns the number of formal parameters, excluding a possible rest |
| 728 // parameter. Examples: | 746 // parameter. Examples: |
| 729 // function foo(a, b) {} ==> 2 | 747 // function foo(a, b) {} ==> 2 |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 866 // Convenience variable. | 884 // Convenience variable. |
| 867 Variable* receiver_; | 885 Variable* receiver_; |
| 868 // Function variable, if any; function scopes only. | 886 // Function variable, if any; function scopes only. |
| 869 Variable* function_; | 887 Variable* function_; |
| 870 // new.target variable, function scopes only. | 888 // new.target variable, function scopes only. |
| 871 Variable* new_target_; | 889 Variable* new_target_; |
| 872 // Convenience variable; function scopes only. | 890 // Convenience variable; function scopes only. |
| 873 Variable* arguments_; | 891 Variable* arguments_; |
| 874 // Convenience variable; Subclass constructor only | 892 // Convenience variable; Subclass constructor only |
| 875 Variable* this_function_; | 893 Variable* this_function_; |
| 894 |
| 895 // Generator object, if any; generator function scopes and module scopes only. |
| 896 Variable* generator_object_; |
| 897 // Promise, if any; async function scopes only. |
| 898 Variable* promise_; |
| 876 }; | 899 }; |
| 877 | 900 |
| 878 class ModuleScope final : public DeclarationScope { | 901 class ModuleScope final : public DeclarationScope { |
| 879 public: | 902 public: |
| 880 ModuleScope(DeclarationScope* script_scope, | 903 ModuleScope(DeclarationScope* script_scope, |
| 881 AstValueFactory* ast_value_factory); | 904 AstValueFactory* ast_value_factory); |
| 882 | 905 |
| 883 // Deserialization. | 906 // Deserialization. |
| 884 // The generated ModuleDescriptor does not preserve all information. In | 907 // The generated ModuleDescriptor does not preserve all information. In |
| 885 // particular, its module_requests map will be empty because we no longer need | 908 // particular, its module_requests map will be empty because we no longer need |
| (...skipping 11 matching lines...) Expand all Loading... |
| 897 void AllocateModuleVariables(); | 920 void AllocateModuleVariables(); |
| 898 | 921 |
| 899 private: | 922 private: |
| 900 ModuleDescriptor* module_descriptor_; | 923 ModuleDescriptor* module_descriptor_; |
| 901 }; | 924 }; |
| 902 | 925 |
| 903 } // namespace internal | 926 } // namespace internal |
| 904 } // namespace v8 | 927 } // namespace v8 |
| 905 | 928 |
| 906 #endif // V8_AST_SCOPES_H_ | 929 #endif // V8_AST_SCOPES_H_ |
| OLD | NEW |