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 { | |
rossberg
2015/05/11 11:49:33
Can we call this PatternRewriter? It isn't a "matc
Dmitry Lomov (no reviews)
2015/05/11 12:52:58
Oh, good trick - I didn't realize it is allowed in
| |
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; | |
rossberg
2015/05/11 11:49:33
I think this function is not very meaningful as an
Dmitry Lomov (no reviews)
2015/05/11 12:52:57
Done.
| |
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 |