Chromium Code Reviews| 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 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 539 void ReportMessageAt(Scanner::Location location, | 539 void ReportMessageAt(Scanner::Location location, |
| 540 MessageTemplate::Template message, | 540 MessageTemplate::Template message, |
| 541 ParseErrorType error_type = kSyntaxError) { | 541 ParseErrorType error_type = kSyntaxError) { |
| 542 Traits::ReportMessageAt(location, message, reinterpret_cast<const char*>(0), | 542 Traits::ReportMessageAt(location, message, reinterpret_cast<const char*>(0), |
| 543 error_type); | 543 error_type); |
| 544 } | 544 } |
| 545 | 545 |
| 546 void ReportUnexpectedToken(Token::Value token); | 546 void ReportUnexpectedToken(Token::Value token); |
| 547 void ReportUnexpectedTokenAt(Scanner::Location location, Token::Value token); | 547 void ReportUnexpectedTokenAt(Scanner::Location location, Token::Value token); |
| 548 | 548 |
| 549 class ExpressionClassifier { | |
| 550 public: | |
| 551 struct Error { | |
| 552 Error() | |
| 553 : location(Scanner::Location::invalid()), | |
| 554 message(MessageTemplate::kNone), | |
| 555 arg(nullptr) {} | |
| 556 | 549 |
| 557 Scanner::Location location; | 550 void ReportClassifierError(const ExpressionClassifier::Error& error) { |
| 558 MessageTemplate::Template message; | |
| 559 const char* arg; | |
| 560 | |
| 561 bool HasError() const { return location.IsValid(); } | |
| 562 }; | |
| 563 | |
| 564 ExpressionClassifier() {} | |
| 565 | |
| 566 bool is_valid_expression() const { return !expression_error_.HasError(); } | |
| 567 | |
| 568 bool is_valid_binding_pattern() const { | |
| 569 return !binding_pattern_error_.HasError(); | |
| 570 } | |
| 571 | |
| 572 bool is_valid_assignment_pattern() const { | |
| 573 return !assignment_pattern_error_.HasError(); | |
| 574 } | |
| 575 | |
| 576 bool is_valid_arrow_formal_parameters() const { | |
| 577 return !arrow_formal_parameters_error_.HasError(); | |
| 578 } | |
| 579 | |
| 580 bool is_valid_formal_parameter_list_without_duplicates() const { | |
| 581 return !duplicate_formal_parameter_error_.HasError(); | |
| 582 } | |
| 583 | |
| 584 // Note: callers should also check | |
| 585 // is_valid_formal_parameter_list_without_duplicates(). | |
| 586 bool is_valid_strict_mode_formal_parameters() const { | |
| 587 return !strict_mode_formal_parameter_error_.HasError(); | |
| 588 } | |
| 589 | |
| 590 // Note: callers should also check is_valid_strict_mode_formal_parameters() | |
| 591 // and is_valid_formal_parameter_list_without_duplicates(). | |
| 592 bool is_valid_strong_mode_formal_parameters() const { | |
| 593 return !strong_mode_formal_parameter_error_.HasError(); | |
| 594 } | |
| 595 | |
| 596 const Error& expression_error() const { return expression_error_; } | |
| 597 | |
| 598 const Error& binding_pattern_error() const { | |
| 599 return binding_pattern_error_; | |
| 600 } | |
| 601 | |
| 602 const Error& assignment_pattern_error() const { | |
| 603 return assignment_pattern_error_; | |
| 604 } | |
| 605 | |
| 606 const Error& arrow_formal_parameters_error() const { | |
| 607 return arrow_formal_parameters_error_; | |
| 608 } | |
| 609 | |
| 610 const Error& duplicate_formal_parameter_error() const { | |
| 611 return duplicate_formal_parameter_error_; | |
| 612 } | |
| 613 | |
| 614 const Error& strict_mode_formal_parameter_error() const { | |
| 615 return strict_mode_formal_parameter_error_; | |
| 616 } | |
| 617 | |
| 618 const Error& strong_mode_formal_parameter_error() const { | |
| 619 return strong_mode_formal_parameter_error_; | |
| 620 } | |
| 621 | |
| 622 void RecordExpressionError(const Scanner::Location& loc, | |
| 623 MessageTemplate::Template message, | |
| 624 const char* arg = nullptr) { | |
| 625 if (!is_valid_expression()) return; | |
| 626 expression_error_.location = loc; | |
| 627 expression_error_.message = message; | |
| 628 expression_error_.arg = arg; | |
| 629 } | |
| 630 | |
| 631 void RecordBindingPatternError(const Scanner::Location& loc, | |
| 632 MessageTemplate::Template message, | |
| 633 const char* arg = nullptr) { | |
| 634 if (!is_valid_binding_pattern()) return; | |
| 635 binding_pattern_error_.location = loc; | |
| 636 binding_pattern_error_.message = message; | |
| 637 binding_pattern_error_.arg = arg; | |
| 638 } | |
| 639 | |
| 640 void RecordAssignmentPatternError(const Scanner::Location& loc, | |
| 641 MessageTemplate::Template message, | |
| 642 const char* arg = nullptr) { | |
| 643 if (!is_valid_assignment_pattern()) return; | |
| 644 assignment_pattern_error_.location = loc; | |
| 645 assignment_pattern_error_.message = message; | |
| 646 assignment_pattern_error_.arg = arg; | |
| 647 } | |
| 648 | |
| 649 void RecordArrowFormalParametersError(const Scanner::Location& loc, | |
| 650 MessageTemplate::Template message, | |
| 651 const char* arg = nullptr) { | |
| 652 if (!is_valid_arrow_formal_parameters()) return; | |
| 653 arrow_formal_parameters_error_.location = loc; | |
| 654 arrow_formal_parameters_error_.message = message; | |
| 655 arrow_formal_parameters_error_.arg = arg; | |
| 656 } | |
| 657 | |
| 658 void RecordDuplicateFormalParameterError(const Scanner::Location& loc) { | |
| 659 if (!is_valid_formal_parameter_list_without_duplicates()) return; | |
| 660 duplicate_formal_parameter_error_.location = loc; | |
| 661 duplicate_formal_parameter_error_.message = | |
| 662 MessageTemplate::kStrictParamDupe; | |
| 663 duplicate_formal_parameter_error_.arg = nullptr; | |
| 664 } | |
| 665 | |
| 666 // Record a binding that would be invalid in strict mode. Confusingly this | |
| 667 // is not the same as StrictFormalParameterList, which simply forbids | |
| 668 // duplicate bindings. | |
| 669 void RecordStrictModeFormalParameterError(const Scanner::Location& loc, | |
| 670 MessageTemplate::Template message, | |
| 671 const char* arg = nullptr) { | |
| 672 if (!is_valid_strict_mode_formal_parameters()) return; | |
| 673 strict_mode_formal_parameter_error_.location = loc; | |
| 674 strict_mode_formal_parameter_error_.message = message; | |
| 675 strict_mode_formal_parameter_error_.arg = arg; | |
| 676 } | |
| 677 | |
| 678 void RecordStrongModeFormalParameterError(const Scanner::Location& loc, | |
| 679 MessageTemplate::Template message, | |
| 680 const char* arg = nullptr) { | |
| 681 if (!is_valid_strong_mode_formal_parameters()) return; | |
| 682 strong_mode_formal_parameter_error_.location = loc; | |
| 683 strong_mode_formal_parameter_error_.message = message; | |
| 684 strong_mode_formal_parameter_error_.arg = arg; | |
| 685 } | |
| 686 | |
| 687 enum TargetProduction { | |
| 688 ExpressionProduction = 1 << 0, | |
| 689 BindingPatternProduction = 1 << 1, | |
| 690 AssignmentPatternProduction = 1 << 2, | |
| 691 FormalParametersProduction = 1 << 3, | |
| 692 ArrowFormalParametersProduction = 1 << 4, | |
| 693 StandardProductions = (ExpressionProduction | BindingPatternProduction | | |
| 694 AssignmentPatternProduction), | |
| 695 PatternProductions = | |
| 696 BindingPatternProduction | AssignmentPatternProduction, | |
| 697 AllProductions = (StandardProductions | FormalParametersProduction | | |
| 698 ArrowFormalParametersProduction), | |
| 699 }; | |
| 700 | |
| 701 void Accumulate(const ExpressionClassifier& inner, | |
| 702 unsigned productions = StandardProductions) { | |
| 703 if (productions & ExpressionProduction && is_valid_expression()) { | |
| 704 expression_error_ = inner.expression_error_; | |
| 705 } | |
| 706 if (productions & BindingPatternProduction && | |
| 707 is_valid_binding_pattern()) { | |
| 708 binding_pattern_error_ = inner.binding_pattern_error_; | |
| 709 } | |
| 710 if (productions & AssignmentPatternProduction && | |
| 711 is_valid_assignment_pattern()) { | |
| 712 assignment_pattern_error_ = inner.assignment_pattern_error_; | |
| 713 } | |
| 714 if (productions & FormalParametersProduction) { | |
| 715 if (is_valid_formal_parameter_list_without_duplicates()) { | |
| 716 duplicate_formal_parameter_error_ = | |
| 717 inner.duplicate_formal_parameter_error_; | |
| 718 } | |
| 719 if (is_valid_strict_mode_formal_parameters()) { | |
| 720 strict_mode_formal_parameter_error_ = | |
| 721 inner.strict_mode_formal_parameter_error_; | |
| 722 } | |
| 723 if (is_valid_strong_mode_formal_parameters()) { | |
| 724 strong_mode_formal_parameter_error_ = | |
| 725 inner.strong_mode_formal_parameter_error_; | |
| 726 } | |
| 727 } | |
| 728 if (productions & ArrowFormalParametersProduction && | |
| 729 is_valid_arrow_formal_parameters()) { | |
| 730 // The result continues to be a valid arrow formal parameters if the | |
| 731 // inner expression is a valid binding pattern. | |
| 732 arrow_formal_parameters_error_ = inner.binding_pattern_error_; | |
| 733 } | |
| 734 } | |
| 735 | |
| 736 void AccumulateReclassifyingAsPattern(const ExpressionClassifier& inner) { | |
| 737 Accumulate(inner, AllProductions & ~PatternProductions); | |
| 738 if (!inner.is_valid_expression()) { | |
| 739 if (is_valid_binding_pattern()) { | |
| 740 binding_pattern_error_ = inner.expression_error(); | |
| 741 } | |
| 742 if (is_valid_assignment_pattern()) { | |
| 743 assignment_pattern_error_ = inner.expression_error(); | |
| 744 } | |
| 745 } | |
| 746 } | |
| 747 | |
| 748 private: | |
| 749 Error expression_error_; | |
| 750 Error binding_pattern_error_; | |
| 751 Error assignment_pattern_error_; | |
| 752 Error arrow_formal_parameters_error_; | |
| 753 Error duplicate_formal_parameter_error_; | |
| 754 Error strict_mode_formal_parameter_error_; | |
| 755 Error strong_mode_formal_parameter_error_; | |
| 756 }; | |
| 757 | |
| 758 void ReportClassifierError( | |
| 759 const typename ExpressionClassifier::Error& error) { | |
| 760 Traits::ReportMessageAt(error.location, error.message, error.arg, | 551 Traits::ReportMessageAt(error.location, error.message, error.arg, |
| 761 kSyntaxError); | 552 kSyntaxError); |
| 762 } | 553 } |
| 763 | 554 |
| 764 void ValidateExpression(const ExpressionClassifier* classifier, bool* ok) { | 555 void ValidateExpression(const ExpressionClassifier* classifier, bool* ok) { |
| 765 if (!classifier->is_valid_expression()) { | 556 if (!classifier->is_valid_expression()) { |
| 766 ReportClassifierError(classifier->expression_error()); | 557 ReportClassifierError(classifier->expression_error()); |
| 767 *ok = false; | 558 *ok = false; |
| 768 } | 559 } |
| 769 } | 560 } |
| (...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1519 typedef PreParserIdentifier Identifier; | 1310 typedef PreParserIdentifier Identifier; |
| 1520 typedef PreParserExpression Expression; | 1311 typedef PreParserExpression Expression; |
| 1521 typedef PreParserExpression YieldExpression; | 1312 typedef PreParserExpression YieldExpression; |
| 1522 typedef PreParserExpression FunctionLiteral; | 1313 typedef PreParserExpression FunctionLiteral; |
| 1523 typedef PreParserExpression ClassLiteral; | 1314 typedef PreParserExpression ClassLiteral; |
| 1524 typedef PreParserExpression ObjectLiteralProperty; | 1315 typedef PreParserExpression ObjectLiteralProperty; |
| 1525 typedef PreParserExpression Literal; | 1316 typedef PreParserExpression Literal; |
| 1526 typedef PreParserExpressionList ExpressionList; | 1317 typedef PreParserExpressionList ExpressionList; |
| 1527 typedef PreParserExpressionList PropertyList; | 1318 typedef PreParserExpressionList PropertyList; |
| 1528 typedef PreParserIdentifier FormalParameter; | 1319 typedef PreParserIdentifier FormalParameter; |
| 1529 typedef DuplicateFinder FormalParameterScope; | 1320 typedef void* FormalParameterScope; |
| 1530 typedef PreParserStatementList StatementList; | 1321 typedef PreParserStatementList StatementList; |
| 1531 | 1322 |
| 1532 // For constructing objects returned by the traversing functions. | 1323 // For constructing objects returned by the traversing functions. |
| 1533 typedef PreParserFactory Factory; | 1324 typedef PreParserFactory Factory; |
| 1534 }; | 1325 }; |
| 1535 | 1326 |
| 1536 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} | 1327 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} |
| 1537 | 1328 |
| 1538 // Helper functions for recursive descent. | 1329 // Helper functions for recursive descent. |
| 1539 static bool IsEval(PreParserIdentifier identifier) { | 1330 static bool IsEval(PreParserIdentifier identifier) { |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1792 return EmptyExpression(); | 1583 return EmptyExpression(); |
| 1793 } | 1584 } |
| 1794 inline void MaterializeTemplateCallsiteLiterals(); | 1585 inline void MaterializeTemplateCallsiteLiterals(); |
| 1795 PreParserExpression NoTemplateTag() { | 1586 PreParserExpression NoTemplateTag() { |
| 1796 return PreParserExpression::NoTemplateTag(); | 1587 return PreParserExpression::NoTemplateTag(); |
| 1797 } | 1588 } |
| 1798 static bool IsTaggedTemplate(const PreParserExpression tag) { | 1589 static bool IsTaggedTemplate(const PreParserExpression tag) { |
| 1799 return !tag.IsNoTemplateTag(); | 1590 return !tag.IsNoTemplateTag(); |
| 1800 } | 1591 } |
| 1801 | 1592 |
| 1802 V8_INLINE bool DeclareFormalParameter(DuplicateFinder* scope, | 1593 void DeclareFormalParameter(void* scope, PreParserIdentifier param, |
|
arv (Not doing code reviews)
2015/06/09 14:17:47
FormalParameterScope scope
Dmitry Lomov (no reviews)
2015/06/09 14:38:30
I did one better and removed that trait completely
| |
| 1803 PreParserIdentifier param, | 1594 ExpressionClassifier* classifier, bool is_rest) {} |
| 1804 bool is_rest); | |
| 1805 | 1595 |
| 1806 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {} | 1596 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {} |
| 1807 | 1597 |
| 1808 // Temporary glue; these functions will move to ParserBase. | 1598 // Temporary glue; these functions will move to ParserBase. |
| 1809 PreParserExpression ParseV8Intrinsic(bool* ok); | 1599 PreParserExpression ParseV8Intrinsic(bool* ok); |
| 1810 PreParserExpression ParseFunctionLiteral( | 1600 PreParserExpression ParseFunctionLiteral( |
| 1811 PreParserIdentifier name, Scanner::Location function_name_location, | 1601 PreParserIdentifier name, Scanner::Location function_name_location, |
| 1812 bool name_is_strict_reserved, FunctionKind kind, | 1602 bool name_is_strict_reserved, FunctionKind kind, |
| 1813 int function_token_position, FunctionLiteral::FunctionType type, | 1603 int function_token_position, FunctionLiteral::FunctionType type, |
| 1814 FunctionLiteral::ArityRestriction arity_restriction, bool* ok); | 1604 FunctionLiteral::ArityRestriction arity_restriction, bool* ok); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1988 return pre_parser_->factory()->NewCall(function, args, pos); | 1778 return pre_parser_->factory()->NewCall(function, args, pos); |
| 1989 } | 1779 } |
| 1990 | 1780 |
| 1991 PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function, | 1781 PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function, |
| 1992 PreParserExpressionList args, | 1782 PreParserExpressionList args, |
| 1993 int pos) { | 1783 int pos) { |
| 1994 return pre_parser_->factory()->NewCallNew(function, args, pos); | 1784 return pre_parser_->factory()->NewCallNew(function, args, pos); |
| 1995 } | 1785 } |
| 1996 | 1786 |
| 1997 | 1787 |
| 1998 bool PreParserTraits::DeclareFormalParameter( | |
| 1999 DuplicateFinder* duplicate_finder, PreParserIdentifier current_identifier, | |
| 2000 bool is_rest) { | |
| 2001 return pre_parser_->scanner()->FindSymbol(duplicate_finder, 1) != 0; | |
| 2002 } | |
| 2003 | |
| 2004 | |
| 2005 void PreParserTraits::ParseArrowFunctionFormalParameters( | 1788 void PreParserTraits::ParseArrowFunctionFormalParameters( |
| 2006 Scope* scope, PreParserExpression params, | 1789 Scope* scope, PreParserExpression params, |
| 2007 const Scanner::Location& params_loc, bool* is_rest, | 1790 const Scanner::Location& params_loc, bool* is_rest, |
| 2008 Scanner::Location* duplicate_loc, bool* ok) { | 1791 Scanner::Location* duplicate_loc, bool* ok) { |
| 2009 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter | 1792 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter |
| 2010 // lists that are too long. | 1793 // lists that are too long. |
| 2011 } | 1794 } |
| 2012 | 1795 |
| 2013 | 1796 |
| 2014 PreParserStatementList PreParser::ParseEagerFunctionBody( | 1797 PreParserStatementList PreParser::ParseEagerFunctionBody( |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2167 classifier->RecordStrongModeFormalParameterError( | 1950 classifier->RecordStrongModeFormalParameterError( |
| 2168 scanner()->location(), MessageTemplate::kStrongUndefined); | 1951 scanner()->location(), MessageTemplate::kStrongUndefined); |
| 2169 if (is_strong(language_mode())) { | 1952 if (is_strong(language_mode())) { |
| 2170 // TODO(dslomov): allow 'undefined' in nested patterns. | 1953 // TODO(dslomov): allow 'undefined' in nested patterns. |
| 2171 classifier->RecordBindingPatternError( | 1954 classifier->RecordBindingPatternError( |
| 2172 scanner()->location(), MessageTemplate::kStrongUndefined); | 1955 scanner()->location(), MessageTemplate::kStrongUndefined); |
| 2173 classifier->RecordAssignmentPatternError( | 1956 classifier->RecordAssignmentPatternError( |
| 2174 scanner()->location(), MessageTemplate::kStrongUndefined); | 1957 scanner()->location(), MessageTemplate::kStrongUndefined); |
| 2175 } | 1958 } |
| 2176 } | 1959 } |
| 1960 | |
| 1961 if (classifier->duplicate_finder() != nullptr && | |
| 1962 scanner()->FindSymbol(classifier->duplicate_finder(), 1) != 0) { | |
| 1963 classifier->RecordDuplicateFormalParameterError(scanner()->location()); | |
| 1964 } | |
| 2177 return name; | 1965 return name; |
| 2178 } else if (is_sloppy(language_mode()) && | 1966 } else if (is_sloppy(language_mode()) && |
| 2179 (next == Token::FUTURE_STRICT_RESERVED_WORD || | 1967 (next == Token::FUTURE_STRICT_RESERVED_WORD || |
| 2180 next == Token::LET || next == Token::STATIC || | 1968 next == Token::LET || next == Token::STATIC || |
| 2181 (next == Token::YIELD && !is_generator()))) { | 1969 (next == Token::YIELD && !is_generator()))) { |
| 2182 classifier->RecordStrictModeFormalParameterError( | 1970 classifier->RecordStrictModeFormalParameterError( |
| 2183 scanner()->location(), MessageTemplate::kUnexpectedStrictReserved); | 1971 scanner()->location(), MessageTemplate::kUnexpectedStrictReserved); |
| 2184 return this->GetSymbol(scanner()); | 1972 return this->GetSymbol(scanner()); |
| 2185 } else { | 1973 } else { |
| 2186 this->ReportUnexpectedToken(next); | 1974 this->ReportUnexpectedToken(next); |
| (...skipping 1479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3666 template <class Traits> | 3454 template <class Traits> |
| 3667 void ParserBase<Traits>::ParseFormalParameter(FormalParameterScopeT* scope, | 3455 void ParserBase<Traits>::ParseFormalParameter(FormalParameterScopeT* scope, |
| 3668 bool is_rest, | 3456 bool is_rest, |
| 3669 ExpressionClassifier* classifier, | 3457 ExpressionClassifier* classifier, |
| 3670 bool* ok) { | 3458 bool* ok) { |
| 3671 // FormalParameter[Yield,GeneratorParameter] : | 3459 // FormalParameter[Yield,GeneratorParameter] : |
| 3672 // BindingElement[?Yield, ?GeneratorParameter] | 3460 // BindingElement[?Yield, ?GeneratorParameter] |
| 3673 IdentifierT name = ParseAndClassifyIdentifier(classifier, ok); | 3461 IdentifierT name = ParseAndClassifyIdentifier(classifier, ok); |
| 3674 if (!*ok) return; | 3462 if (!*ok) return; |
| 3675 | 3463 |
| 3676 bool was_declared = Traits::DeclareFormalParameter(scope, name, is_rest); | 3464 Traits::DeclareFormalParameter(scope, name, classifier, is_rest); |
| 3677 if (was_declared) { | |
| 3678 classifier->RecordDuplicateFormalParameterError(scanner()->location()); | |
| 3679 } | |
| 3680 } | 3465 } |
| 3681 | 3466 |
| 3682 | 3467 |
| 3683 template <class Traits> | 3468 template <class Traits> |
| 3684 int ParserBase<Traits>::ParseFormalParameterList( | 3469 int ParserBase<Traits>::ParseFormalParameterList( |
| 3685 FormalParameterScopeT* scope, bool* is_rest, | 3470 FormalParameterScopeT* scope, bool* is_rest, |
| 3686 ExpressionClassifier* classifier, bool* ok) { | 3471 ExpressionClassifier* classifier, bool* ok) { |
| 3687 // FormalParameters[Yield,GeneratorParameter] : | 3472 // FormalParameters[Yield,GeneratorParameter] : |
| 3688 // [empty] | 3473 // [empty] |
| 3689 // FormalParameterList[?Yield, ?GeneratorParameter] | 3474 // FormalParameterList[?Yield, ?GeneratorParameter] |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4033 *ok = false; | 3818 *ok = false; |
| 4034 return; | 3819 return; |
| 4035 } | 3820 } |
| 4036 has_seen_constructor_ = true; | 3821 has_seen_constructor_ = true; |
| 4037 return; | 3822 return; |
| 4038 } | 3823 } |
| 4039 } | 3824 } |
| 4040 } } // v8::internal | 3825 } } // v8::internal |
| 4041 | 3826 |
| 4042 #endif // V8_PREPARSER_H | 3827 #endif // V8_PREPARSER_H |
| OLD | NEW |