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/hashmap.h" | 9 #include "src/hashmap.h" |
10 #include "src/pending-compilation-error-handler.h" | 10 #include "src/pending-compilation-error-handler.h" |
11 #include "src/zone.h" | 11 #include "src/zone.h" |
12 | 12 |
13 namespace v8 { | 13 namespace v8 { |
14 namespace internal { | 14 namespace internal { |
15 | 15 |
16 class ParseInfo; | 16 class ParseInfo; |
17 | 17 |
18 // A hash map to support fast variable declaration and lookup. | 18 // A hash map to support fast variable declaration and lookup. |
19 class VariableMap: public ZoneHashMap { | 19 class VariableMap: public ZoneHashMap { |
20 public: | 20 public: |
21 explicit VariableMap(Zone* zone); | 21 explicit VariableMap(Zone* zone); |
22 | 22 |
23 virtual ~VariableMap(); | 23 virtual ~VariableMap(); |
24 | 24 |
25 Variable* Declare(Scope* scope, const AstRawString* name, VariableMode mode, | 25 Variable* Declare(Scope* scope, const AstRawString* name, VariableMode mode, |
26 Variable::Kind kind, InitializationFlag initialization_flag, | 26 Variable::Kind kind, InitializationFlag initialization_flag, |
27 MaybeAssignedFlag maybe_assigned_flag = kNotAssigned, | 27 MaybeAssignedFlag maybe_assigned_flag = kNotAssigned); |
28 int declaration_group_start = -1); | |
29 | 28 |
30 Variable* Lookup(const AstRawString* name); | 29 Variable* Lookup(const AstRawString* name); |
31 | 30 |
32 Zone* zone() const { return zone_; } | 31 Zone* zone() const { return zone_; } |
33 | 32 |
34 private: | 33 private: |
35 Zone* zone_; | 34 Zone* zone_; |
36 }; | 35 }; |
37 | 36 |
38 | 37 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 // parameters the rightmost one 'wins'. However, the implementation | 155 // parameters the rightmost one 'wins'. However, the implementation |
157 // expects all parameters to be declared and from left to right. | 156 // expects all parameters to be declared and from left to right. |
158 Variable* DeclareParameter( | 157 Variable* DeclareParameter( |
159 const AstRawString* name, VariableMode mode, | 158 const AstRawString* name, VariableMode mode, |
160 bool is_optional, bool is_rest, bool* is_duplicate); | 159 bool is_optional, bool is_rest, bool* is_duplicate); |
161 | 160 |
162 // Declare a local variable in this scope. If the variable has been | 161 // Declare a local variable in this scope. If the variable has been |
163 // declared before, the previously declared variable is returned. | 162 // declared before, the previously declared variable is returned. |
164 Variable* DeclareLocal(const AstRawString* name, VariableMode mode, | 163 Variable* DeclareLocal(const AstRawString* name, VariableMode mode, |
165 InitializationFlag init_flag, Variable::Kind kind, | 164 InitializationFlag init_flag, Variable::Kind kind, |
166 MaybeAssignedFlag maybe_assigned_flag = kNotAssigned, | 165 MaybeAssignedFlag maybe_assigned_flag = kNotAssigned); |
167 int declaration_group_start = -1); | |
168 | 166 |
169 // Declare an implicit global variable in this scope which must be a | 167 // Declare an implicit global variable in this scope which must be a |
170 // script scope. The variable was introduced (possibly from an inner | 168 // script scope. The variable was introduced (possibly from an inner |
171 // scope) by a reference to an unresolved variable with no intervening | 169 // scope) by a reference to an unresolved variable with no intervening |
172 // with statements or eval calls. | 170 // with statements or eval calls. |
173 Variable* DeclareDynamicGlobal(const AstRawString* name); | 171 Variable* DeclareDynamicGlobal(const AstRawString* name); |
174 | 172 |
175 // Create a new unresolved variable. | 173 // Create a new unresolved variable. |
176 VariableProxy* NewUnresolved(AstNodeFactory* factory, | 174 VariableProxy* NewUnresolved(AstNodeFactory* factory, |
177 const AstRawString* name, | 175 const AstRawString* name, |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 } | 368 } |
371 | 369 |
372 bool NeedsHomeObject() const { | 370 bool NeedsHomeObject() const { |
373 return scope_uses_super_property_ || | 371 return scope_uses_super_property_ || |
374 ((scope_calls_eval_ || inner_scope_calls_eval_) && | 372 ((scope_calls_eval_ || inner_scope_calls_eval_) && |
375 (IsConciseMethod(function_kind()) || | 373 (IsConciseMethod(function_kind()) || |
376 IsAccessorFunction(function_kind()) || | 374 IsAccessorFunction(function_kind()) || |
377 IsClassConstructor(function_kind()))); | 375 IsClassConstructor(function_kind()))); |
378 } | 376 } |
379 | 377 |
380 const Scope* NearestOuterEvalScope() const { | |
381 if (is_eval_scope()) return this; | |
382 if (outer_scope() == nullptr) return nullptr; | |
383 return outer_scope()->NearestOuterEvalScope(); | |
384 } | |
385 | |
386 // --------------------------------------------------------------------------- | 378 // --------------------------------------------------------------------------- |
387 // Accessors. | 379 // Accessors. |
388 | 380 |
389 // The type of this scope. | 381 // The type of this scope. |
390 ScopeType scope_type() const { return scope_type_; } | 382 ScopeType scope_type() const { return scope_type_; } |
391 | 383 |
392 FunctionKind function_kind() const { return function_kind_; } | 384 FunctionKind function_kind() const { return function_kind_; } |
393 | 385 |
394 // The language mode of this scope. | 386 // The language mode of this scope. |
395 LanguageMode language_mode() const { return language_mode_; } | 387 LanguageMode language_mode() const { return language_mode_; } |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 | 488 |
497 // Inner scope list. | 489 // Inner scope list. |
498 ZoneList<Scope*>* inner_scopes() { return &inner_scopes_; } | 490 ZoneList<Scope*>* inner_scopes() { return &inner_scopes_; } |
499 | 491 |
500 // The scope immediately surrounding this scope, or NULL. | 492 // The scope immediately surrounding this scope, or NULL. |
501 Scope* outer_scope() const { return outer_scope_; } | 493 Scope* outer_scope() const { return outer_scope_; } |
502 | 494 |
503 // The ModuleDescriptor for this scope; only for module scopes. | 495 // The ModuleDescriptor for this scope; only for module scopes. |
504 ModuleDescriptor* module() const { return module_descriptor_; } | 496 ModuleDescriptor* module() const { return module_descriptor_; } |
505 | 497 |
506 | |
507 void set_class_declaration_group_start(int position) { | |
508 class_declaration_group_start_ = position; | |
509 } | |
510 | |
511 int class_declaration_group_start() const { | |
512 return class_declaration_group_start_; | |
513 } | |
514 | |
515 // --------------------------------------------------------------------------- | 498 // --------------------------------------------------------------------------- |
516 // Variable allocation. | 499 // Variable allocation. |
517 | 500 |
518 // Collect stack and context allocated local variables in this scope. Note | 501 // Collect stack and context allocated local variables in this scope. Note |
519 // that the function variable - if present - is not collected and should be | 502 // that the function variable - if present - is not collected and should be |
520 // handled separately. | 503 // handled separately. |
521 void CollectStackAndContextLocals( | 504 void CollectStackAndContextLocals(ZoneList<Variable*>* stack_locals, |
522 ZoneList<Variable*>* stack_locals, ZoneList<Variable*>* context_locals, | 505 ZoneList<Variable*>* context_locals, |
523 ZoneList<Variable*>* context_globals, | 506 ZoneList<Variable*>* context_globals); |
524 ZoneList<Variable*>* strong_mode_free_variables = nullptr); | |
525 | 507 |
526 // Current number of var or const locals. | 508 // Current number of var or const locals. |
527 int num_var_or_const() { return num_var_or_const_; } | 509 int num_var_or_const() { return num_var_or_const_; } |
528 | 510 |
529 // Result of variable allocation. | 511 // Result of variable allocation. |
530 int num_stack_slots() const { return num_stack_slots_; } | 512 int num_stack_slots() const { return num_stack_slots_; } |
531 int num_heap_slots() const { return num_heap_slots_; } | 513 int num_heap_slots() const { return num_heap_slots_; } |
532 int num_global_slots() const { return num_global_slots_; } | 514 int num_global_slots() const { return num_global_slots_; } |
533 | 515 |
534 int StackLocalCount() const; | 516 int StackLocalCount() const; |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 // scope. If the code is executed because of a call to 'eval', the context | 759 // scope. If the code is executed because of a call to 'eval', the context |
778 // parameter should be set to the calling context of 'eval'. | 760 // parameter should be set to the calling context of 'eval'. |
779 Variable* LookupRecursive(VariableProxy* proxy, BindingKind* binding_kind, | 761 Variable* LookupRecursive(VariableProxy* proxy, BindingKind* binding_kind, |
780 AstNodeFactory* factory); | 762 AstNodeFactory* factory); |
781 MUST_USE_RESULT | 763 MUST_USE_RESULT |
782 bool ResolveVariable(ParseInfo* info, VariableProxy* proxy, | 764 bool ResolveVariable(ParseInfo* info, VariableProxy* proxy, |
783 AstNodeFactory* factory); | 765 AstNodeFactory* factory); |
784 MUST_USE_RESULT | 766 MUST_USE_RESULT |
785 bool ResolveVariablesRecursively(ParseInfo* info, AstNodeFactory* factory); | 767 bool ResolveVariablesRecursively(ParseInfo* info, AstNodeFactory* factory); |
786 | 768 |
787 bool CheckStrongModeDeclaration(VariableProxy* proxy, Variable* var); | |
788 | |
789 // If this scope is a method scope of a class, return the corresponding | |
790 // class variable, otherwise nullptr. | |
791 ClassVariable* ClassVariableForMethod() const; | |
792 | |
793 // Scope analysis. | 769 // Scope analysis. |
794 void PropagateScopeInfo(bool outer_scope_calls_sloppy_eval); | 770 void PropagateScopeInfo(bool outer_scope_calls_sloppy_eval); |
795 bool HasTrivialContext() const; | 771 bool HasTrivialContext() const; |
796 | 772 |
797 // Predicates. | 773 // Predicates. |
798 bool MustAllocate(Variable* var); | 774 bool MustAllocate(Variable* var); |
799 bool MustAllocateInContext(Variable* var); | 775 bool MustAllocateInContext(Variable* var); |
800 bool HasArgumentsParameter(Isolate* isolate); | 776 bool HasArgumentsParameter(Isolate* isolate); |
801 | 777 |
802 // Variable allocation. | 778 // Variable allocation. |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
847 } | 823 } |
848 | 824 |
849 void SetDefaults(ScopeType type, Scope* outer_scope, | 825 void SetDefaults(ScopeType type, Scope* outer_scope, |
850 Handle<ScopeInfo> scope_info, | 826 Handle<ScopeInfo> scope_info, |
851 FunctionKind function_kind = kNormalFunction); | 827 FunctionKind function_kind = kNormalFunction); |
852 | 828 |
853 AstValueFactory* ast_value_factory_; | 829 AstValueFactory* ast_value_factory_; |
854 Zone* zone_; | 830 Zone* zone_; |
855 | 831 |
856 PendingCompilationErrorHandler pending_error_handler_; | 832 PendingCompilationErrorHandler pending_error_handler_; |
857 | |
858 // For tracking which classes are declared consecutively. Needed for strong | |
859 // mode. | |
860 int class_declaration_group_start_; | |
861 }; | 833 }; |
862 | 834 |
863 } // namespace internal | 835 } // namespace internal |
864 } // namespace v8 | 836 } // namespace v8 |
865 | 837 |
866 #endif // V8_AST_SCOPES_H_ | 838 #endif // V8_AST_SCOPES_H_ |
OLD | NEW |