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 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 bool is_catch_scope() const { return scope_type_ == CATCH_SCOPE; } | 303 bool is_catch_scope() const { return scope_type_ == CATCH_SCOPE; } |
304 bool is_block_scope() const { return scope_type_ == BLOCK_SCOPE; } | 304 bool is_block_scope() const { return scope_type_ == BLOCK_SCOPE; } |
305 bool is_with_scope() const { return scope_type_ == WITH_SCOPE; } | 305 bool is_with_scope() const { return scope_type_ == WITH_SCOPE; } |
306 bool is_declaration_scope() const { return is_declaration_scope_; } | 306 bool is_declaration_scope() const { return is_declaration_scope_; } |
307 | 307 |
308 // Information about which scopes calls eval. | 308 // Information about which scopes calls eval. |
309 bool calls_eval() const { return scope_calls_eval_; } | 309 bool calls_eval() const { return scope_calls_eval_; } |
310 bool calls_sloppy_eval() const { | 310 bool calls_sloppy_eval() const { |
311 return scope_calls_eval_ && is_sloppy(language_mode()); | 311 return scope_calls_eval_ && is_sloppy(language_mode()); |
312 } | 312 } |
313 bool outer_scope_calls_sloppy_eval() const { | |
314 return outer_scope_calls_sloppy_eval_; | |
315 } | |
316 bool IsAsmModule() const; | 313 bool IsAsmModule() const; |
317 bool IsAsmFunction() const; | 314 bool IsAsmFunction() const; |
318 // Does this scope access "super" property (super.foo). | 315 // Does this scope access "super" property (super.foo). |
319 bool uses_super_property() const { return scope_uses_super_property_; } | 316 bool uses_super_property() const { return scope_uses_super_property_; } |
320 // Does this scope have the potential to execute declarations non-linearly? | 317 // Does this scope have the potential to execute declarations non-linearly? |
321 bool is_nonlinear() const { return scope_nonlinear_; } | 318 bool is_nonlinear() const { return scope_nonlinear_; } |
322 | 319 |
323 // Whether this needs to be represented by a runtime context. | 320 // Whether this needs to be represented by a runtime context. |
324 bool NeedsContext() const { | 321 bool NeedsContext() const { |
325 // Catch scopes always have heap slots. | 322 // Catch scopes always have heap slots. |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 // Determine if we can parse a function literal in this scope lazily. | 373 // Determine if we can parse a function literal in this scope lazily. |
377 bool AllowsLazyParsing() const; | 374 bool AllowsLazyParsing() const; |
378 | 375 |
379 // Determine if we can use lazy compilation for this scope. | 376 // Determine if we can use lazy compilation for this scope. |
380 bool AllowsLazyCompilation() const; | 377 bool AllowsLazyCompilation() const; |
381 | 378 |
382 // Determine if we can use lazy compilation for this scope without a context. | 379 // Determine if we can use lazy compilation for this scope without a context. |
383 bool AllowsLazyCompilationWithoutContext() const; | 380 bool AllowsLazyCompilationWithoutContext() const; |
384 | 381 |
385 // The number of contexts between this and scope; zero if this == scope. | 382 // The number of contexts between this and scope; zero if this == scope. |
386 int ContextChainLength(Scope* scope); | 383 int ContextChainLength(Scope* scope) const; |
| 384 |
| 385 // The number of contexts between this and the outermost context that has a |
| 386 // sloppy eval call. One if this->calls_sloppy_eval(). |
| 387 int ContextChainLengthUntilOutermostSloppyEval() const; |
387 | 388 |
388 // The maximum number of nested contexts required for this scope and any inner | 389 // The maximum number of nested contexts required for this scope and any inner |
389 // scopes. | 390 // scopes. |
390 int MaxNestedContextChainLength(); | 391 int MaxNestedContextChainLength(); |
391 | 392 |
392 // Find the first function, script, eval or (declaration) block scope. This is | 393 // Find the first function, script, eval or (declaration) block scope. This is |
393 // the scope where var declarations will be hoisted to in the implementation. | 394 // the scope where var declarations will be hoisted to in the implementation. |
394 DeclarationScope* GetDeclarationScope(); | 395 DeclarationScope* GetDeclarationScope(); |
395 | 396 |
396 // Find the first non-block declaration scope. This should be either a script, | 397 // Find the first non-block declaration scope. This should be either a script, |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 bool scope_uses_super_property_ : 1; | 506 bool scope_uses_super_property_ : 1; |
506 // This scope has a parameter called "arguments". | 507 // This scope has a parameter called "arguments". |
507 bool has_arguments_parameter_ : 1; | 508 bool has_arguments_parameter_ : 1; |
508 // This scope's declarations might not be executed in order (e.g., switch). | 509 // This scope's declarations might not be executed in order (e.g., switch). |
509 bool scope_nonlinear_ : 1; | 510 bool scope_nonlinear_ : 1; |
510 bool is_hidden_ : 1; | 511 bool is_hidden_ : 1; |
511 // Temporary workaround that allows masking of 'this' in debug-evalute scopes. | 512 // Temporary workaround that allows masking of 'this' in debug-evalute scopes. |
512 bool is_debug_evaluate_scope_ : 1; | 513 bool is_debug_evaluate_scope_ : 1; |
513 | 514 |
514 // Computed via PropagateScopeInfo. | 515 // Computed via PropagateScopeInfo. |
515 bool outer_scope_calls_sloppy_eval_ : 1; | |
516 bool inner_scope_calls_eval_ : 1; | 516 bool inner_scope_calls_eval_ : 1; |
517 bool force_eager_compilation_ : 1; | 517 bool force_eager_compilation_ : 1; |
518 bool force_context_allocation_ : 1; | 518 bool force_context_allocation_ : 1; |
519 | 519 |
520 // True if it holds 'var' declarations. | 520 // True if it holds 'var' declarations. |
521 bool is_declaration_scope_ : 1; | 521 bool is_declaration_scope_ : 1; |
522 | 522 |
523 // Create a non-local variable with a given name. | 523 // Create a non-local variable with a given name. |
524 // These variables are looked up dynamically at runtime. | 524 // These variables are looked up dynamically at runtime. |
525 Variable* NonLocal(const AstRawString* name, VariableMode mode); | 525 Variable* NonLocal(const AstRawString* name, VariableMode mode); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 void ResolveVariablesRecursively(ParseInfo* info, AstNodeFactory* factory); | 584 void ResolveVariablesRecursively(ParseInfo* info, AstNodeFactory* factory); |
585 | 585 |
586 // Finds free variables of this scope. This mutates the unresolved variables | 586 // Finds free variables of this scope. This mutates the unresolved variables |
587 // list along the way, so full resolution cannot be done afterwards. | 587 // list along the way, so full resolution cannot be done afterwards. |
588 // If a ParseInfo* is passed, non-free variables will be resolved. | 588 // If a ParseInfo* is passed, non-free variables will be resolved. |
589 VariableProxy* FetchFreeVariables(DeclarationScope* max_outer_scope, | 589 VariableProxy* FetchFreeVariables(DeclarationScope* max_outer_scope, |
590 ParseInfo* info = nullptr, | 590 ParseInfo* info = nullptr, |
591 VariableProxy* stack = nullptr); | 591 VariableProxy* stack = nullptr); |
592 | 592 |
593 // Scope analysis. | 593 // Scope analysis. |
594 void PropagateScopeInfo(bool outer_scope_calls_sloppy_eval); | 594 void PropagateScopeInfo(); |
595 | 595 |
596 // Predicates. | 596 // Predicates. |
597 bool MustAllocate(Variable* var); | 597 bool MustAllocate(Variable* var); |
598 bool MustAllocateInContext(Variable* var); | 598 bool MustAllocateInContext(Variable* var); |
599 | 599 |
600 // Variable allocation. | 600 // Variable allocation. |
601 void AllocateStackSlot(Variable* var); | 601 void AllocateStackSlot(Variable* var); |
602 void AllocateHeapSlot(Variable* var); | 602 void AllocateHeapSlot(Variable* var); |
603 void AllocateNonParameterLocal(Variable* var); | 603 void AllocateNonParameterLocal(Variable* var); |
604 void AllocateDeclaredGlobal(Variable* var); | 604 void AllocateDeclaredGlobal(Variable* var); |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
893 void AllocateModuleVariables(); | 893 void AllocateModuleVariables(); |
894 | 894 |
895 private: | 895 private: |
896 ModuleDescriptor* module_descriptor_; | 896 ModuleDescriptor* module_descriptor_; |
897 }; | 897 }; |
898 | 898 |
899 } // namespace internal | 899 } // namespace internal |
900 } // namespace v8 | 900 } // namespace v8 |
901 | 901 |
902 #endif // V8_AST_SCOPES_H_ | 902 #endif // V8_AST_SCOPES_H_ |
OLD | NEW |