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_PARSER_H_ | 5 #ifndef V8_PARSER_H_ |
6 #define V8_PARSER_H_ | 6 #define V8_PARSER_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/ast.h" | 9 #include "src/ast.h" |
10 #include "src/compiler.h" // TODO(titzer): remove this include dependency | 10 #include "src/compiler.h" // TODO(titzer): remove this include dependency |
(...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
930 bool* ok); | 930 bool* ok); |
931 Statement* ParseFunctionDeclaration(ZoneList<const AstRawString*>* names, | 931 Statement* ParseFunctionDeclaration(ZoneList<const AstRawString*>* names, |
932 bool* ok); | 932 bool* ok); |
933 Statement* ParseClassDeclaration(ZoneList<const AstRawString*>* names, | 933 Statement* ParseClassDeclaration(ZoneList<const AstRawString*>* names, |
934 bool* ok); | 934 bool* ok); |
935 Statement* ParseNativeDeclaration(bool* ok); | 935 Statement* ParseNativeDeclaration(bool* ok); |
936 Block* ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok); | 936 Block* ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok); |
937 Block* ParseVariableStatement(VariableDeclarationContext var_context, | 937 Block* ParseVariableStatement(VariableDeclarationContext var_context, |
938 ZoneList<const AstRawString*>* names, | 938 ZoneList<const AstRawString*>* names, |
939 bool* ok); | 939 bool* ok); |
| 940 |
| 941 |
| 942 class PatternMatcher : private AstVisitor { |
| 943 public: |
| 944 struct DeclarationDescriptor { |
| 945 Parser* parser; |
| 946 Scope* declaration_scope; |
| 947 Scope* scope; |
| 948 int initializer_position; |
| 949 VariableMode mode; |
| 950 ZoneList<const AstRawString*>* names; |
| 951 bool is_const; |
| 952 Block* block; |
| 953 bool needs_init; |
| 954 int pos; |
| 955 Token::Value init_op; |
| 956 int* nvars; |
| 957 |
| 958 Scope* initialization_scope() const { |
| 959 return is_const ? declaration_scope : scope; |
| 960 } |
| 961 Zone* zone() const { return parser->zone(); } |
| 962 bool inside_with() const { return parser->inside_with(); } |
| 963 }; |
| 964 |
| 965 explicit PatternMatcher(const DeclarationDescriptor* decl, |
| 966 Expression* pattern) |
| 967 : decl_(decl), pattern_(pattern) {} |
| 968 |
| 969 PatternMatcher() : decl_(nullptr), pattern_(nullptr) {} |
| 970 |
| 971 bool IsSingleVariableBinding() const; |
| 972 const AstRawString* SingleName() const; |
| 973 |
| 974 void DeclareAndInitializeVariables(Expression* value, bool* ok); |
| 975 |
| 976 private: |
| 977 #define DECLARE_VISIT(type) void Visit##type(v8::internal::type* node) override; |
| 978 // Visiting functions for AST nodes make this an AstVisitor. |
| 979 AST_NODE_LIST(DECLARE_VISIT) |
| 980 #undef DECLARE_VISIT |
| 981 virtual void Visit(AstNode* node) override; |
| 982 |
| 983 void RecurseIntoSubpattern(AstNode* pattern, Expression* value) { |
| 984 Expression* old_value = current_value_; |
| 985 current_value_ = value; |
| 986 pattern->Accept(this); |
| 987 current_value_ = old_value; |
| 988 } |
| 989 |
| 990 AstNodeFactory* factory() const { return decl_->parser->factory(); } |
| 991 AstValueFactory* ast_value_factory() const { |
| 992 return decl_->parser->ast_value_factory(); |
| 993 } |
| 994 Zone* zone() const { return decl_->parser->zone(); } |
| 995 |
| 996 const DeclarationDescriptor* decl_; |
| 997 Expression* pattern_; |
| 998 Expression* current_value_; |
| 999 bool* ok_; |
| 1000 }; |
| 1001 |
| 1002 |
940 Block* ParseVariableDeclarations(VariableDeclarationContext var_context, | 1003 Block* ParseVariableDeclarations(VariableDeclarationContext var_context, |
941 int* num_decl, | 1004 int* num_decl, |
942 ZoneList<const AstRawString*>* names, | 1005 ZoneList<const AstRawString*>* names, |
943 const AstRawString** out, | 1006 const AstRawString** out, |
944 Scanner::Location* first_initializer_loc, | 1007 Scanner::Location* first_initializer_loc, |
945 Scanner::Location* bindings_loc, bool* ok); | 1008 Scanner::Location* bindings_loc, bool* ok); |
946 Statement* ParseExpressionOrLabelledStatement( | 1009 Statement* ParseExpressionOrLabelledStatement( |
947 ZoneList<const AstRawString*>* labels, bool* ok); | 1010 ZoneList<const AstRawString*>* labels, bool* ok); |
948 IfStatement* ParseIfStatement(ZoneList<const AstRawString*>* labels, | 1011 IfStatement* ParseIfStatement(ZoneList<const AstRawString*>* labels, |
949 bool* ok); | 1012 bool* ok); |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1178 } | 1241 } |
1179 | 1242 |
1180 | 1243 |
1181 Expression* ParserTraits::SpreadCallNew( | 1244 Expression* ParserTraits::SpreadCallNew( |
1182 Expression* function, ZoneList<v8::internal::Expression*>* args, int pos) { | 1245 Expression* function, ZoneList<v8::internal::Expression*>* args, int pos) { |
1183 return parser_->SpreadCallNew(function, args, pos); | 1246 return parser_->SpreadCallNew(function, args, pos); |
1184 } | 1247 } |
1185 } } // namespace v8::internal | 1248 } } // namespace v8::internal |
1186 | 1249 |
1187 #endif // V8_PARSER_H_ | 1250 #endif // V8_PARSER_H_ |
OLD | NEW |