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 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
459 // Generate AST node that throws a TypeError with the given | 459 // Generate AST node that throws a TypeError with the given |
460 // type. Both arguments must be non-null (in the handle sense). | 460 // type. Both arguments must be non-null (in the handle sense). |
461 Expression* NewThrowTypeError(MessageTemplate::Template message, | 461 Expression* NewThrowTypeError(MessageTemplate::Template message, |
462 const AstRawString* arg, int pos); | 462 const AstRawString* arg, int pos); |
463 | 463 |
464 // Generic AST generator for throwing errors from compiled code. | 464 // Generic AST generator for throwing errors from compiled code. |
465 Expression* NewThrowError(Runtime::FunctionId function_id, | 465 Expression* NewThrowError(Runtime::FunctionId function_id, |
466 MessageTemplate::Template message, | 466 MessageTemplate::Template message, |
467 const AstRawString* arg, int pos); | 467 const AstRawString* arg, int pos); |
468 | 468 |
469 void FinalizeIteratorUse(Variable* completion, Expression* condition, | |
470 Variable* iter, Block* iterator_use, Block* result); | |
471 | |
469 Statement* FinalizeForOfStatement(ForOfStatement* loop, int pos); | 472 Statement* FinalizeForOfStatement(ForOfStatement* loop, int pos); |
470 | 473 |
471 // Reporting errors. | 474 // Reporting errors. |
472 void ReportMessageAt(Scanner::Location source_location, | 475 void ReportMessageAt(Scanner::Location source_location, |
473 MessageTemplate::Template message, | 476 MessageTemplate::Template message, |
474 const char* arg = NULL, | 477 const char* arg = NULL, |
475 ParseErrorType error_type = kSyntaxError); | 478 ParseErrorType error_type = kSyntaxError); |
476 void ReportMessage(MessageTemplate::Template message, const char* arg = NULL, | 479 void ReportMessage(MessageTemplate::Template message, const char* arg = NULL, |
477 ParseErrorType error_type = kSyntaxError); | 480 ParseErrorType error_type = kSyntaxError); |
478 void ReportMessage(MessageTemplate::Template message, const AstRawString* arg, | 481 void ReportMessage(MessageTemplate::Template message, const AstRawString* arg, |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
667 Expression* RewriteYieldStar( | 670 Expression* RewriteYieldStar( |
668 Expression* generator, Expression* expression, int pos); | 671 Expression* generator, Expression* expression, int pos); |
669 | 672 |
670 Expression* RewriteInstanceof(Expression* lhs, Expression* rhs, int pos); | 673 Expression* RewriteInstanceof(Expression* lhs, Expression* rhs, int pos); |
671 | 674 |
672 private: | 675 private: |
673 Parser* parser_; | 676 Parser* parser_; |
674 | 677 |
675 void BuildIteratorClose(ZoneList<Statement*>* statements, Variable* iterator, | 678 void BuildIteratorClose(ZoneList<Statement*>* statements, Variable* iterator, |
676 Maybe<Variable*> input, Variable* output); | 679 Maybe<Variable*> input, Variable* output); |
680 | |
677 void BuildIteratorCloseForCompletion( | 681 void BuildIteratorCloseForCompletion( |
678 ZoneList<Statement*>* statements, Variable* iterator, | 682 ZoneList<Statement*>* statements, Variable* iterator, |
679 Variable* body_threw); | 683 Variable* completion); |
684 | |
680 Statement* CheckCallable(Variable* var, Expression* error); | 685 Statement* CheckCallable(Variable* var, Expression* error); |
681 }; | 686 }; |
682 | 687 |
683 | 688 |
684 class Parser : public ParserBase<ParserTraits> { | 689 class Parser : public ParserBase<ParserTraits> { |
685 public: | 690 public: |
686 explicit Parser(ParseInfo* info); | 691 explicit Parser(ParseInfo* info); |
687 ~Parser() { | 692 ~Parser() { |
688 delete reusable_preparser_; | 693 delete reusable_preparser_; |
689 reusable_preparser_ = NULL; | 694 reusable_preparser_ = NULL; |
690 delete cached_parse_data_; | 695 delete cached_parse_data_; |
691 cached_parse_data_ = NULL; | 696 cached_parse_data_ = NULL; |
692 } | 697 } |
693 | 698 |
694 // Parses the source code represented by the compilation info and sets its | 699 // Parses the source code represented by the compilation info and sets its |
695 // function literal. Returns false (and deallocates any allocated AST | 700 // function literal. Returns false (and deallocates any allocated AST |
696 // nodes) if parsing failed. | 701 // nodes) if parsing failed. |
697 static bool ParseStatic(ParseInfo* info); | 702 static bool ParseStatic(ParseInfo* info); |
698 bool Parse(ParseInfo* info); | 703 bool Parse(ParseInfo* info); |
699 void ParseOnBackground(ParseInfo* info); | 704 void ParseOnBackground(ParseInfo* info); |
700 | 705 |
701 // Handle errors detected during parsing, move statistics to Isolate, | 706 // Handle errors detected during parsing, move statistics to Isolate, |
702 // internalize strings (move them to the heap). | 707 // internalize strings (move them to the heap). |
703 void Internalize(Isolate* isolate, Handle<Script> script, bool error); | 708 void Internalize(Isolate* isolate, Handle<Script> script, bool error); |
704 void HandleSourceURLComments(Isolate* isolate, Handle<Script> script); | 709 void HandleSourceURLComments(Isolate* isolate, Handle<Script> script); |
705 | 710 |
711 // Runtime encoding of different completion modes. | |
712 enum CompletionKind { | |
adamk
2016/03/07 20:28:05
Can you make this an enum class? Otherwise you've
neis
2016/03/08 13:40:10
If I make it an enum class, then instead of eg NOR
adamk
2016/03/08 18:41:13
Oh, I forgot about that bit. The thing that bother
| |
713 NORMAL = 0, | |
714 THROW = 1, | |
715 BREAK = 2, | |
716 CONTINUE = 4, | |
717 RETURN = 8, | |
718 ABRUPT = THROW | BREAK | CONTINUE | RETURN | |
adamk
2016/03/07 20:28:05
Besides this line, do you actually use this enum a
neis
2016/03/08 13:40:10
Alright, changed it back to three values.
| |
719 }; | |
720 | |
706 private: | 721 private: |
707 friend class ParserTraits; | 722 friend class ParserTraits; |
708 | 723 |
709 // Limit the allowed number of local variables in a function. The hard limit | 724 // Limit the allowed number of local variables in a function. The hard limit |
710 // is that offsets computed by FullCodeGenerator::StackOperand and similar | 725 // is that offsets computed by FullCodeGenerator::StackOperand and similar |
711 // functions are ints, and they should not overflow. In addition, accessing | 726 // functions are ints, and they should not overflow. In addition, accessing |
712 // local variables creates user-controlled constants in the generated code, | 727 // local variables creates user-controlled constants in the generated code, |
713 // and we don't want too much user-controlled memory inside the code (this was | 728 // and we don't want too much user-controlled memory inside the code (this was |
714 // the reason why this limit was introduced in the first place; see | 729 // the reason why this limit was introduced in the first place; see |
715 // https://codereview.chromium.org/7003030/ ). | 730 // https://codereview.chromium.org/7003030/ ). |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
910 CaseClause* ParseCaseClause(bool* default_seen_ptr, bool* ok); | 925 CaseClause* ParseCaseClause(bool* default_seen_ptr, bool* ok); |
911 Statement* ParseSwitchStatement(ZoneList<const AstRawString*>* labels, | 926 Statement* ParseSwitchStatement(ZoneList<const AstRawString*>* labels, |
912 bool* ok); | 927 bool* ok); |
913 DoWhileStatement* ParseDoWhileStatement(ZoneList<const AstRawString*>* labels, | 928 DoWhileStatement* ParseDoWhileStatement(ZoneList<const AstRawString*>* labels, |
914 bool* ok); | 929 bool* ok); |
915 WhileStatement* ParseWhileStatement(ZoneList<const AstRawString*>* labels, | 930 WhileStatement* ParseWhileStatement(ZoneList<const AstRawString*>* labels, |
916 bool* ok); | 931 bool* ok); |
917 Statement* ParseForStatement(ZoneList<const AstRawString*>* labels, bool* ok); | 932 Statement* ParseForStatement(ZoneList<const AstRawString*>* labels, bool* ok); |
918 Statement* ParseThrowStatement(bool* ok); | 933 Statement* ParseThrowStatement(bool* ok); |
919 Expression* MakeCatchContext(Handle<String> id, VariableProxy* value); | 934 Expression* MakeCatchContext(Handle<String> id, VariableProxy* value); |
935 | |
920 class DontCollectExpressionsInTailPositionScope; | 936 class DontCollectExpressionsInTailPositionScope; |
921 class CollectExpressionsInTailPositionToListScope; | 937 class CollectExpressionsInTailPositionToListScope; |
922 TryStatement* ParseTryStatement(bool* ok); | 938 TryStatement* ParseTryStatement(bool* ok); |
923 DebuggerStatement* ParseDebuggerStatement(bool* ok); | 939 DebuggerStatement* ParseDebuggerStatement(bool* ok); |
924 // Parse a SubStatement in strict mode, or with an extra block scope in | 940 // Parse a SubStatement in strict mode, or with an extra block scope in |
925 // sloppy mode to handle | 941 // sloppy mode to handle |
926 // ES#sec-functiondeclarations-in-ifstatement-statement-clauses | 942 // ES#sec-functiondeclarations-in-ifstatement-statement-clauses |
927 // The legacy parameter indicates whether function declarations are | 943 // The legacy parameter indicates whether function declarations are |
928 // banned by the ES2015 specification in this location, and they are being | 944 // banned by the ES2015 specification in this location, and they are being |
929 // permitted here to match previous V8 behavior. | 945 // permitted here to match previous V8 behavior. |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1238 | 1254 |
1239 DoExpression* ParserTraits::ParseDoExpression(bool* ok) { | 1255 DoExpression* ParserTraits::ParseDoExpression(bool* ok) { |
1240 return parser_->ParseDoExpression(ok); | 1256 return parser_->ParseDoExpression(ok); |
1241 } | 1257 } |
1242 | 1258 |
1243 | 1259 |
1244 } // namespace internal | 1260 } // namespace internal |
1245 } // namespace v8 | 1261 } // namespace v8 |
1246 | 1262 |
1247 #endif // V8_PARSING_PARSER_H_ | 1263 #endif // V8_PARSING_PARSER_H_ |
OLD | NEW |