| 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/ast/ast.h" | 8 #include "src/ast/ast.h" |
| 9 #include "src/base/hashmap.h" | 9 #include "src/base/hashmap.h" |
| 10 #include "src/globals.h" | 10 #include "src/globals.h" |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 // the scope for which a function prologue allocates a context) or declaring | 407 // the scope for which a function prologue allocates a context) or declaring |
| 408 // temporaries. | 408 // temporaries. |
| 409 DeclarationScope* GetClosureScope(); | 409 DeclarationScope* GetClosureScope(); |
| 410 | 410 |
| 411 // Find the first (non-arrow) function or script scope. This is where | 411 // Find the first (non-arrow) function or script scope. This is where |
| 412 // 'this' is bound, and what determines the function kind. | 412 // 'this' is bound, and what determines the function kind. |
| 413 DeclarationScope* GetReceiverScope(); | 413 DeclarationScope* GetReceiverScope(); |
| 414 | 414 |
| 415 Handle<ScopeInfo> GetScopeInfo(Isolate* isolate); | 415 Handle<ScopeInfo> GetScopeInfo(Isolate* isolate); |
| 416 | 416 |
| 417 Handle<StringSet> CollectNonLocals(Handle<StringSet> non_locals); | |
| 418 | |
| 419 // --------------------------------------------------------------------------- | 417 // --------------------------------------------------------------------------- |
| 420 // Strict mode support. | 418 // Strict mode support. |
| 421 bool IsDeclared(const AstRawString* name) { | 419 bool IsDeclared(const AstRawString* name) { |
| 422 // During formal parameter list parsing the scope only contains | 420 // During formal parameter list parsing the scope only contains |
| 423 // two variables inserted at initialization: "this" and "arguments". | 421 // two variables inserted at initialization: "this" and "arguments". |
| 424 // "this" is an invalid parameter name and "arguments" is invalid parameter | 422 // "this" is an invalid parameter name and "arguments" is invalid parameter |
| 425 // name in strict mode. Therefore looking up with the map which includes | 423 // name in strict mode. Therefore looking up with the map which includes |
| 426 // "this" and "arguments" in addition to all formal parameters is safe. | 424 // "this" and "arguments" in addition to all formal parameters is safe. |
| 427 return variables_.Lookup(name) != NULL; | 425 return variables_.Lookup(name) != NULL; |
| 428 } | 426 } |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 572 DYNAMIC_LOOKUP | 570 DYNAMIC_LOOKUP |
| 573 }; | 571 }; |
| 574 | 572 |
| 575 // Lookup a variable reference given by name recursively starting with this | 573 // Lookup a variable reference given by name recursively starting with this |
| 576 // scope, but only until max_outer_scope (if not nullptr). If the code is | 574 // scope, but only until max_outer_scope (if not nullptr). If the code is |
| 577 // executed because of a call to 'eval', the context parameter should be set | 575 // executed because of a call to 'eval', the context parameter should be set |
| 578 // to the calling context of 'eval'. | 576 // to the calling context of 'eval'. |
| 579 Variable* LookupRecursive(VariableProxy* proxy, BindingKind* binding_kind, | 577 Variable* LookupRecursive(VariableProxy* proxy, BindingKind* binding_kind, |
| 580 AstNodeFactory* factory, | 578 AstNodeFactory* factory, |
| 581 Scope* max_outer_scope = nullptr); | 579 Scope* max_outer_scope = nullptr); |
| 580 void ResolveTo(ParseInfo* info, BindingKind binding_kind, |
| 581 VariableProxy* proxy, Variable* var); |
| 582 void ResolveVariable(ParseInfo* info, VariableProxy* proxy, | 582 void ResolveVariable(ParseInfo* info, VariableProxy* proxy, |
| 583 AstNodeFactory* factory); | 583 AstNodeFactory* factory); |
| 584 void ResolveVariablesRecursively(ParseInfo* info, AstNodeFactory* factory); | 584 void ResolveVariablesRecursively(ParseInfo* info, AstNodeFactory* factory); |
| 585 | 585 |
| 586 // Tries to resolve local variables inside max_outer_scope; migrates those | 586 // Finds free variables of this scope. This mutates the unresolved variables |
| 587 // which cannot be resolved into migrate_to. | 587 // list along the way, so full resolution cannot be done afterwards. |
| 588 void MigrateUnresolvableLocals(DeclarationScope* migrate_to, | 588 // If a ParseInfo* is passed, non-free variables will be resolved. |
| 589 AstNodeFactory* ast_node_factory, | 589 VariableProxy* FetchFreeVariables(DeclarationScope* max_outer_scope, |
| 590 DeclarationScope* max_outer_scope); | 590 ParseInfo* info = nullptr, |
| 591 VariableProxy* stack = nullptr); |
| 591 | 592 |
| 592 // Scope analysis. | 593 // Scope analysis. |
| 593 void PropagateScopeInfo(bool outer_scope_calls_sloppy_eval); | 594 void PropagateScopeInfo(bool outer_scope_calls_sloppy_eval); |
| 594 bool HasTrivialContext() const; | 595 bool HasTrivialContext() const; |
| 595 | 596 |
| 596 // Predicates. | 597 // Predicates. |
| 597 bool MustAllocate(Variable* var); | 598 bool MustAllocate(Variable* var); |
| 598 bool MustAllocateInContext(Variable* var); | 599 bool MustAllocateInContext(Variable* var); |
| 599 | 600 |
| 600 // Variable allocation. | 601 // Variable allocation. |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 842 void AllocateVariables(ParseInfo* info, AstNodeFactory* factory); | 843 void AllocateVariables(ParseInfo* info, AstNodeFactory* factory); |
| 843 | 844 |
| 844 // To be called during parsing. Do just enough scope analysis that we can | 845 // To be called during parsing. Do just enough scope analysis that we can |
| 845 // discard the Scope for lazily compiled functions. In particular, this | 846 // discard the Scope for lazily compiled functions. In particular, this |
| 846 // records variables which cannot be resolved inside the Scope (we don't yet | 847 // records variables which cannot be resolved inside the Scope (we don't yet |
| 847 // know what they will resolve to since the outer Scopes are incomplete) and | 848 // know what they will resolve to since the outer Scopes are incomplete) and |
| 848 // migrates them into migrate_to. | 849 // migrates them into migrate_to. |
| 849 void AnalyzePartially(DeclarationScope* migrate_to, | 850 void AnalyzePartially(DeclarationScope* migrate_to, |
| 850 AstNodeFactory* ast_node_factory); | 851 AstNodeFactory* ast_node_factory); |
| 851 | 852 |
| 853 Handle<StringSet> CollectNonLocals(ParseInfo* info, |
| 854 Handle<StringSet> non_locals); |
| 855 |
| 852 #ifdef DEBUG | 856 #ifdef DEBUG |
| 853 void PrintParameters(); | 857 void PrintParameters(); |
| 854 #endif | 858 #endif |
| 855 | 859 |
| 856 void AllocateLocals(AstValueFactory* ast_value_factory); | 860 void AllocateLocals(AstValueFactory* ast_value_factory); |
| 857 void AllocateParameterLocals(); | 861 void AllocateParameterLocals(); |
| 858 void AllocateReceiver(); | 862 void AllocateReceiver(); |
| 859 // Set MODULE as VariableLocation for all variables that will live in some | 863 // Set MODULE as VariableLocation for all variables that will live in some |
| 860 // module's export table. | 864 // module's export table. |
| 861 void AllocateModuleVariables(); | 865 void AllocateModuleVariables(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 // Convenience variable; Subclass constructor only | 897 // Convenience variable; Subclass constructor only |
| 894 Variable* this_function_; | 898 Variable* this_function_; |
| 895 // Module descriptor; module scopes only. | 899 // Module descriptor; module scopes only. |
| 896 ModuleDescriptor* module_descriptor_; | 900 ModuleDescriptor* module_descriptor_; |
| 897 }; | 901 }; |
| 898 | 902 |
| 899 } // namespace internal | 903 } // namespace internal |
| 900 } // namespace v8 | 904 } // namespace v8 |
| 901 | 905 |
| 902 #endif // V8_AST_SCOPES_H_ | 906 #endif // V8_AST_SCOPES_H_ |
| OLD | NEW |