| 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_PREPARSER_H | 5 #ifndef V8_PREPARSER_H |
| 6 #define V8_PREPARSER_H | 6 #define V8_PREPARSER_H |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
| 11 #include "src/expression-classifier.h" |
| 11 #include "src/func-name-inferrer.h" | 12 #include "src/func-name-inferrer.h" |
| 12 #include "src/hashmap.h" | 13 #include "src/hashmap.h" |
| 13 #include "src/messages.h" | 14 #include "src/messages.h" |
| 14 #include "src/scanner.h" | 15 #include "src/scanner.h" |
| 15 #include "src/scopes.h" | 16 #include "src/scopes.h" |
| 16 #include "src/token.h" | 17 #include "src/token.h" |
| 17 | 18 |
| 18 namespace v8 { | 19 namespace v8 { |
| 19 namespace internal { | 20 namespace internal { |
| 20 | 21 |
| 21 | |
| 22 // Common base class shared between parser and pre-parser. Traits encapsulate | 22 // Common base class shared between parser and pre-parser. Traits encapsulate |
| 23 // the differences between Parser and PreParser: | 23 // the differences between Parser and PreParser: |
| 24 | 24 |
| 25 // - Return types: For example, Parser functions return Expression* and | 25 // - Return types: For example, Parser functions return Expression* and |
| 26 // PreParser functions return PreParserExpression. | 26 // PreParser functions return PreParserExpression. |
| 27 | 27 |
| 28 // - Creating parse tree nodes: Parser generates an AST during the recursive | 28 // - Creating parse tree nodes: Parser generates an AST during the recursive |
| 29 // descent. PreParser doesn't create a tree. Instead, it passes around minimal | 29 // descent. PreParser doesn't create a tree. Instead, it passes around minimal |
| 30 // data objects (PreParserExpression, PreParserIdentifier etc.) which contain | 30 // data objects (PreParserExpression, PreParserIdentifier etc.) which contain |
| 31 // just enough data for the upper layer functions. PreParserFactory is | 31 // just enough data for the upper layer functions. PreParserFactory is |
| (...skipping 15 matching lines...) Expand all Loading... |
| 47 // // Return types for traversing functions. | 47 // // Return types for traversing functions. |
| 48 // typedef Identifier; | 48 // typedef Identifier; |
| 49 // typedef Expression; | 49 // typedef Expression; |
| 50 // typedef FunctionLiteral; | 50 // typedef FunctionLiteral; |
| 51 // typedef ClassLiteral; | 51 // typedef ClassLiteral; |
| 52 // typedef ObjectLiteralProperty; | 52 // typedef ObjectLiteralProperty; |
| 53 // typedef Literal; | 53 // typedef Literal; |
| 54 // typedef ExpressionList; | 54 // typedef ExpressionList; |
| 55 // typedef PropertyList; | 55 // typedef PropertyList; |
| 56 // typedef FormalParameter; | 56 // typedef FormalParameter; |
| 57 // typedef FormalParameterScope; | |
| 58 // // For constructing objects returned by the traversing functions. | 57 // // For constructing objects returned by the traversing functions. |
| 59 // typedef Factory; | 58 // typedef Factory; |
| 60 // }; | 59 // }; |
| 61 // // ... | 60 // // ... |
| 62 // }; | 61 // }; |
| 63 | 62 |
| 64 template <typename Traits> | 63 template <typename Traits> |
| 65 class ParserBase : public Traits { | 64 class ParserBase : public Traits { |
| 66 public: | 65 public: |
| 67 // Shorten type names defined by Traits. | 66 // Shorten type names defined by Traits. |
| 68 typedef typename Traits::Type::Expression ExpressionT; | 67 typedef typename Traits::Type::Expression ExpressionT; |
| 69 typedef typename Traits::Type::Identifier IdentifierT; | 68 typedef typename Traits::Type::Identifier IdentifierT; |
| 70 typedef typename Traits::Type::FormalParameter FormalParameterT; | 69 typedef typename Traits::Type::FormalParameter FormalParameterT; |
| 71 typedef typename Traits::Type::FormalParameterScope FormalParameterScopeT; | |
| 72 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; | 70 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; |
| 73 typedef typename Traits::Type::Literal LiteralT; | 71 typedef typename Traits::Type::Literal LiteralT; |
| 74 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; | 72 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; |
| 75 | 73 |
| 76 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, | 74 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, |
| 77 v8::Extension* extension, AstValueFactory* ast_value_factory, | 75 v8::Extension* extension, AstValueFactory* ast_value_factory, |
| 78 ParserRecorder* log, typename Traits::Type::Parser this_object) | 76 ParserRecorder* log, typename Traits::Type::Parser this_object) |
| 79 : Traits(this_object), | 77 : Traits(this_object), |
| 80 parenthesized_function_(false), | 78 parenthesized_function_(false), |
| 81 scope_(NULL), | 79 scope_(NULL), |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 void ReportMessageAt(Scanner::Location location, | 497 void ReportMessageAt(Scanner::Location location, |
| 500 MessageTemplate::Template message, | 498 MessageTemplate::Template message, |
| 501 ParseErrorType error_type = kSyntaxError) { | 499 ParseErrorType error_type = kSyntaxError) { |
| 502 Traits::ReportMessageAt(location, message, reinterpret_cast<const char*>(0), | 500 Traits::ReportMessageAt(location, message, reinterpret_cast<const char*>(0), |
| 503 error_type); | 501 error_type); |
| 504 } | 502 } |
| 505 | 503 |
| 506 void ReportUnexpectedToken(Token::Value token); | 504 void ReportUnexpectedToken(Token::Value token); |
| 507 void ReportUnexpectedTokenAt(Scanner::Location location, Token::Value token); | 505 void ReportUnexpectedTokenAt(Scanner::Location location, Token::Value token); |
| 508 | 506 |
| 509 class ExpressionClassifier { | |
| 510 public: | |
| 511 struct Error { | |
| 512 Error() | |
| 513 : location(Scanner::Location::invalid()), | |
| 514 message(MessageTemplate::kNone), | |
| 515 arg(nullptr) {} | |
| 516 | 507 |
| 517 Scanner::Location location; | 508 void ReportClassifierError(const ExpressionClassifier::Error& error) { |
| 518 MessageTemplate::Template message; | |
| 519 const char* arg; | |
| 520 }; | |
| 521 | |
| 522 enum TargetProduction { | |
| 523 ExpressionProduction = 1 << 0, | |
| 524 BindingPatternProduction = 1 << 1, | |
| 525 AssignmentPatternProduction = 1 << 2, | |
| 526 DistinctFormalParametersProduction = 1 << 3, | |
| 527 StrictModeFormalParametersProduction = 1 << 4, | |
| 528 StrongModeFormalParametersProduction = 1 << 5, | |
| 529 ArrowFormalParametersProduction = 1 << 6, | |
| 530 | |
| 531 PatternProductions = | |
| 532 (BindingPatternProduction | AssignmentPatternProduction), | |
| 533 FormalParametersProductions = (DistinctFormalParametersProduction | | |
| 534 StrictModeFormalParametersProduction | | |
| 535 StrongModeFormalParametersProduction), | |
| 536 StandardProductions = ExpressionProduction | PatternProductions, | |
| 537 AllProductions = (StandardProductions | FormalParametersProductions | | |
| 538 ArrowFormalParametersProduction) | |
| 539 }; | |
| 540 | |
| 541 ExpressionClassifier() : invalid_productions_(0) {} | |
| 542 | |
| 543 bool is_valid(unsigned productions) const { | |
| 544 return (invalid_productions_ & productions) == 0; | |
| 545 } | |
| 546 | |
| 547 bool is_valid_expression() const { return is_valid(ExpressionProduction); } | |
| 548 | |
| 549 bool is_valid_binding_pattern() const { | |
| 550 return is_valid(BindingPatternProduction); | |
| 551 } | |
| 552 | |
| 553 bool is_valid_assignment_pattern() const { | |
| 554 return is_valid(AssignmentPatternProduction); | |
| 555 } | |
| 556 | |
| 557 bool is_valid_arrow_formal_parameters() const { | |
| 558 return is_valid(ArrowFormalParametersProduction); | |
| 559 } | |
| 560 | |
| 561 bool is_valid_formal_parameter_list_without_duplicates() const { | |
| 562 return is_valid(DistinctFormalParametersProduction); | |
| 563 } | |
| 564 | |
| 565 // Note: callers should also check | |
| 566 // is_valid_formal_parameter_list_without_duplicates(). | |
| 567 bool is_valid_strict_mode_formal_parameters() const { | |
| 568 return is_valid(StrictModeFormalParametersProduction); | |
| 569 } | |
| 570 | |
| 571 // Note: callers should also check is_valid_strict_mode_formal_parameters() | |
| 572 // and is_valid_formal_parameter_list_without_duplicates(). | |
| 573 bool is_valid_strong_mode_formal_parameters() const { | |
| 574 return is_valid(StrongModeFormalParametersProduction); | |
| 575 } | |
| 576 | |
| 577 const Error& expression_error() const { return expression_error_; } | |
| 578 | |
| 579 const Error& binding_pattern_error() const { | |
| 580 return binding_pattern_error_; | |
| 581 } | |
| 582 | |
| 583 const Error& assignment_pattern_error() const { | |
| 584 return assignment_pattern_error_; | |
| 585 } | |
| 586 | |
| 587 const Error& arrow_formal_parameters_error() const { | |
| 588 return arrow_formal_parameters_error_; | |
| 589 } | |
| 590 | |
| 591 const Error& duplicate_formal_parameter_error() const { | |
| 592 return duplicate_formal_parameter_error_; | |
| 593 } | |
| 594 | |
| 595 const Error& strict_mode_formal_parameter_error() const { | |
| 596 return strict_mode_formal_parameter_error_; | |
| 597 } | |
| 598 | |
| 599 const Error& strong_mode_formal_parameter_error() const { | |
| 600 return strong_mode_formal_parameter_error_; | |
| 601 } | |
| 602 | |
| 603 void RecordExpressionError(const Scanner::Location& loc, | |
| 604 MessageTemplate::Template message, | |
| 605 const char* arg = nullptr) { | |
| 606 if (!is_valid_expression()) return; | |
| 607 invalid_productions_ |= ExpressionProduction; | |
| 608 expression_error_.location = loc; | |
| 609 expression_error_.message = message; | |
| 610 expression_error_.arg = arg; | |
| 611 } | |
| 612 | |
| 613 void RecordBindingPatternError(const Scanner::Location& loc, | |
| 614 MessageTemplate::Template message, | |
| 615 const char* arg = nullptr) { | |
| 616 if (!is_valid_binding_pattern()) return; | |
| 617 invalid_productions_ |= BindingPatternProduction; | |
| 618 binding_pattern_error_.location = loc; | |
| 619 binding_pattern_error_.message = message; | |
| 620 binding_pattern_error_.arg = arg; | |
| 621 } | |
| 622 | |
| 623 void RecordAssignmentPatternError(const Scanner::Location& loc, | |
| 624 MessageTemplate::Template message, | |
| 625 const char* arg = nullptr) { | |
| 626 if (!is_valid_assignment_pattern()) return; | |
| 627 invalid_productions_ |= AssignmentPatternProduction; | |
| 628 assignment_pattern_error_.location = loc; | |
| 629 assignment_pattern_error_.message = message; | |
| 630 assignment_pattern_error_.arg = arg; | |
| 631 } | |
| 632 | |
| 633 void RecordArrowFormalParametersError(const Scanner::Location& loc, | |
| 634 MessageTemplate::Template message, | |
| 635 const char* arg = nullptr) { | |
| 636 if (!is_valid_arrow_formal_parameters()) return; | |
| 637 invalid_productions_ |= ArrowFormalParametersProduction; | |
| 638 arrow_formal_parameters_error_.location = loc; | |
| 639 arrow_formal_parameters_error_.message = message; | |
| 640 arrow_formal_parameters_error_.arg = arg; | |
| 641 } | |
| 642 | |
| 643 void RecordDuplicateFormalParameterError(const Scanner::Location& loc) { | |
| 644 if (!is_valid_formal_parameter_list_without_duplicates()) return; | |
| 645 invalid_productions_ |= DistinctFormalParametersProduction; | |
| 646 duplicate_formal_parameter_error_.location = loc; | |
| 647 duplicate_formal_parameter_error_.message = | |
| 648 MessageTemplate::kStrictParamDupe; | |
| 649 duplicate_formal_parameter_error_.arg = nullptr; | |
| 650 } | |
| 651 | |
| 652 // Record a binding that would be invalid in strict mode. Confusingly this | |
| 653 // is not the same as StrictFormalParameterList, which simply forbids | |
| 654 // duplicate bindings. | |
| 655 void RecordStrictModeFormalParameterError(const Scanner::Location& loc, | |
| 656 MessageTemplate::Template message, | |
| 657 const char* arg = nullptr) { | |
| 658 if (!is_valid_strict_mode_formal_parameters()) return; | |
| 659 invalid_productions_ |= StrictModeFormalParametersProduction; | |
| 660 strict_mode_formal_parameter_error_.location = loc; | |
| 661 strict_mode_formal_parameter_error_.message = message; | |
| 662 strict_mode_formal_parameter_error_.arg = arg; | |
| 663 } | |
| 664 | |
| 665 void RecordStrongModeFormalParameterError(const Scanner::Location& loc, | |
| 666 MessageTemplate::Template message, | |
| 667 const char* arg = nullptr) { | |
| 668 if (!is_valid_strong_mode_formal_parameters()) return; | |
| 669 invalid_productions_ |= StrongModeFormalParametersProduction; | |
| 670 strong_mode_formal_parameter_error_.location = loc; | |
| 671 strong_mode_formal_parameter_error_.message = message; | |
| 672 strong_mode_formal_parameter_error_.arg = arg; | |
| 673 } | |
| 674 | |
| 675 void Accumulate(const ExpressionClassifier& inner, | |
| 676 unsigned productions = StandardProductions) { | |
| 677 // Propagate errors from inner, but don't overwrite already recorded | |
| 678 // errors. | |
| 679 unsigned non_arrow_inner_invalid_productions = | |
| 680 inner.invalid_productions_ & ~ArrowFormalParametersProduction; | |
| 681 if (non_arrow_inner_invalid_productions == 0) return; | |
| 682 unsigned non_arrow_productions = | |
| 683 productions & ~ArrowFormalParametersProduction; | |
| 684 unsigned errors = | |
| 685 non_arrow_productions & non_arrow_inner_invalid_productions; | |
| 686 errors &= ~invalid_productions_; | |
| 687 if (errors != 0) { | |
| 688 invalid_productions_ |= errors; | |
| 689 if (errors & ExpressionProduction) | |
| 690 expression_error_ = inner.expression_error_; | |
| 691 if (errors & BindingPatternProduction) | |
| 692 binding_pattern_error_ = inner.binding_pattern_error_; | |
| 693 if (errors & AssignmentPatternProduction) | |
| 694 assignment_pattern_error_ = inner.assignment_pattern_error_; | |
| 695 if (errors & DistinctFormalParametersProduction) | |
| 696 duplicate_formal_parameter_error_ = | |
| 697 inner.duplicate_formal_parameter_error_; | |
| 698 if (errors & StrictModeFormalParametersProduction) | |
| 699 strict_mode_formal_parameter_error_ = | |
| 700 inner.strict_mode_formal_parameter_error_; | |
| 701 if (errors & StrongModeFormalParametersProduction) | |
| 702 strong_mode_formal_parameter_error_ = | |
| 703 inner.strong_mode_formal_parameter_error_; | |
| 704 } | |
| 705 | |
| 706 // As an exception to the above, the result continues to be a valid arrow | |
| 707 // formal parameters if the inner expression is a valid binding pattern. | |
| 708 if (productions & ArrowFormalParametersProduction && | |
| 709 is_valid_arrow_formal_parameters() && | |
| 710 !inner.is_valid_binding_pattern()) { | |
| 711 invalid_productions_ |= ArrowFormalParametersProduction; | |
| 712 arrow_formal_parameters_error_ = inner.binding_pattern_error_; | |
| 713 } | |
| 714 } | |
| 715 | |
| 716 void AccumulateReclassifyingAsPattern(const ExpressionClassifier& inner) { | |
| 717 Accumulate(inner, AllProductions & ~PatternProductions); | |
| 718 if (!inner.is_valid_expression()) { | |
| 719 if (is_valid_binding_pattern()) { | |
| 720 binding_pattern_error_ = inner.expression_error(); | |
| 721 } | |
| 722 if (is_valid_assignment_pattern()) { | |
| 723 assignment_pattern_error_ = inner.expression_error(); | |
| 724 } | |
| 725 } | |
| 726 } | |
| 727 | |
| 728 private: | |
| 729 unsigned invalid_productions_; | |
| 730 Error expression_error_; | |
| 731 Error binding_pattern_error_; | |
| 732 Error assignment_pattern_error_; | |
| 733 Error arrow_formal_parameters_error_; | |
| 734 Error duplicate_formal_parameter_error_; | |
| 735 Error strict_mode_formal_parameter_error_; | |
| 736 Error strong_mode_formal_parameter_error_; | |
| 737 }; | |
| 738 | |
| 739 void ReportClassifierError( | |
| 740 const typename ExpressionClassifier::Error& error) { | |
| 741 Traits::ReportMessageAt(error.location, error.message, error.arg, | 509 Traits::ReportMessageAt(error.location, error.message, error.arg, |
| 742 kSyntaxError); | 510 kSyntaxError); |
| 743 } | 511 } |
| 744 | 512 |
| 745 void ValidateExpression(const ExpressionClassifier* classifier, bool* ok) { | 513 void ValidateExpression(const ExpressionClassifier* classifier, bool* ok) { |
| 746 if (!classifier->is_valid_expression()) { | 514 if (!classifier->is_valid_expression()) { |
| 747 ReportClassifierError(classifier->expression_error()); | 515 ReportClassifierError(classifier->expression_error()); |
| 748 *ok = false; | 516 *ok = false; |
| 749 } | 517 } |
| 750 } | 518 } |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 883 ExpressionClassifier* classifier, bool* ok); | 651 ExpressionClassifier* classifier, bool* ok); |
| 884 void AddTemplateExpression(ExpressionT); | 652 void AddTemplateExpression(ExpressionT); |
| 885 ExpressionT ParseSuperExpression(bool is_new, | 653 ExpressionT ParseSuperExpression(bool is_new, |
| 886 ExpressionClassifier* classifier, bool* ok); | 654 ExpressionClassifier* classifier, bool* ok); |
| 887 ExpressionT ParseNewTargetExpression(bool* ok); | 655 ExpressionT ParseNewTargetExpression(bool* ok); |
| 888 ExpressionT ParseStrongInitializationExpression( | 656 ExpressionT ParseStrongInitializationExpression( |
| 889 ExpressionClassifier* classifier, bool* ok); | 657 ExpressionClassifier* classifier, bool* ok); |
| 890 ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier, | 658 ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier, |
| 891 bool* ok); | 659 bool* ok); |
| 892 | 660 |
| 893 void ParseFormalParameter(FormalParameterScopeT* scope, bool is_rest, | 661 void ParseFormalParameter(Scope* scope, bool is_rest, |
| 894 ExpressionClassifier* classifier, bool* ok); | 662 ExpressionClassifier* classifier, bool* ok); |
| 895 int ParseFormalParameterList(FormalParameterScopeT* scope, bool* has_rest, | 663 int ParseFormalParameterList(Scope* scope, bool* has_rest, |
| 896 ExpressionClassifier* classifier, bool* ok); | 664 ExpressionClassifier* classifier, bool* ok); |
| 897 void CheckArityRestrictions( | 665 void CheckArityRestrictions( |
| 898 int param_count, FunctionLiteral::ArityRestriction arity_restriction, | 666 int param_count, FunctionLiteral::ArityRestriction arity_restriction, |
| 899 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok); | 667 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok); |
| 900 | 668 |
| 901 // Checks if the expression is a valid reference expression (e.g., on the | 669 // Checks if the expression is a valid reference expression (e.g., on the |
| 902 // left-hand side of assignments). Although ruled out by ECMA as early errors, | 670 // left-hand side of assignments). Although ruled out by ECMA as early errors, |
| 903 // we allow calls for web compatibility and rewrite them to a runtime throw. | 671 // we allow calls for web compatibility and rewrite them to a runtime throw. |
| 904 ExpressionT CheckAndRewriteReferenceExpression( | 672 ExpressionT CheckAndRewriteReferenceExpression( |
| 905 ExpressionT expression, Scanner::Location location, | 673 ExpressionT expression, Scanner::Location location, |
| (...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1502 typedef PreParserIdentifier Identifier; | 1270 typedef PreParserIdentifier Identifier; |
| 1503 typedef PreParserExpression Expression; | 1271 typedef PreParserExpression Expression; |
| 1504 typedef PreParserExpression YieldExpression; | 1272 typedef PreParserExpression YieldExpression; |
| 1505 typedef PreParserExpression FunctionLiteral; | 1273 typedef PreParserExpression FunctionLiteral; |
| 1506 typedef PreParserExpression ClassLiteral; | 1274 typedef PreParserExpression ClassLiteral; |
| 1507 typedef PreParserExpression ObjectLiteralProperty; | 1275 typedef PreParserExpression ObjectLiteralProperty; |
| 1508 typedef PreParserExpression Literal; | 1276 typedef PreParserExpression Literal; |
| 1509 typedef PreParserExpressionList ExpressionList; | 1277 typedef PreParserExpressionList ExpressionList; |
| 1510 typedef PreParserExpressionList PropertyList; | 1278 typedef PreParserExpressionList PropertyList; |
| 1511 typedef PreParserIdentifier FormalParameter; | 1279 typedef PreParserIdentifier FormalParameter; |
| 1512 typedef DuplicateFinder FormalParameterScope; | |
| 1513 typedef PreParserStatementList StatementList; | 1280 typedef PreParserStatementList StatementList; |
| 1514 | 1281 |
| 1515 // For constructing objects returned by the traversing functions. | 1282 // For constructing objects returned by the traversing functions. |
| 1516 typedef PreParserFactory Factory; | 1283 typedef PreParserFactory Factory; |
| 1517 }; | 1284 }; |
| 1518 | 1285 |
| 1519 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} | 1286 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} |
| 1520 | 1287 |
| 1521 // Helper functions for recursive descent. | 1288 // Helper functions for recursive descent. |
| 1522 static bool IsEval(PreParserIdentifier identifier) { | 1289 static bool IsEval(PreParserIdentifier identifier) { |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1781 return EmptyExpression(); | 1548 return EmptyExpression(); |
| 1782 } | 1549 } |
| 1783 inline void MaterializeTemplateCallsiteLiterals(); | 1550 inline void MaterializeTemplateCallsiteLiterals(); |
| 1784 PreParserExpression NoTemplateTag() { | 1551 PreParserExpression NoTemplateTag() { |
| 1785 return PreParserExpression::NoTemplateTag(); | 1552 return PreParserExpression::NoTemplateTag(); |
| 1786 } | 1553 } |
| 1787 static bool IsTaggedTemplate(const PreParserExpression tag) { | 1554 static bool IsTaggedTemplate(const PreParserExpression tag) { |
| 1788 return !tag.IsNoTemplateTag(); | 1555 return !tag.IsNoTemplateTag(); |
| 1789 } | 1556 } |
| 1790 | 1557 |
| 1791 V8_INLINE bool DeclareFormalParameter(DuplicateFinder* scope, | 1558 void DeclareFormalParameter(Scope* scope, PreParserIdentifier param, |
| 1792 PreParserIdentifier param, | 1559 ExpressionClassifier* classifier, bool is_rest) {} |
| 1793 bool is_rest); | |
| 1794 | 1560 |
| 1795 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {} | 1561 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {} |
| 1796 | 1562 |
| 1797 // Temporary glue; these functions will move to ParserBase. | 1563 // Temporary glue; these functions will move to ParserBase. |
| 1798 PreParserExpression ParseV8Intrinsic(bool* ok); | 1564 PreParserExpression ParseV8Intrinsic(bool* ok); |
| 1799 PreParserExpression ParseFunctionLiteral( | 1565 PreParserExpression ParseFunctionLiteral( |
| 1800 PreParserIdentifier name, Scanner::Location function_name_location, | 1566 PreParserIdentifier name, Scanner::Location function_name_location, |
| 1801 bool name_is_strict_reserved, FunctionKind kind, | 1567 bool name_is_strict_reserved, FunctionKind kind, |
| 1802 int function_token_position, FunctionLiteral::FunctionType type, | 1568 int function_token_position, FunctionLiteral::FunctionType type, |
| 1803 FunctionLiteral::ArityRestriction arity_restriction, bool* ok); | 1569 FunctionLiteral::ArityRestriction arity_restriction, bool* ok); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1977 return pre_parser_->factory()->NewCall(function, args, pos); | 1743 return pre_parser_->factory()->NewCall(function, args, pos); |
| 1978 } | 1744 } |
| 1979 | 1745 |
| 1980 PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function, | 1746 PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function, |
| 1981 PreParserExpressionList args, | 1747 PreParserExpressionList args, |
| 1982 int pos) { | 1748 int pos) { |
| 1983 return pre_parser_->factory()->NewCallNew(function, args, pos); | 1749 return pre_parser_->factory()->NewCallNew(function, args, pos); |
| 1984 } | 1750 } |
| 1985 | 1751 |
| 1986 | 1752 |
| 1987 bool PreParserTraits::DeclareFormalParameter( | |
| 1988 DuplicateFinder* duplicate_finder, PreParserIdentifier current_identifier, | |
| 1989 bool is_rest) { | |
| 1990 return pre_parser_->scanner()->FindSymbol(duplicate_finder, 1) != 0; | |
| 1991 } | |
| 1992 | |
| 1993 | |
| 1994 void PreParserTraits::ParseArrowFunctionFormalParameters( | 1753 void PreParserTraits::ParseArrowFunctionFormalParameters( |
| 1995 Scope* scope, PreParserExpression params, | 1754 Scope* scope, PreParserExpression params, |
| 1996 const Scanner::Location& params_loc, bool* is_rest, | 1755 const Scanner::Location& params_loc, bool* is_rest, |
| 1997 Scanner::Location* duplicate_loc, bool* ok) { | 1756 Scanner::Location* duplicate_loc, bool* ok) { |
| 1998 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter | 1757 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter |
| 1999 // lists that are too long. | 1758 // lists that are too long. |
| 2000 } | 1759 } |
| 2001 | 1760 |
| 2002 | 1761 |
| 2003 PreParserStatementList PreParser::ParseEagerFunctionBody( | 1762 PreParserStatementList PreParser::ParseEagerFunctionBody( |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2156 classifier->RecordStrongModeFormalParameterError( | 1915 classifier->RecordStrongModeFormalParameterError( |
| 2157 scanner()->location(), MessageTemplate::kStrongUndefined); | 1916 scanner()->location(), MessageTemplate::kStrongUndefined); |
| 2158 if (is_strong(language_mode())) { | 1917 if (is_strong(language_mode())) { |
| 2159 // TODO(dslomov): allow 'undefined' in nested patterns. | 1918 // TODO(dslomov): allow 'undefined' in nested patterns. |
| 2160 classifier->RecordBindingPatternError( | 1919 classifier->RecordBindingPatternError( |
| 2161 scanner()->location(), MessageTemplate::kStrongUndefined); | 1920 scanner()->location(), MessageTemplate::kStrongUndefined); |
| 2162 classifier->RecordAssignmentPatternError( | 1921 classifier->RecordAssignmentPatternError( |
| 2163 scanner()->location(), MessageTemplate::kStrongUndefined); | 1922 scanner()->location(), MessageTemplate::kStrongUndefined); |
| 2164 } | 1923 } |
| 2165 } | 1924 } |
| 1925 |
| 1926 if (classifier->duplicate_finder() != nullptr && |
| 1927 scanner()->FindSymbol(classifier->duplicate_finder(), 1) != 0) { |
| 1928 classifier->RecordDuplicateFormalParameterError(scanner()->location()); |
| 1929 } |
| 2166 return name; | 1930 return name; |
| 2167 } else if (is_sloppy(language_mode()) && | 1931 } else if (is_sloppy(language_mode()) && |
| 2168 (next == Token::FUTURE_STRICT_RESERVED_WORD || | 1932 (next == Token::FUTURE_STRICT_RESERVED_WORD || |
| 2169 next == Token::LET || next == Token::STATIC || | 1933 next == Token::LET || next == Token::STATIC || |
| 2170 (next == Token::YIELD && !is_generator()))) { | 1934 (next == Token::YIELD && !is_generator()))) { |
| 2171 classifier->RecordStrictModeFormalParameterError( | 1935 classifier->RecordStrictModeFormalParameterError( |
| 2172 scanner()->location(), MessageTemplate::kUnexpectedStrictReserved); | 1936 scanner()->location(), MessageTemplate::kUnexpectedStrictReserved); |
| 2173 return this->GetSymbol(scanner()); | 1937 return this->GetSymbol(scanner()); |
| 2174 } else { | 1938 } else { |
| 2175 this->ReportUnexpectedToken(next); | 1939 this->ReportUnexpectedToken(next); |
| (...skipping 1499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3675 default: | 3439 default: |
| 3676 return expression; | 3440 return expression; |
| 3677 } | 3441 } |
| 3678 } | 3442 } |
| 3679 DCHECK(false); | 3443 DCHECK(false); |
| 3680 return this->EmptyExpression(); | 3444 return this->EmptyExpression(); |
| 3681 } | 3445 } |
| 3682 | 3446 |
| 3683 | 3447 |
| 3684 template <class Traits> | 3448 template <class Traits> |
| 3685 void ParserBase<Traits>::ParseFormalParameter(FormalParameterScopeT* scope, | 3449 void ParserBase<Traits>::ParseFormalParameter(Scope* scope, bool is_rest, |
| 3686 bool is_rest, | |
| 3687 ExpressionClassifier* classifier, | 3450 ExpressionClassifier* classifier, |
| 3688 bool* ok) { | 3451 bool* ok) { |
| 3689 // FormalParameter[Yield,GeneratorParameter] : | 3452 // FormalParameter[Yield,GeneratorParameter] : |
| 3690 // BindingElement[?Yield, ?GeneratorParameter] | 3453 // BindingElement[?Yield, ?GeneratorParameter] |
| 3691 IdentifierT name = ParseAndClassifyIdentifier(classifier, ok); | 3454 IdentifierT name = ParseAndClassifyIdentifier(classifier, ok); |
| 3692 if (!*ok) return; | 3455 if (!*ok) return; |
| 3693 | 3456 |
| 3694 bool was_declared = Traits::DeclareFormalParameter(scope, name, is_rest); | 3457 Traits::DeclareFormalParameter(scope, name, classifier, is_rest); |
| 3695 if (was_declared) { | |
| 3696 classifier->RecordDuplicateFormalParameterError(scanner()->location()); | |
| 3697 } | |
| 3698 } | 3458 } |
| 3699 | 3459 |
| 3700 | 3460 |
| 3701 template <class Traits> | 3461 template <class Traits> |
| 3702 int ParserBase<Traits>::ParseFormalParameterList( | 3462 int ParserBase<Traits>::ParseFormalParameterList( |
| 3703 FormalParameterScopeT* scope, bool* is_rest, | 3463 Scope* scope, bool* is_rest, ExpressionClassifier* classifier, bool* ok) { |
| 3704 ExpressionClassifier* classifier, bool* ok) { | |
| 3705 // FormalParameters[Yield,GeneratorParameter] : | 3464 // FormalParameters[Yield,GeneratorParameter] : |
| 3706 // [empty] | 3465 // [empty] |
| 3707 // FormalParameterList[?Yield, ?GeneratorParameter] | 3466 // FormalParameterList[?Yield, ?GeneratorParameter] |
| 3708 // | 3467 // |
| 3709 // FormalParameterList[Yield,GeneratorParameter] : | 3468 // FormalParameterList[Yield,GeneratorParameter] : |
| 3710 // FunctionRestParameter[?Yield] | 3469 // FunctionRestParameter[?Yield] |
| 3711 // FormalsList[?Yield, ?GeneratorParameter] | 3470 // FormalsList[?Yield, ?GeneratorParameter] |
| 3712 // FormalsList[?Yield, ?GeneratorParameter] , FunctionRestParameter[?Yield] | 3471 // FormalsList[?Yield, ?GeneratorParameter] , FunctionRestParameter[?Yield] |
| 3713 // | 3472 // |
| 3714 // FormalsList[Yield,GeneratorParameter] : | 3473 // FormalsList[Yield,GeneratorParameter] : |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4051 *ok = false; | 3810 *ok = false; |
| 4052 return; | 3811 return; |
| 4053 } | 3812 } |
| 4054 has_seen_constructor_ = true; | 3813 has_seen_constructor_ = true; |
| 4055 return; | 3814 return; |
| 4056 } | 3815 } |
| 4057 } | 3816 } |
| 4058 } } // v8::internal | 3817 } } // v8::internal |
| 4059 | 3818 |
| 4060 #endif // V8_PREPARSER_H | 3819 #endif // V8_PREPARSER_H |
| OLD | NEW |