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 16 matching lines...) Expand all Loading... |
27 class VariableMap: public ZoneHashMap { | 27 class VariableMap: public ZoneHashMap { |
28 public: | 28 public: |
29 explicit VariableMap(Zone* zone); | 29 explicit VariableMap(Zone* zone); |
30 | 30 |
31 Variable* Declare(Zone* zone, Scope* scope, const AstRawString* name, | 31 Variable* Declare(Zone* zone, Scope* scope, const AstRawString* name, |
32 VariableMode mode, VariableKind kind, | 32 VariableMode mode, VariableKind kind, |
33 InitializationFlag initialization_flag, | 33 InitializationFlag initialization_flag, |
34 MaybeAssignedFlag maybe_assigned_flag = kNotAssigned, | 34 MaybeAssignedFlag maybe_assigned_flag = kNotAssigned, |
35 bool* added = nullptr); | 35 bool* added = nullptr); |
36 | 36 |
| 37 // Records that "name" exists but doesn't create a Variable. Useful for |
| 38 // preparsing. |
| 39 void DeclareName(Zone* zone, const AstRawString* name); |
| 40 |
37 Variable* Lookup(const AstRawString* name); | 41 Variable* Lookup(const AstRawString* name); |
38 void Remove(Variable* var); | 42 void Remove(Variable* var); |
39 void Add(Zone* zone, Variable* var); | 43 void Add(Zone* zone, Variable* var); |
40 }; | 44 }; |
41 | 45 |
42 | 46 |
43 // Sloppy block-scoped function declarations to var-bind | 47 // Sloppy block-scoped function declarations to var-bind |
44 class SloppyBlockFunctionMap : public ZoneHashMap { | 48 class SloppyBlockFunctionMap : public ZoneHashMap { |
45 public: | 49 public: |
46 explicit SloppyBlockFunctionMap(Zone* zone); | 50 explicit SloppyBlockFunctionMap(Zone* zone); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 Variable* DeclareLocal(const AstRawString* name, VariableMode mode, | 154 Variable* DeclareLocal(const AstRawString* name, VariableMode mode, |
151 InitializationFlag init_flag, VariableKind kind, | 155 InitializationFlag init_flag, VariableKind kind, |
152 MaybeAssignedFlag maybe_assigned_flag = kNotAssigned); | 156 MaybeAssignedFlag maybe_assigned_flag = kNotAssigned); |
153 | 157 |
154 Variable* DeclareVariable(Declaration* declaration, VariableMode mode, | 158 Variable* DeclareVariable(Declaration* declaration, VariableMode mode, |
155 InitializationFlag init, | 159 InitializationFlag init, |
156 bool allow_harmony_restrictive_generators, | 160 bool allow_harmony_restrictive_generators, |
157 bool* sloppy_mode_block_scope_function_redefinition, | 161 bool* sloppy_mode_block_scope_function_redefinition, |
158 bool* ok); | 162 bool* ok); |
159 | 163 |
| 164 void DeclareVariableName(const AstRawString* name, VariableMode mode); |
| 165 |
160 // Declarations list. | 166 // Declarations list. |
161 ThreadedList<Declaration>* declarations() { return &decls_; } | 167 ThreadedList<Declaration>* declarations() { return &decls_; } |
162 | 168 |
163 ThreadedList<Variable>* locals() { return &locals_; } | 169 ThreadedList<Variable>* locals() { return &locals_; } |
164 | 170 |
165 // Create a new unresolved variable. | 171 // Create a new unresolved variable. |
166 VariableProxy* NewUnresolved(AstNodeFactory* factory, | 172 VariableProxy* NewUnresolved(AstNodeFactory* factory, |
167 const AstRawString* name, | 173 const AstRawString* name, |
168 int start_position = kNoSourcePosition, | 174 int start_position = kNoSourcePosition, |
169 VariableKind kind = NORMAL_VARIABLE); | 175 VariableKind kind = NORMAL_VARIABLE); |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 // to the calling context of 'eval'. | 525 // to the calling context of 'eval'. |
520 Variable* LookupRecursive(VariableProxy* proxy, Scope* outer_scope_end); | 526 Variable* LookupRecursive(VariableProxy* proxy, Scope* outer_scope_end); |
521 void ResolveTo(ParseInfo* info, VariableProxy* proxy, Variable* var); | 527 void ResolveTo(ParseInfo* info, VariableProxy* proxy, Variable* var); |
522 void ResolveVariable(ParseInfo* info, VariableProxy* proxy); | 528 void ResolveVariable(ParseInfo* info, VariableProxy* proxy); |
523 void ResolveVariablesRecursively(ParseInfo* info); | 529 void ResolveVariablesRecursively(ParseInfo* info); |
524 | 530 |
525 // Finds free variables of this scope. This mutates the unresolved variables | 531 // Finds free variables of this scope. This mutates the unresolved variables |
526 // list along the way, so full resolution cannot be done afterwards. | 532 // list along the way, so full resolution cannot be done afterwards. |
527 // If a ParseInfo* is passed, non-free variables will be resolved. | 533 // If a ParseInfo* is passed, non-free variables will be resolved. |
528 VariableProxy* FetchFreeVariables(DeclarationScope* max_outer_scope, | 534 VariableProxy* FetchFreeVariables(DeclarationScope* max_outer_scope, |
529 bool try_to_resolve = true, | |
530 ParseInfo* info = nullptr, | 535 ParseInfo* info = nullptr, |
531 VariableProxy* stack = nullptr); | 536 VariableProxy* stack = nullptr); |
532 | 537 |
533 // Predicates. | 538 // Predicates. |
534 bool MustAllocate(Variable* var); | 539 bool MustAllocate(Variable* var); |
535 bool MustAllocateInContext(Variable* var); | 540 bool MustAllocateInContext(Variable* var); |
536 | 541 |
537 // Variable allocation. | 542 // Variable allocation. |
538 void AllocateStackSlot(Variable* var); | 543 void AllocateStackSlot(Variable* var); |
539 void AllocateHeapSlot(Variable* var); | 544 void AllocateHeapSlot(Variable* var); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 if (scope->sibling_ == inner_scope) { | 576 if (scope->sibling_ == inner_scope) { |
572 scope->sibling_ = scope->sibling_->sibling_; | 577 scope->sibling_ = scope->sibling_->sibling_; |
573 return; | 578 return; |
574 } | 579 } |
575 } | 580 } |
576 } | 581 } |
577 | 582 |
578 void SetDefaults(); | 583 void SetDefaults(); |
579 | 584 |
580 friend class DeclarationScope; | 585 friend class DeclarationScope; |
| 586 friend class ScopeTestHelper; |
581 }; | 587 }; |
582 | 588 |
583 class DeclarationScope : public Scope { | 589 class DeclarationScope : public Scope { |
584 public: | 590 public: |
585 DeclarationScope(Zone* zone, Scope* outer_scope, ScopeType scope_type, | 591 DeclarationScope(Zone* zone, Scope* outer_scope, ScopeType scope_type, |
586 FunctionKind function_kind = kNormalFunction); | 592 FunctionKind function_kind = kNormalFunction); |
587 DeclarationScope(Zone* zone, ScopeType scope_type, | 593 DeclarationScope(Zone* zone, ScopeType scope_type, |
588 Handle<ScopeInfo> scope_info); | 594 Handle<ScopeInfo> scope_info); |
589 // Creates a script scope. | 595 // Creates a script scope. |
590 DeclarationScope(Zone* zone, AstValueFactory* ast_value_factory); | 596 DeclarationScope(Zone* zone, AstValueFactory* ast_value_factory); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 // either the function variable itself, or a non-local in case the function | 648 // either the function variable itself, or a non-local in case the function |
643 // calls sloppy eval. | 649 // calls sloppy eval. |
644 Variable* DeclareFunctionVar(const AstRawString* name); | 650 Variable* DeclareFunctionVar(const AstRawString* name); |
645 | 651 |
646 // Declare a parameter in this scope. When there are duplicated | 652 // Declare a parameter in this scope. When there are duplicated |
647 // parameters the rightmost one 'wins'. However, the implementation | 653 // parameters the rightmost one 'wins'. However, the implementation |
648 // expects all parameters to be declared and from left to right. | 654 // expects all parameters to be declared and from left to right. |
649 Variable* DeclareParameter(const AstRawString* name, VariableMode mode, | 655 Variable* DeclareParameter(const AstRawString* name, VariableMode mode, |
650 bool is_optional, bool is_rest, bool* is_duplicate, | 656 bool is_optional, bool is_rest, bool* is_duplicate, |
651 AstValueFactory* ast_value_factory); | 657 AstValueFactory* ast_value_factory); |
| 658 void DeclareParameterName(const AstRawString* name, bool is_optional, |
| 659 bool is_rest, bool* is_duplicate, |
| 660 AstValueFactory* ast_value_factory); |
652 | 661 |
653 // Declare an implicit global variable in this scope which must be a | 662 // Declare an implicit global variable in this scope which must be a |
654 // script scope. The variable was introduced (possibly from an inner | 663 // script scope. The variable was introduced (possibly from an inner |
655 // scope) by a reference to an unresolved variable with no intervening | 664 // scope) by a reference to an unresolved variable with no intervening |
656 // with statements or eval calls. | 665 // with statements or eval calls. |
657 Variable* DeclareDynamicGlobal(const AstRawString* name, | 666 Variable* DeclareDynamicGlobal(const AstRawString* name, |
658 VariableKind variable_kind); | 667 VariableKind variable_kind); |
659 | 668 |
660 // The variable corresponding to the 'this' value. | 669 // The variable corresponding to the 'this' value. |
661 Variable* receiver() { | 670 Variable* receiver() { |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 void AllocateModuleVariables(); | 866 void AllocateModuleVariables(); |
858 | 867 |
859 private: | 868 private: |
860 ModuleDescriptor* module_descriptor_; | 869 ModuleDescriptor* module_descriptor_; |
861 }; | 870 }; |
862 | 871 |
863 } // namespace internal | 872 } // namespace internal |
864 } // namespace v8 | 873 } // namespace v8 |
865 | 874 |
866 #endif // V8_AST_SCOPES_H_ | 875 #endif // V8_AST_SCOPES_H_ |
OLD | NEW |