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_PARSING_PARSER_H_ | 5 #ifndef V8_PARSING_PARSER_H_ |
6 #define V8_PARSING_PARSER_H_ | 6 #define V8_PARSING_PARSER_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
10 #include "src/ast/scopes.h" | 10 #include "src/ast/scopes.h" |
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 // Odd-ball literal creators. | 500 // Odd-ball literal creators. |
501 Literal* GetLiteralTheHole(int position, AstNodeFactory* factory); | 501 Literal* GetLiteralTheHole(int position, AstNodeFactory* factory); |
502 | 502 |
503 // Producing data during the recursive descent. | 503 // Producing data during the recursive descent. |
504 const AstRawString* GetSymbol(Scanner* scanner); | 504 const AstRawString* GetSymbol(Scanner* scanner); |
505 const AstRawString* GetNextSymbol(Scanner* scanner); | 505 const AstRawString* GetNextSymbol(Scanner* scanner); |
506 const AstRawString* GetNumberAsSymbol(Scanner* scanner); | 506 const AstRawString* GetNumberAsSymbol(Scanner* scanner); |
507 | 507 |
508 Expression* ThisExpression(Scope* scope, AstNodeFactory* factory, | 508 Expression* ThisExpression(Scope* scope, AstNodeFactory* factory, |
509 int pos = kNoSourcePosition); | 509 int pos = kNoSourcePosition); |
510 Expression* SuperPropertyReference(Scope* scope, AstNodeFactory* factory, | 510 Expression* NewSuperPropertyReference(Scope* scope, AstNodeFactory* factory, |
511 int pos); | 511 int pos); |
512 Expression* SuperCallReference(Scope* scope, AstNodeFactory* factory, | 512 Expression* NewSuperCallReference(Scope* scope, AstNodeFactory* factory, |
513 int pos); | 513 int pos); |
514 Expression* NewTargetExpression(Scope* scope, AstNodeFactory* factory, | 514 Expression* NewTargetExpression(Scope* scope, AstNodeFactory* factory, |
515 int pos); | 515 int pos); |
516 Expression* FunctionSentExpression(Scope* scope, AstNodeFactory* factory, | 516 Expression* FunctionSentExpression(Scope* scope, AstNodeFactory* factory, |
517 int pos); | 517 int pos); |
518 Literal* ExpressionFromLiteral(Token::Value token, int pos, Scanner* scanner, | 518 Literal* ExpressionFromLiteral(Token::Value token, int pos, Scanner* scanner, |
519 AstNodeFactory* factory); | 519 AstNodeFactory* factory); |
520 Expression* ExpressionFromIdentifier(const AstRawString* name, | 520 Expression* ExpressionFromIdentifier(const AstRawString* name, |
521 int start_position, int end_position, | 521 int start_position, int end_position, |
522 Scope* scope, AstNodeFactory* factory); | 522 Scope* scope, AstNodeFactory* factory); |
523 Expression* ExpressionFromString(int pos, Scanner* scanner, | 523 Expression* ExpressionFromString(int pos, Scanner* scanner, |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
833 | 833 |
834 Block* BuildInitializationBlock(ZoneList<const AstRawString*>* names, | 834 Block* BuildInitializationBlock(ZoneList<const AstRawString*>* names, |
835 bool* ok); | 835 bool* ok); |
836 | 836 |
837 DeclarationDescriptor descriptor; | 837 DeclarationDescriptor descriptor; |
838 List<Declaration> declarations; | 838 List<Declaration> declarations; |
839 Scanner::Location first_initializer_loc; | 839 Scanner::Location first_initializer_loc; |
840 Scanner::Location bindings_loc; | 840 Scanner::Location bindings_loc; |
841 }; | 841 }; |
842 | 842 |
843 class PatternRewriter : private AstVisitor { | 843 class PatternRewriter final : private AstVisitor<PatternRewriter> { |
844 public: | 844 public: |
845 static void DeclareAndInitializeVariables( | 845 static void DeclareAndInitializeVariables( |
846 Block* block, const DeclarationDescriptor* declaration_descriptor, | 846 Block* block, const DeclarationDescriptor* declaration_descriptor, |
847 const DeclarationParsingResult::Declaration* declaration, | 847 const DeclarationParsingResult::Declaration* declaration, |
848 ZoneList<const AstRawString*>* names, bool* ok); | 848 ZoneList<const AstRawString*>* names, bool* ok); |
849 | 849 |
850 static void RewriteDestructuringAssignment(Parser* parser, | 850 static void RewriteDestructuringAssignment(Parser* parser, |
851 RewritableExpression* expr, | 851 RewritableExpression* expr, |
852 Scope* Scope); | 852 Scope* Scope); |
853 | 853 |
854 static Expression* RewriteDestructuringAssignment(Parser* parser, | 854 static Expression* RewriteDestructuringAssignment(Parser* parser, |
855 Assignment* assignment, | 855 Assignment* assignment, |
856 Scope* scope); | 856 Scope* scope); |
857 | 857 |
858 private: | 858 private: |
859 PatternRewriter() {} | 859 PatternRewriter() {} |
860 | 860 |
861 #define DECLARE_VISIT(type) void Visit##type(v8::internal::type* node) override; | 861 #define DECLARE_VISIT(type) void Visit##type(v8::internal::type* node); |
862 // Visiting functions for AST nodes make this an AstVisitor. | 862 // Visiting functions for AST nodes make this an AstVisitor. |
863 AST_NODE_LIST(DECLARE_VISIT) | 863 AST_NODE_LIST(DECLARE_VISIT) |
864 #undef DECLARE_VISIT | 864 #undef DECLARE_VISIT |
865 void Visit(AstNode* node) override; | |
866 | 865 |
867 enum PatternContext { | 866 enum PatternContext { |
868 BINDING, | 867 BINDING, |
869 INITIALIZER, | 868 INITIALIZER, |
870 ASSIGNMENT, | 869 ASSIGNMENT, |
871 ASSIGNMENT_INITIALIZER | 870 ASSIGNMENT_INITIALIZER |
872 }; | 871 }; |
873 | 872 |
874 PatternContext context() const { return context_; } | 873 PatternContext context() const { return context_; } |
875 void set_context(PatternContext context) { context_ = context; } | 874 void set_context(PatternContext context) { context_ = context; } |
876 | 875 |
877 void RecurseIntoSubpattern(AstNode* pattern, Expression* value) { | 876 void RecurseIntoSubpattern(AstNode* pattern, Expression* value) { |
878 Expression* old_value = current_value_; | 877 Expression* old_value = current_value_; |
879 current_value_ = value; | 878 current_value_ = value; |
880 recursion_level_++; | 879 recursion_level_++; |
881 pattern->Accept(this); | 880 Visit(pattern); |
882 recursion_level_--; | 881 recursion_level_--; |
883 current_value_ = old_value; | 882 current_value_ = old_value; |
884 } | 883 } |
885 | 884 |
886 void VisitObjectLiteral(ObjectLiteral* node, Variable** temp_var); | 885 void VisitObjectLiteral(ObjectLiteral* node, Variable** temp_var); |
887 void VisitArrayLiteral(ArrayLiteral* node, Variable** temp_var); | 886 void VisitArrayLiteral(ArrayLiteral* node, Variable** temp_var); |
888 | 887 |
889 bool IsBindingContext() const { return IsBindingContext(context_); } | 888 bool IsBindingContext() const { return IsBindingContext(context_); } |
890 bool IsInitializerContext() const { return context_ != ASSIGNMENT; } | 889 bool IsInitializerContext() const { return context_ != ASSIGNMENT; } |
891 bool IsAssignmentContext() const { return IsAssignmentContext(context_); } | 890 bool IsAssignmentContext() const { return IsAssignmentContext(context_); } |
(...skipping 18 matching lines...) Expand all Loading... |
910 Parser* parser_; | 909 Parser* parser_; |
911 PatternContext context_; | 910 PatternContext context_; |
912 Expression* pattern_; | 911 Expression* pattern_; |
913 int initializer_position_; | 912 int initializer_position_; |
914 Block* block_; | 913 Block* block_; |
915 const DeclarationDescriptor* descriptor_; | 914 const DeclarationDescriptor* descriptor_; |
916 ZoneList<const AstRawString*>* names_; | 915 ZoneList<const AstRawString*>* names_; |
917 Expression* current_value_; | 916 Expression* current_value_; |
918 int recursion_level_; | 917 int recursion_level_; |
919 bool* ok_; | 918 bool* ok_; |
| 919 |
| 920 DEFINE_AST_VISITOR_MEMBERS_WITHOUT_STACKOVERFLOW() |
920 }; | 921 }; |
921 | 922 |
922 Block* ParseVariableDeclarations(VariableDeclarationContext var_context, | 923 Block* ParseVariableDeclarations(VariableDeclarationContext var_context, |
923 DeclarationParsingResult* parsing_result, | 924 DeclarationParsingResult* parsing_result, |
924 ZoneList<const AstRawString*>* names, | 925 ZoneList<const AstRawString*>* names, |
925 bool* ok); | 926 bool* ok); |
926 Statement* ParseExpressionOrLabelledStatement( | 927 Statement* ParseExpressionOrLabelledStatement( |
927 ZoneList<const AstRawString*>* labels, | 928 ZoneList<const AstRawString*>* labels, |
928 AllowLabelledFunctionStatement allow_function, bool* ok); | 929 AllowLabelledFunctionStatement allow_function, bool* ok); |
929 IfStatement* ParseIfStatement(ZoneList<const AstRawString*>* labels, | 930 IfStatement* ParseIfStatement(ZoneList<const AstRawString*>* labels, |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1298 | 1299 |
1299 DoExpression* ParserTraits::ParseDoExpression(bool* ok) { | 1300 DoExpression* ParserTraits::ParseDoExpression(bool* ok) { |
1300 return parser_->ParseDoExpression(ok); | 1301 return parser_->ParseDoExpression(ok); |
1301 } | 1302 } |
1302 | 1303 |
1303 | 1304 |
1304 } // namespace internal | 1305 } // namespace internal |
1305 } // namespace v8 | 1306 } // namespace v8 |
1306 | 1307 |
1307 #endif // V8_PARSING_PARSER_H_ | 1308 #endif // V8_PARSING_PARSER_H_ |
OLD | NEW |