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_SCOPES_H_ | 5 #ifndef V8_SCOPES_H_ |
6 #define V8_SCOPES_H_ | 6 #define V8_SCOPES_H_ |
7 | 7 |
8 #include "src/ast.h" | 8 #include "src/ast.h" |
9 #include "src/pending-compilation-error-handler.h" | 9 #include "src/pending-compilation-error-handler.h" |
10 #include "src/zone.h" | 10 #include "src/zone.h" |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 | 137 |
138 // Declare an implicit global variable in this scope which must be a | 138 // Declare an implicit global variable in this scope which must be a |
139 // script scope. The variable was introduced (possibly from an inner | 139 // script scope. The variable was introduced (possibly from an inner |
140 // scope) by a reference to an unresolved variable with no intervening | 140 // scope) by a reference to an unresolved variable with no intervening |
141 // with statements or eval calls. | 141 // with statements or eval calls. |
142 Variable* DeclareDynamicGlobal(const AstRawString* name); | 142 Variable* DeclareDynamicGlobal(const AstRawString* name); |
143 | 143 |
144 // Create a new unresolved variable. | 144 // Create a new unresolved variable. |
145 VariableProxy* NewUnresolved(AstNodeFactory* factory, | 145 VariableProxy* NewUnresolved(AstNodeFactory* factory, |
146 const AstRawString* name, | 146 const AstRawString* name, |
| 147 Variable::Kind kind = Variable::NORMAL, |
147 int start_position = RelocInfo::kNoPosition, | 148 int start_position = RelocInfo::kNoPosition, |
148 int end_position = RelocInfo::kNoPosition) { | 149 int end_position = RelocInfo::kNoPosition) { |
149 // Note that we must not share the unresolved variables with | 150 // Note that we must not share the unresolved variables with |
150 // the same name because they may be removed selectively via | 151 // the same name because they may be removed selectively via |
151 // RemoveUnresolved(). | 152 // RemoveUnresolved(). |
152 DCHECK(!already_resolved()); | 153 DCHECK(!already_resolved()); |
153 VariableProxy* proxy = factory->NewVariableProxy( | 154 VariableProxy* proxy = |
154 name, Variable::NORMAL, start_position, end_position); | 155 factory->NewVariableProxy(name, kind, start_position, end_position); |
155 unresolved_.Add(proxy, zone_); | 156 unresolved_.Add(proxy, zone_); |
156 return proxy; | 157 return proxy; |
157 } | 158 } |
158 | 159 |
159 // Remove a unresolved variable. During parsing, an unresolved variable | 160 // Remove a unresolved variable. During parsing, an unresolved variable |
160 // may have been added optimistically, but then only the variable name | 161 // may have been added optimistically, but then only the variable name |
161 // was used (typically for labels). If the variable was not declared, the | 162 // was used (typically for labels). If the variable was not declared, the |
162 // addition introduced a new unresolved variable which may end up being | 163 // addition introduced a new unresolved variable which may end up being |
163 // allocated globally as a "ghost" variable. RemoveUnresolved removes | 164 // allocated globally as a "ghost" variable. RemoveUnresolved removes |
164 // such a variable again if it was added; otherwise this is a no-op. | 165 // such a variable again if it was added; otherwise this is a no-op. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 | 211 |
211 // Inform the scope that the corresponding code contains an eval call. | 212 // Inform the scope that the corresponding code contains an eval call. |
212 void RecordEvalCall() { if (!is_script_scope()) scope_calls_eval_ = true; } | 213 void RecordEvalCall() { if (!is_script_scope()) scope_calls_eval_ = true; } |
213 | 214 |
214 // Inform the scope that the corresponding code uses "arguments". | 215 // Inform the scope that the corresponding code uses "arguments". |
215 void RecordArgumentsUsage() { scope_uses_arguments_ = true; } | 216 void RecordArgumentsUsage() { scope_uses_arguments_ = true; } |
216 | 217 |
217 // Inform the scope that the corresponding code uses "super". | 218 // Inform the scope that the corresponding code uses "super". |
218 void RecordSuperPropertyUsage() { scope_uses_super_property_ = true; } | 219 void RecordSuperPropertyUsage() { scope_uses_super_property_ = true; } |
219 | 220 |
220 // Inform the scope that the corresponding code uses "this". | |
221 void RecordThisUsage() { scope_uses_this_ = true; } | |
222 | |
223 // Set the language mode flag (unless disabled by a global flag). | 221 // Set the language mode flag (unless disabled by a global flag). |
224 void SetLanguageMode(LanguageMode language_mode) { | 222 void SetLanguageMode(LanguageMode language_mode) { |
225 language_mode_ = language_mode; | 223 language_mode_ = language_mode; |
226 } | 224 } |
227 | 225 |
228 // Set the ASM module flag. | 226 // Set the ASM module flag. |
229 void SetAsmModule() { asm_module_ = true; } | 227 void SetAsmModule() { asm_module_ = true; } |
230 | 228 |
231 // Position in the source where this scope begins and ends. | 229 // Position in the source where this scope begins and ends. |
232 // | 230 // |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 // Does this scope access "arguments". | 314 // Does this scope access "arguments". |
317 bool uses_arguments() const { return scope_uses_arguments_; } | 315 bool uses_arguments() const { return scope_uses_arguments_; } |
318 // Does any inner scope access "arguments". | 316 // Does any inner scope access "arguments". |
319 bool inner_uses_arguments() const { return inner_scope_uses_arguments_; } | 317 bool inner_uses_arguments() const { return inner_scope_uses_arguments_; } |
320 // Does this scope access "super" property (super.foo). | 318 // Does this scope access "super" property (super.foo). |
321 bool uses_super_property() const { return scope_uses_super_property_; } | 319 bool uses_super_property() const { return scope_uses_super_property_; } |
322 // Does any inner scope access "super" property. | 320 // Does any inner scope access "super" property. |
323 bool inner_uses_super_property() const { | 321 bool inner_uses_super_property() const { |
324 return inner_scope_uses_super_property_; | 322 return inner_scope_uses_super_property_; |
325 } | 323 } |
326 // Does this scope access "this". | |
327 bool uses_this() const { return scope_uses_this_; } | |
328 // Does any inner scope access "this". | |
329 bool inner_uses_this() const { return inner_scope_uses_this_; } | |
330 | 324 |
331 const Scope* NearestOuterEvalScope() const { | 325 const Scope* NearestOuterEvalScope() const { |
332 if (is_eval_scope()) return this; | 326 if (is_eval_scope()) return this; |
333 if (outer_scope() == nullptr) return nullptr; | 327 if (outer_scope() == nullptr) return nullptr; |
334 return outer_scope()->NearestOuterEvalScope(); | 328 return outer_scope()->NearestOuterEvalScope(); |
335 } | 329 } |
336 | 330 |
337 // --------------------------------------------------------------------------- | 331 // --------------------------------------------------------------------------- |
338 // Accessors. | 332 // Accessors. |
339 | 333 |
340 // The type of this scope. | 334 // The type of this scope. |
341 ScopeType scope_type() const { return scope_type_; } | 335 ScopeType scope_type() const { return scope_type_; } |
342 | 336 |
343 FunctionKind function_kind() const { return function_kind_; } | 337 FunctionKind function_kind() const { return function_kind_; } |
344 | 338 |
345 // The language mode of this scope. | 339 // The language mode of this scope. |
346 LanguageMode language_mode() const { return language_mode_; } | 340 LanguageMode language_mode() const { return language_mode_; } |
347 | 341 |
348 // The variable corresponding to the 'this' value. | 342 // The variable corresponding to the 'this' value. |
349 Variable* receiver() { return receiver_; } | 343 Variable* receiver() { |
| 344 DCHECK(has_this_declaration()); |
| 345 DCHECK_NOT_NULL(receiver_); |
| 346 return receiver_; |
| 347 } |
| 348 |
| 349 Variable* LookupThis() { return Lookup(ast_value_factory_->this_string()); } |
| 350 |
| 351 // TODO(wingo): Add a GLOBAL_SCOPE scope type which will lexically allocate |
| 352 // "this" (and no other variable) on the native context. Script scopes then |
| 353 // will not have a "this" declaration. |
| 354 bool has_this_declaration() const { |
| 355 return (is_function_scope() && !is_arrow_scope()) || is_module_scope() || |
| 356 is_script_scope(); |
| 357 } |
350 | 358 |
351 // The variable corresponding to the 'new.target' value. | 359 // The variable corresponding to the 'new.target' value. |
352 Variable* new_target_var() { return new_target_; } | 360 Variable* new_target_var() { return new_target_; } |
353 | 361 |
354 // The variable holding the function literal for named function | 362 // The variable holding the function literal for named function |
355 // literals, or NULL. Only valid for function scopes. | 363 // literals, or NULL. Only valid for function scopes. |
356 VariableDeclaration* function() const { | 364 VariableDeclaration* function() const { |
357 DCHECK(is_function_scope()); | 365 DCHECK(is_function_scope()); |
358 return function_; | 366 return function_; |
359 } | 367 } |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 bool scope_inside_with_; | 579 bool scope_inside_with_; |
572 // This scope contains a 'with' statement. | 580 // This scope contains a 'with' statement. |
573 bool scope_contains_with_; | 581 bool scope_contains_with_; |
574 // This scope or a nested catch scope or with scope contain an 'eval' call. At | 582 // This scope or a nested catch scope or with scope contain an 'eval' call. At |
575 // the 'eval' call site this scope is the declaration scope. | 583 // the 'eval' call site this scope is the declaration scope. |
576 bool scope_calls_eval_; | 584 bool scope_calls_eval_; |
577 // This scope uses "arguments". | 585 // This scope uses "arguments". |
578 bool scope_uses_arguments_; | 586 bool scope_uses_arguments_; |
579 // This scope uses "super" property ('super.foo'). | 587 // This scope uses "super" property ('super.foo'). |
580 bool scope_uses_super_property_; | 588 bool scope_uses_super_property_; |
581 // This scope uses "this". | |
582 bool scope_uses_this_; | |
583 // This scope contains an "use asm" annotation. | 589 // This scope contains an "use asm" annotation. |
584 bool asm_module_; | 590 bool asm_module_; |
585 // This scope's outer context is an asm module. | 591 // This scope's outer context is an asm module. |
586 bool asm_function_; | 592 bool asm_function_; |
587 // The language mode of this scope. | 593 // The language mode of this scope. |
588 LanguageMode language_mode_; | 594 LanguageMode language_mode_; |
589 // Source positions. | 595 // Source positions. |
590 int start_position_; | 596 int start_position_; |
591 int end_position_; | 597 int end_position_; |
592 | 598 |
593 // Computed via PropagateScopeInfo. | 599 // Computed via PropagateScopeInfo. |
594 bool outer_scope_calls_sloppy_eval_; | 600 bool outer_scope_calls_sloppy_eval_; |
595 bool inner_scope_calls_eval_; | 601 bool inner_scope_calls_eval_; |
596 bool inner_scope_uses_arguments_; | 602 bool inner_scope_uses_arguments_; |
597 bool inner_scope_uses_super_property_; | 603 bool inner_scope_uses_super_property_; |
598 bool inner_scope_uses_this_; | |
599 bool force_eager_compilation_; | 604 bool force_eager_compilation_; |
600 bool force_context_allocation_; | 605 bool force_context_allocation_; |
601 | 606 |
602 // True if it doesn't need scope resolution (e.g., if the scope was | 607 // True if it doesn't need scope resolution (e.g., if the scope was |
603 // constructed based on a serialized scope info or a catch context). | 608 // constructed based on a serialized scope info or a catch context). |
604 bool already_resolved_; | 609 bool already_resolved_; |
605 | 610 |
606 // Computed as variables are declared. | 611 // Computed as variables are declared. |
607 int num_var_or_const_; | 612 int num_var_or_const_; |
608 | 613 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 bool MustAllocateInContext(Variable* var); | 705 bool MustAllocateInContext(Variable* var); |
701 bool HasArgumentsParameter(Isolate* isolate); | 706 bool HasArgumentsParameter(Isolate* isolate); |
702 | 707 |
703 // Variable allocation. | 708 // Variable allocation. |
704 void AllocateStackSlot(Variable* var); | 709 void AllocateStackSlot(Variable* var); |
705 void AllocateHeapSlot(Variable* var); | 710 void AllocateHeapSlot(Variable* var); |
706 void AllocateParameterLocals(Isolate* isolate); | 711 void AllocateParameterLocals(Isolate* isolate); |
707 void AllocateNonParameterLocal(Isolate* isolate, Variable* var); | 712 void AllocateNonParameterLocal(Isolate* isolate, Variable* var); |
708 void AllocateNonParameterLocals(Isolate* isolate); | 713 void AllocateNonParameterLocals(Isolate* isolate); |
709 void AllocateVariablesRecursively(Isolate* isolate); | 714 void AllocateVariablesRecursively(Isolate* isolate); |
| 715 void AllocateParameter(Variable* var, int index); |
| 716 void AllocateReceiver(); |
710 void AllocateModules(); | 717 void AllocateModules(); |
711 | 718 |
712 // Resolve and fill in the allocation information for all variables | 719 // Resolve and fill in the allocation information for all variables |
713 // in this scopes. Must be called *after* all scopes have been | 720 // in this scopes. Must be called *after* all scopes have been |
714 // processed (parsed) to ensure that unresolved variables can be | 721 // processed (parsed) to ensure that unresolved variables can be |
715 // resolved properly. | 722 // resolved properly. |
716 // | 723 // |
717 // In the case of code compiled and run using 'eval', the context | 724 // In the case of code compiled and run using 'eval', the context |
718 // parameter is the context in which eval was called. In all other | 725 // parameter is the context in which eval was called. In all other |
719 // cases the context parameter is an empty handle. | 726 // cases the context parameter is an empty handle. |
(...skipping 26 matching lines...) Expand all Loading... |
746 PendingCompilationErrorHandler pending_error_handler_; | 753 PendingCompilationErrorHandler pending_error_handler_; |
747 | 754 |
748 // For tracking which classes are declared consecutively. Needed for strong | 755 // For tracking which classes are declared consecutively. Needed for strong |
749 // mode. | 756 // mode. |
750 int class_declaration_group_start_; | 757 int class_declaration_group_start_; |
751 }; | 758 }; |
752 | 759 |
753 } } // namespace v8::internal | 760 } } // namespace v8::internal |
754 | 761 |
755 #endif // V8_SCOPES_H_ | 762 #endif // V8_SCOPES_H_ |
OLD | NEW |