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 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 | 226 |
227 // Inform the scope that the corresponding code uses "super". | 227 // Inform the scope that the corresponding code uses "super". |
228 void RecordSuperPropertyUsage() { scope_uses_super_property_ = true; } | 228 void RecordSuperPropertyUsage() { scope_uses_super_property_ = true; } |
229 | 229 |
230 // Set the language mode flag (unless disabled by a global flag). | 230 // Set the language mode flag (unless disabled by a global flag). |
231 void SetLanguageMode(LanguageMode language_mode) { | 231 void SetLanguageMode(LanguageMode language_mode) { |
232 DCHECK(!is_module_scope() || is_strict(language_mode)); | 232 DCHECK(!is_module_scope() || is_strict(language_mode)); |
233 set_language_mode(language_mode); | 233 set_language_mode(language_mode); |
234 } | 234 } |
235 | 235 |
236 // Set the ASM module flag. | |
237 void SetAsmModule() { asm_module_ = true; } | |
238 | |
239 // Inform the scope that the scope may execute declarations nonlinearly. | 236 // Inform the scope that the scope may execute declarations nonlinearly. |
240 // Currently, the only nonlinear scope is a switch statement. The name is | 237 // Currently, the only nonlinear scope is a switch statement. The name is |
241 // more general in case something else comes up with similar control flow, | 238 // more general in case something else comes up with similar control flow, |
242 // for example the ability to break out of something which does not have | 239 // for example the ability to break out of something which does not have |
243 // its own lexical scope. | 240 // its own lexical scope. |
244 // The bit does not need to be stored on the ScopeInfo because none of | 241 // The bit does not need to be stored on the ScopeInfo because none of |
245 // the three compilers will perform hole check elimination on a variable | 242 // the three compilers will perform hole check elimination on a variable |
246 // located in VariableLocation::CONTEXT. So, direct eval and closures | 243 // located in VariableLocation::CONTEXT. So, direct eval and closures |
247 // will not expose holes. | 244 // will not expose holes. |
248 void SetNonlinear() { scope_nonlinear_ = true; } | 245 void SetNonlinear() { scope_nonlinear_ = true; } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 bool is_declaration_scope() const { return is_declaration_scope_; } | 306 bool is_declaration_scope() const { return is_declaration_scope_; } |
310 | 307 |
311 // Information about which scopes calls eval. | 308 // Information about which scopes calls eval. |
312 bool calls_eval() const { return scope_calls_eval_; } | 309 bool calls_eval() const { return scope_calls_eval_; } |
313 bool calls_sloppy_eval() const { | 310 bool calls_sloppy_eval() const { |
314 return scope_calls_eval_ && is_sloppy(language_mode()); | 311 return scope_calls_eval_ && is_sloppy(language_mode()); |
315 } | 312 } |
316 bool outer_scope_calls_sloppy_eval() const { | 313 bool outer_scope_calls_sloppy_eval() const { |
317 return outer_scope_calls_sloppy_eval_; | 314 return outer_scope_calls_sloppy_eval_; |
318 } | 315 } |
319 bool asm_module() const { return asm_module_; } | 316 bool IsAsmModule() const; |
320 bool asm_function() const { return asm_function_; } | 317 bool IsAsmFunction() const; |
321 | |
322 // Does this scope access "super" property (super.foo). | 318 // Does this scope access "super" property (super.foo). |
323 bool uses_super_property() const { return scope_uses_super_property_; } | 319 bool uses_super_property() const { return scope_uses_super_property_; } |
324 // Does this scope have the potential to execute declarations non-linearly? | 320 // Does this scope have the potential to execute declarations non-linearly? |
325 bool is_nonlinear() const { return scope_nonlinear_; } | 321 bool is_nonlinear() const { return scope_nonlinear_; } |
326 | 322 |
327 // Whether this needs to be represented by a runtime context. | 323 // Whether this needs to be represented by a runtime context. |
328 bool NeedsContext() const { | 324 bool NeedsContext() const { |
329 // Catch scopes always have heap slots. | 325 // Catch scopes always have heap slots. |
330 DCHECK(!is_catch_scope() || num_heap_slots() > 0); | 326 DCHECK(!is_catch_scope() || num_heap_slots() > 0); |
331 return num_heap_slots() > 0; | 327 return num_heap_slots() > 0; |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 bool is_strict_ : 1; | 503 bool is_strict_ : 1; |
508 // This scope is inside a 'with' of some outer scope. | 504 // This scope is inside a 'with' of some outer scope. |
509 bool scope_inside_with_ : 1; | 505 bool scope_inside_with_ : 1; |
510 // This scope or a nested catch scope or with scope contain an 'eval' call. At | 506 // This scope or a nested catch scope or with scope contain an 'eval' call. At |
511 // the 'eval' call site this scope is the declaration scope. | 507 // the 'eval' call site this scope is the declaration scope. |
512 bool scope_calls_eval_ : 1; | 508 bool scope_calls_eval_ : 1; |
513 // This scope uses "super" property ('super.foo'). | 509 // This scope uses "super" property ('super.foo'). |
514 bool scope_uses_super_property_ : 1; | 510 bool scope_uses_super_property_ : 1; |
515 // This scope has a parameter called "arguments". | 511 // This scope has a parameter called "arguments". |
516 bool has_arguments_parameter_ : 1; | 512 bool has_arguments_parameter_ : 1; |
517 // This scope contains an "use asm" annotation. | |
518 bool asm_module_ : 1; | |
519 // This scope's outer context is an asm module. | |
520 bool asm_function_ : 1; | |
521 // This scope's declarations might not be executed in order (e.g., switch). | 513 // This scope's declarations might not be executed in order (e.g., switch). |
522 bool scope_nonlinear_ : 1; | 514 bool scope_nonlinear_ : 1; |
523 bool is_hidden_ : 1; | 515 bool is_hidden_ : 1; |
524 // Temporary workaround that allows masking of 'this' in debug-evalute scopes. | 516 // Temporary workaround that allows masking of 'this' in debug-evalute scopes. |
525 bool is_debug_evaluate_scope_ : 1; | 517 bool is_debug_evaluate_scope_ : 1; |
526 | 518 |
527 // Computed via PropagateScopeInfo. | 519 // Computed via PropagateScopeInfo. |
528 bool outer_scope_calls_sloppy_eval_ : 1; | 520 bool outer_scope_calls_sloppy_eval_ : 1; |
529 bool inner_scope_calls_eval_ : 1; | 521 bool inner_scope_calls_eval_ : 1; |
530 bool force_eager_compilation_ : 1; | 522 bool force_eager_compilation_ : 1; |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 } | 669 } |
678 | 670 |
679 bool NeedsHomeObject() const { | 671 bool NeedsHomeObject() const { |
680 return scope_uses_super_property_ || | 672 return scope_uses_super_property_ || |
681 ((scope_calls_eval_ || inner_scope_calls_eval_) && | 673 ((scope_calls_eval_ || inner_scope_calls_eval_) && |
682 (IsConciseMethod(function_kind()) || | 674 (IsConciseMethod(function_kind()) || |
683 IsAccessorFunction(function_kind()) || | 675 IsAccessorFunction(function_kind()) || |
684 IsClassConstructor(function_kind()))); | 676 IsClassConstructor(function_kind()))); |
685 } | 677 } |
686 | 678 |
| 679 bool asm_module() const { return asm_module_; } |
| 680 void set_asm_module() { asm_module_ = true; } |
| 681 bool asm_function() const { return asm_function_; } |
| 682 void set_asm_function() { asm_module_ = true; } |
| 683 |
687 void DeclareThis(AstValueFactory* ast_value_factory); | 684 void DeclareThis(AstValueFactory* ast_value_factory); |
688 void DeclareDefaultFunctionVariables(AstValueFactory* ast_value_factory); | 685 void DeclareDefaultFunctionVariables(AstValueFactory* ast_value_factory); |
689 | 686 |
690 // This lookup corresponds to a lookup in the "intermediate" scope sitting | 687 // This lookup corresponds to a lookup in the "intermediate" scope sitting |
691 // between this scope and the outer scope. (ECMA-262, 3rd., requires that | 688 // between this scope and the outer scope. (ECMA-262, 3rd., requires that |
692 // the name of named function literal is kept in an intermediate scope | 689 // the name of named function literal is kept in an intermediate scope |
693 // in between this scope and the next outer scope.) | 690 // in between this scope and the next outer scope.) |
694 Variable* LookupFunctionVar(const AstRawString* name); | 691 Variable* LookupFunctionVar(const AstRawString* name); |
695 | 692 |
696 // Declare the function variable for a function literal. This variable | 693 // Declare the function variable for a function literal. This variable |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
853 | 850 |
854 private: | 851 private: |
855 void AllocateParameter(Variable* var, int index); | 852 void AllocateParameter(Variable* var, int index); |
856 | 853 |
857 void SetDefaults(); | 854 void SetDefaults(); |
858 | 855 |
859 // If the scope is a function scope, this is the function kind. | 856 // If the scope is a function scope, this is the function kind. |
860 const FunctionKind function_kind_; | 857 const FunctionKind function_kind_; |
861 | 858 |
862 bool has_simple_parameters_ : 1; | 859 bool has_simple_parameters_ : 1; |
| 860 // This scope contains an "use asm" annotation. |
| 861 bool asm_module_ : 1; |
| 862 // This scope's outer context is an asm module. |
| 863 bool asm_function_ : 1; |
863 | 864 |
864 // Info about the parameter list of a function. | 865 // Info about the parameter list of a function. |
865 int arity_; | 866 int arity_; |
866 int rest_index_; | 867 int rest_index_; |
867 Variable* rest_parameter_; | 868 Variable* rest_parameter_; |
868 // Compiler-allocated (user-invisible) temporaries. | 869 // Compiler-allocated (user-invisible) temporaries. |
869 ZoneList<Variable*> temps_; | 870 ZoneList<Variable*> temps_; |
870 // Parameter list in source order. | 871 // Parameter list in source order. |
871 ZoneList<Variable*> params_; | 872 ZoneList<Variable*> params_; |
872 // Map of function names to lists of functions defined in sloppy blocks | 873 // Map of function names to lists of functions defined in sloppy blocks |
(...skipping 25 matching lines...) Expand all Loading... |
898 void AllocateModuleVariables(); | 899 void AllocateModuleVariables(); |
899 | 900 |
900 private: | 901 private: |
901 ModuleDescriptor* module_descriptor_; | 902 ModuleDescriptor* module_descriptor_; |
902 }; | 903 }; |
903 | 904 |
904 } // namespace internal | 905 } // namespace internal |
905 } // namespace v8 | 906 } // namespace v8 |
906 | 907 |
907 #endif // V8_AST_SCOPES_H_ | 908 #endif // V8_AST_SCOPES_H_ |
OLD | NEW |