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