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/base/compiler-specific.h" | 8 #include "src/base/compiler-specific.h" |
9 #include "src/base/hashmap.h" | 9 #include "src/base/hashmap.h" |
10 #include "src/globals.h" | 10 #include "src/globals.h" |
(...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
673 // Declare the function variable for a function literal. This variable | 673 // Declare the function variable for a function literal. This variable |
674 // is in an intermediate scope between this function scope and the the | 674 // is in an intermediate scope between this function scope and the the |
675 // outer scope. Only possible for function scopes; at most one variable. | 675 // outer scope. Only possible for function scopes; at most one variable. |
676 // | 676 // |
677 // This function needs to be called after all other variables have been | 677 // This function needs to be called after all other variables have been |
678 // declared in the scope. It will add a variable for {name} to {variables_}; | 678 // declared in the scope. It will add a variable for {name} to {variables_}; |
679 // either the function variable itself, or a non-local in case the function | 679 // either the function variable itself, or a non-local in case the function |
680 // calls sloppy eval. | 680 // calls sloppy eval. |
681 Variable* DeclareFunctionVar(const AstRawString* name); | 681 Variable* DeclareFunctionVar(const AstRawString* name); |
682 | 682 |
683 // Declare some special internal variables which must be accessible to | |
684 // Ignition without ScopeInfo. | |
685 Variable* DeclareGeneratorObjectVar(const AstRawString* name); | |
686 Variable* DeclarePromiseVar(const AstRawString* name); | |
687 | |
683 // Declare a parameter in this scope. When there are duplicated | 688 // Declare a parameter in this scope. When there are duplicated |
684 // parameters the rightmost one 'wins'. However, the implementation | 689 // parameters the rightmost one 'wins'. However, the implementation |
685 // expects all parameters to be declared and from left to right. | 690 // expects all parameters to be declared and from left to right. |
686 Variable* DeclareParameter(const AstRawString* name, VariableMode mode, | 691 Variable* DeclareParameter(const AstRawString* name, VariableMode mode, |
687 bool is_optional, bool is_rest, bool* is_duplicate, | 692 bool is_optional, bool is_rest, bool* is_duplicate, |
688 AstValueFactory* ast_value_factory); | 693 AstValueFactory* ast_value_factory); |
689 | 694 |
690 // Declare an implicit global variable in this scope which must be a | 695 // Declare an implicit global variable in this scope which must be a |
691 // script scope. The variable was introduced (possibly from an inner | 696 // script scope. The variable was introduced (possibly from an inner |
692 // scope) by a reference to an unresolved variable with no intervening | 697 // scope) by a reference to an unresolved variable with no intervening |
(...skipping 18 matching lines...) Expand all Loading... | |
711 // The variable corresponding to the 'new.target' value. | 716 // The variable corresponding to the 'new.target' value. |
712 Variable* new_target_var() { return new_target_; } | 717 Variable* new_target_var() { return new_target_; } |
713 | 718 |
714 // The variable holding the function literal for named function | 719 // The variable holding the function literal for named function |
715 // literals, or NULL. Only valid for function scopes. | 720 // literals, or NULL. Only valid for function scopes. |
716 Variable* function_var() const { | 721 Variable* function_var() const { |
717 DCHECK(is_function_scope()); | 722 DCHECK(is_function_scope()); |
718 return function_; | 723 return function_; |
719 } | 724 } |
720 | 725 |
726 Variable* generator_object_var() const { | |
727 DCHECK(is_function_scope() || is_module_scope()); | |
728 return GetRareVariable(RareVariable::kGeneratorObject); | |
729 } | |
730 | |
731 Variable* promise_var() const { | |
732 DCHECK(is_function_scope()); | |
733 DCHECK(IsAsyncFunction(function_kind_)); | |
734 return GetRareVariable(RareVariable::kPromise); | |
735 } | |
736 | |
721 // Parameters. The left-most parameter has index 0. | 737 // Parameters. The left-most parameter has index 0. |
722 // Only valid for function and module scopes. | 738 // Only valid for function and module scopes. |
723 Variable* parameter(int index) const { | 739 Variable* parameter(int index) const { |
724 DCHECK(is_function_scope() || is_module_scope()); | 740 DCHECK(is_function_scope() || is_module_scope()); |
725 return params_[index]; | 741 return params_[index]; |
726 } | 742 } |
727 | 743 |
728 // Returns the number of formal parameters, excluding a possible rest | 744 // Returns the number of formal parameters, excluding a possible rest |
729 // parameter. Examples: | 745 // parameter. Examples: |
730 // function foo(a, b) {} ==> 2 | 746 // function foo(a, b) {} ==> 2 |
(...skipping 20 matching lines...) Expand all Loading... | |
751 has_simple_parameters_ = false; | 767 has_simple_parameters_ = false; |
752 } | 768 } |
753 | 769 |
754 // The local variable 'arguments' if we need to allocate it; NULL otherwise. | 770 // The local variable 'arguments' if we need to allocate it; NULL otherwise. |
755 Variable* arguments() const { | 771 Variable* arguments() const { |
756 DCHECK(!is_arrow_scope() || arguments_ == nullptr); | 772 DCHECK(!is_arrow_scope() || arguments_ == nullptr); |
757 return arguments_; | 773 return arguments_; |
758 } | 774 } |
759 | 775 |
760 Variable* this_function_var() const { | 776 Variable* this_function_var() const { |
777 Variable* this_function = GetRareVariable(RareVariable::kThisFunction); | |
778 | |
761 // This is only used in derived constructors atm. | 779 // This is only used in derived constructors atm. |
762 DCHECK(this_function_ == nullptr || | 780 DCHECK(this_function == nullptr || |
763 (is_function_scope() && (IsClassConstructor(function_kind()) || | 781 (is_function_scope() && (IsClassConstructor(function_kind()) || |
764 IsConciseMethod(function_kind()) || | 782 IsConciseMethod(function_kind()) || |
765 IsAccessorFunction(function_kind())))); | 783 IsAccessorFunction(function_kind())))); |
766 return this_function_; | 784 return this_function; |
767 } | 785 } |
768 | 786 |
769 // Adds a local variable in this scope's locals list. This is for adjusting | 787 // Adds a local variable in this scope's locals list. This is for adjusting |
770 // the scope of temporaries and do-expression vars when desugaring parameter | 788 // the scope of temporaries and do-expression vars when desugaring parameter |
771 // initializers. | 789 // initializers. |
772 void AddLocal(Variable* var); | 790 void AddLocal(Variable* var); |
773 | 791 |
774 void DeclareSloppyBlockFunction( | 792 void DeclareSloppyBlockFunction( |
775 const AstRawString* name, Scope* scope, | 793 const AstRawString* name, Scope* scope, |
776 SloppyBlockFunctionStatement* statement = nullptr); | 794 SloppyBlockFunctionStatement* statement = nullptr); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
865 // Map of function names to lists of functions defined in sloppy blocks | 883 // Map of function names to lists of functions defined in sloppy blocks |
866 SloppyBlockFunctionMap sloppy_block_function_map_; | 884 SloppyBlockFunctionMap sloppy_block_function_map_; |
867 // Convenience variable. | 885 // Convenience variable. |
868 Variable* receiver_; | 886 Variable* receiver_; |
869 // Function variable, if any; function scopes only. | 887 // Function variable, if any; function scopes only. |
870 Variable* function_; | 888 Variable* function_; |
871 // new.target variable, function scopes only. | 889 // new.target variable, function scopes only. |
872 Variable* new_target_; | 890 Variable* new_target_; |
873 // Convenience variable; function scopes only. | 891 // Convenience variable; function scopes only. |
874 Variable* arguments_; | 892 Variable* arguments_; |
875 // Convenience variable; Subclass constructor only | 893 |
876 Variable* this_function_; | 894 struct RareData : public ZoneObject { |
895 void* operator new(size_t size, Zone* zone) { return zone->New(size); } | |
caitp
2017/02/10 09:38:23
Okay, here's a "RareData" solution... it does pote
| |
896 | |
897 // Convenience variable; Subclass constructor only | |
898 Variable* this_function = nullptr; | |
899 | |
900 // Generator object, if any; generator function scopes and module scopes | |
901 // only. | |
902 Variable* generator_object = nullptr; | |
903 // Promise, if any; async function scopes only. | |
904 Variable* promise = nullptr; | |
905 }; | |
906 | |
907 enum class RareVariable { | |
908 kThisFunction = offsetof(RareData, this_function), | |
909 kGeneratorObject = offsetof(RareData, generator_object), | |
910 kPromise = offsetof(RareData, promise) | |
911 }; | |
912 | |
913 V8_INLINE RareData* EnsureRareData() { | |
914 if (rare_data_ == nullptr) { | |
915 rare_data_ = new (zone_) RareData; | |
916 } | |
917 return rare_data_; | |
918 } | |
919 | |
920 V8_INLINE Variable* GetRareVariable(RareVariable id) const { | |
921 if (rare_data_ == nullptr) return nullptr; | |
922 return *reinterpret_cast<Variable**>( | |
923 reinterpret_cast<uint8_t*>(rare_data_) + static_cast<ptrdiff_t>(id)); | |
924 } | |
925 | |
926 // Set `var` to null if it's non-null and Predicate (Variable*) -> bool | |
927 // returns true. | |
928 template <typename Predicate> | |
929 V8_INLINE void NullifyRareVariableIf(RareVariable id, Predicate predicate) { | |
930 if (V8_LIKELY(rare_data_ == nullptr)) return; | |
931 Variable** var = reinterpret_cast<Variable**>( | |
932 reinterpret_cast<uint8_t*>(rare_data_) + static_cast<ptrdiff_t>(id)); | |
933 if (*var && predicate(*var)) *var = nullptr; | |
934 } | |
935 | |
936 RareData* rare_data_ = nullptr; | |
877 }; | 937 }; |
878 | 938 |
879 class ModuleScope final : public DeclarationScope { | 939 class ModuleScope final : public DeclarationScope { |
880 public: | 940 public: |
881 ModuleScope(DeclarationScope* script_scope, | 941 ModuleScope(DeclarationScope* script_scope, |
882 AstValueFactory* ast_value_factory); | 942 AstValueFactory* ast_value_factory); |
883 | 943 |
884 // Deserialization. | 944 // Deserialization. |
885 // The generated ModuleDescriptor does not preserve all information. In | 945 // The generated ModuleDescriptor does not preserve all information. In |
886 // particular, its module_requests map will be empty because we no longer need | 946 // particular, its module_requests map will be empty because we no longer need |
(...skipping 11 matching lines...) Expand all Loading... | |
898 void AllocateModuleVariables(); | 958 void AllocateModuleVariables(); |
899 | 959 |
900 private: | 960 private: |
901 ModuleDescriptor* module_descriptor_; | 961 ModuleDescriptor* module_descriptor_; |
902 }; | 962 }; |
903 | 963 |
904 } // namespace internal | 964 } // namespace internal |
905 } // namespace v8 | 965 } // namespace v8 |
906 | 966 |
907 #endif // V8_AST_SCOPES_H_ | 967 #endif // V8_AST_SCOPES_H_ |
OLD | NEW |