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" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 // // Return types for traversing functions. | 55 // // Return types for traversing functions. |
56 // typedef Identifier; | 56 // typedef Identifier; |
57 // typedef Expression; | 57 // typedef Expression; |
58 // typedef FunctionLiteral; | 58 // typedef FunctionLiteral; |
59 // typedef ClassLiteral; | 59 // typedef ClassLiteral; |
60 // typedef ObjectLiteralProperty; | 60 // typedef ObjectLiteralProperty; |
61 // typedef Literal; | 61 // typedef Literal; |
62 // typedef ExpressionList; | 62 // typedef ExpressionList; |
63 // typedef PropertyList; | 63 // typedef PropertyList; |
64 // typedef FormalParameter; | 64 // typedef FormalParameter; |
| 65 // typedef FormalParameters; |
65 // // For constructing objects returned by the traversing functions. | 66 // // For constructing objects returned by the traversing functions. |
66 // typedef Factory; | 67 // typedef Factory; |
67 // }; | 68 // }; |
68 // // ... | 69 // // ... |
69 // }; | 70 // }; |
70 | 71 |
71 template <typename Traits> | 72 template <typename Traits> |
72 class ParserBase : public Traits { | 73 class ParserBase : public Traits { |
73 public: | 74 public: |
74 // Shorten type names defined by Traits. | 75 // Shorten type names defined by Traits. |
75 typedef typename Traits::Type::Expression ExpressionT; | 76 typedef typename Traits::Type::Expression ExpressionT; |
76 typedef typename Traits::Type::Identifier IdentifierT; | 77 typedef typename Traits::Type::Identifier IdentifierT; |
77 typedef typename Traits::Type::FormalParameter FormalParameterT; | 78 typedef typename Traits::Type::FormalParameter FormalParameterT; |
| 79 typedef typename Traits::Type::FormalParameters FormalParametersT; |
78 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; | 80 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; |
79 typedef typename Traits::Type::Literal LiteralT; | 81 typedef typename Traits::Type::Literal LiteralT; |
80 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; | 82 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; |
81 typedef typename Traits::Type::FormalParameterParsingState | |
82 FormalParameterParsingStateT; | |
83 | 83 |
84 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, | 84 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, |
85 v8::Extension* extension, AstValueFactory* ast_value_factory, | 85 v8::Extension* extension, AstValueFactory* ast_value_factory, |
86 ParserRecorder* log, typename Traits::Type::Parser this_object) | 86 ParserRecorder* log, typename Traits::Type::Parser this_object) |
87 : Traits(this_object), | 87 : Traits(this_object), |
88 parenthesized_function_(false), | 88 parenthesized_function_(false), |
89 scope_(NULL), | 89 scope_(NULL), |
90 function_state_(NULL), | 90 function_state_(NULL), |
91 extension_(extension), | 91 extension_(extension), |
92 fni_(NULL), | 92 fni_(NULL), |
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 ExpressionT ParsePostfixExpression(ExpressionClassifier* classifier, | 677 ExpressionT ParsePostfixExpression(ExpressionClassifier* classifier, |
678 bool* ok); | 678 bool* ok); |
679 ExpressionT ParseLeftHandSideExpression(ExpressionClassifier* classifier, | 679 ExpressionT ParseLeftHandSideExpression(ExpressionClassifier* classifier, |
680 bool* ok); | 680 bool* ok); |
681 ExpressionT ParseMemberWithNewPrefixesExpression( | 681 ExpressionT ParseMemberWithNewPrefixesExpression( |
682 ExpressionClassifier* classifier, bool* ok); | 682 ExpressionClassifier* classifier, bool* ok); |
683 ExpressionT ParseMemberExpression(ExpressionClassifier* classifier, bool* ok); | 683 ExpressionT ParseMemberExpression(ExpressionClassifier* classifier, bool* ok); |
684 ExpressionT ParseMemberExpressionContinuation( | 684 ExpressionT ParseMemberExpressionContinuation( |
685 ExpressionT expression, ExpressionClassifier* classifier, bool* ok); | 685 ExpressionT expression, ExpressionClassifier* classifier, bool* ok); |
686 ExpressionT ParseArrowFunctionLiteral( | 686 ExpressionT ParseArrowFunctionLiteral( |
687 const FormalParameterParsingStateT& parsing_state, | 687 const FormalParametersT& parameters, |
688 const ExpressionClassifier& classifier, bool* ok); | 688 const ExpressionClassifier& classifier, bool* ok); |
689 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, | 689 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, |
690 ExpressionClassifier* classifier, bool* ok); | 690 ExpressionClassifier* classifier, bool* ok); |
691 void AddTemplateExpression(ExpressionT); | 691 void AddTemplateExpression(ExpressionT); |
692 ExpressionT ParseSuperExpression(bool is_new, | 692 ExpressionT ParseSuperExpression(bool is_new, |
693 ExpressionClassifier* classifier, bool* ok); | 693 ExpressionClassifier* classifier, bool* ok); |
694 ExpressionT ParseNewTargetExpression(bool* ok); | 694 ExpressionT ParseNewTargetExpression(bool* ok); |
695 ExpressionT ParseStrongInitializationExpression( | 695 ExpressionT ParseStrongInitializationExpression( |
696 ExpressionClassifier* classifier, bool* ok); | 696 ExpressionClassifier* classifier, bool* ok); |
697 ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier, | 697 ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier, |
698 bool* ok); | 698 bool* ok); |
699 | 699 |
700 void ParseFormalParameter(bool is_rest, | 700 void ParseFormalParameter(bool is_rest, |
701 FormalParameterParsingStateT* parsing_result, | 701 FormalParametersT* parameters, |
702 ExpressionClassifier* classifier, bool* ok); | 702 ExpressionClassifier* classifier, bool* ok); |
703 int ParseFormalParameterList(FormalParameterParsingStateT* parsing_state, | 703 int ParseFormalParameterList(FormalParametersT* parameters, |
704 ExpressionClassifier* classifier, bool* ok); | 704 ExpressionClassifier* classifier, bool* ok); |
705 void CheckArityRestrictions( | 705 void CheckArityRestrictions( |
706 int param_count, FunctionLiteral::ArityRestriction arity_restriction, | 706 int param_count, FunctionLiteral::ArityRestriction arity_restriction, |
707 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok); | 707 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok); |
708 | 708 |
709 // Checks if the expression is a valid reference expression (e.g., on the | 709 // Checks if the expression is a valid reference expression (e.g., on the |
710 // left-hand side of assignments). Although ruled out by ECMA as early errors, | 710 // left-hand side of assignments). Although ruled out by ECMA as early errors, |
711 // we allow calls for web compatibility and rewrite them to a runtime throw. | 711 // we allow calls for web compatibility and rewrite them to a runtime throw. |
712 ExpressionT CheckAndRewriteReferenceExpression( | 712 ExpressionT CheckAndRewriteReferenceExpression( |
713 ExpressionT expression, Scanner::Location location, | 713 ExpressionT expression, Scanner::Location location, |
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1302 // Return the object itself as AstVisitor and implement the needed | 1302 // Return the object itself as AstVisitor and implement the needed |
1303 // dummy method right in this class. | 1303 // dummy method right in this class. |
1304 PreParserFactory* visitor() { return this; } | 1304 PreParserFactory* visitor() { return this; } |
1305 int* ast_properties() { | 1305 int* ast_properties() { |
1306 static int dummy = 42; | 1306 static int dummy = 42; |
1307 return &dummy; | 1307 return &dummy; |
1308 } | 1308 } |
1309 }; | 1309 }; |
1310 | 1310 |
1311 | 1311 |
1312 struct PreParserFormalParameterParsingState { | 1312 struct PreParserFormalParameters { |
1313 explicit PreParserFormalParameterParsingState(Scope* scope) | 1313 explicit PreParserFormalParameters(Scope* scope) |
1314 : scope(scope), | 1314 : scope(scope), |
1315 has_rest(false), | 1315 has_rest(false), |
1316 is_simple_parameter_list(true), | 1316 is_simple(true), |
1317 materialized_literals_count(0) {} | 1317 materialized_literals_count(0) {} |
1318 Scope* scope; | 1318 Scope* scope; |
1319 bool has_rest; | 1319 bool has_rest; |
1320 bool is_simple_parameter_list; | 1320 bool is_simple; |
1321 int materialized_literals_count; | 1321 int materialized_literals_count; |
1322 }; | 1322 }; |
1323 | 1323 |
1324 | 1324 |
1325 class PreParser; | 1325 class PreParser; |
1326 | 1326 |
1327 class PreParserTraits { | 1327 class PreParserTraits { |
1328 public: | 1328 public: |
1329 struct Type { | 1329 struct Type { |
1330 // TODO(marja): To be removed. The Traits object should contain all the data | 1330 // TODO(marja): To be removed. The Traits object should contain all the data |
1331 // it needs. | 1331 // it needs. |
1332 typedef PreParser* Parser; | 1332 typedef PreParser* Parser; |
1333 | 1333 |
1334 // PreParser doesn't need to store generator variables. | 1334 // PreParser doesn't need to store generator variables. |
1335 typedef void GeneratorVariable; | 1335 typedef void GeneratorVariable; |
1336 | 1336 |
1337 typedef int AstProperties; | 1337 typedef int AstProperties; |
1338 | 1338 |
1339 // Return types for traversing functions. | 1339 // Return types for traversing functions. |
1340 typedef PreParserIdentifier Identifier; | 1340 typedef PreParserIdentifier Identifier; |
1341 typedef PreParserExpression Expression; | 1341 typedef PreParserExpression Expression; |
1342 typedef PreParserExpression YieldExpression; | 1342 typedef PreParserExpression YieldExpression; |
1343 typedef PreParserExpression FunctionLiteral; | 1343 typedef PreParserExpression FunctionLiteral; |
1344 typedef PreParserExpression ClassLiteral; | 1344 typedef PreParserExpression ClassLiteral; |
1345 typedef PreParserExpression ObjectLiteralProperty; | 1345 typedef PreParserExpression ObjectLiteralProperty; |
1346 typedef PreParserExpression Literal; | 1346 typedef PreParserExpression Literal; |
1347 typedef PreParserExpressionList ExpressionList; | 1347 typedef PreParserExpressionList ExpressionList; |
1348 typedef PreParserExpressionList PropertyList; | 1348 typedef PreParserExpressionList PropertyList; |
1349 typedef PreParserIdentifier FormalParameter; | 1349 typedef PreParserIdentifier FormalParameter; |
| 1350 typedef PreParserFormalParameters FormalParameters; |
1350 typedef PreParserStatementList StatementList; | 1351 typedef PreParserStatementList StatementList; |
1351 typedef PreParserFormalParameterParsingState FormalParameterParsingState; | |
1352 | 1352 |
1353 // For constructing objects returned by the traversing functions. | 1353 // For constructing objects returned by the traversing functions. |
1354 typedef PreParserFactory Factory; | 1354 typedef PreParserFactory Factory; |
1355 }; | 1355 }; |
1356 | 1356 |
1357 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} | 1357 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} |
1358 | 1358 |
1359 // Helper functions for recursive descent. | 1359 // Helper functions for recursive descent. |
1360 static bool IsEval(PreParserIdentifier identifier) { | 1360 static bool IsEval(PreParserIdentifier identifier) { |
1361 return identifier.IsEval(); | 1361 return identifier.IsEval(); |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1581 | 1581 |
1582 static PreParserStatementList NewStatementList(int size, Zone* zone) { | 1582 static PreParserStatementList NewStatementList(int size, Zone* zone) { |
1583 return PreParserStatementList(); | 1583 return PreParserStatementList(); |
1584 } | 1584 } |
1585 | 1585 |
1586 static PreParserExpressionList NewPropertyList(int size, Zone* zone) { | 1586 static PreParserExpressionList NewPropertyList(int size, Zone* zone) { |
1587 return PreParserExpressionList(); | 1587 return PreParserExpressionList(); |
1588 } | 1588 } |
1589 | 1589 |
1590 static void AddParameterInitializationBlock( | 1590 static void AddParameterInitializationBlock( |
1591 const PreParserFormalParameterParsingState& formal_parameters, | 1591 const PreParserFormalParameters& parameters, |
1592 PreParserStatementList list, bool* ok) {} | 1592 PreParserStatementList list, bool* ok) {} |
1593 | 1593 |
1594 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count, | 1594 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count, |
1595 int* expected_property_count, bool* ok) { | 1595 int* expected_property_count, bool* ok) { |
1596 UNREACHABLE(); | 1596 UNREACHABLE(); |
1597 } | 1597 } |
1598 | 1598 |
1599 V8_INLINE PreParserStatementList ParseEagerFunctionBody( | 1599 V8_INLINE PreParserStatementList ParseEagerFunctionBody( |
1600 PreParserIdentifier function_name, int pos, | 1600 PreParserIdentifier function_name, int pos, |
1601 const PreParserFormalParameterParsingState& formal_parameters, | 1601 const PreParserFormalParameters& parameters, |
1602 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok); | 1602 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok); |
1603 | 1603 |
1604 V8_INLINE void ParseArrowFunctionFormalParameters( | 1604 V8_INLINE void ParseArrowFunctionFormalParameters( |
1605 PreParserFormalParameterParsingState* parsing_state, | 1605 PreParserFormalParameters* parameters, |
1606 PreParserExpression expression, const Scanner::Location& params_loc, | 1606 PreParserExpression expression, const Scanner::Location& params_loc, |
1607 Scanner::Location* duplicate_loc, bool* ok); | 1607 Scanner::Location* duplicate_loc, bool* ok); |
1608 | 1608 |
1609 void ReindexLiterals( | 1609 void ReindexLiterals(const PreParserFormalParameters& paramaters) {} |
1610 const PreParserFormalParameterParsingState& parsing_state) {} | |
1611 | 1610 |
1612 struct TemplateLiteralState {}; | 1611 struct TemplateLiteralState {}; |
1613 | 1612 |
1614 TemplateLiteralState OpenTemplateLiteral(int pos) { | 1613 TemplateLiteralState OpenTemplateLiteral(int pos) { |
1615 return TemplateLiteralState(); | 1614 return TemplateLiteralState(); |
1616 } | 1615 } |
1617 void AddTemplateSpan(TemplateLiteralState*, bool) {} | 1616 void AddTemplateSpan(TemplateLiteralState*, bool) {} |
1618 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} | 1617 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} |
1619 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, | 1618 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, |
1620 PreParserExpression tag) { | 1619 PreParserExpression tag) { |
1621 if (IsTaggedTemplate(tag)) { | 1620 if (IsTaggedTemplate(tag)) { |
1622 // Emulate generation of array literals for tag callsite | 1621 // Emulate generation of array literals for tag callsite |
1623 // 1st is array of cooked strings, second is array of raw strings | 1622 // 1st is array of cooked strings, second is array of raw strings |
1624 MaterializeTemplateCallsiteLiterals(); | 1623 MaterializeTemplateCallsiteLiterals(); |
1625 } | 1624 } |
1626 return EmptyExpression(); | 1625 return EmptyExpression(); |
1627 } | 1626 } |
1628 inline void MaterializeTemplateCallsiteLiterals(); | 1627 inline void MaterializeTemplateCallsiteLiterals(); |
1629 PreParserExpression NoTemplateTag() { | 1628 PreParserExpression NoTemplateTag() { |
1630 return PreParserExpression::NoTemplateTag(); | 1629 return PreParserExpression::NoTemplateTag(); |
1631 } | 1630 } |
1632 static bool IsTaggedTemplate(const PreParserExpression tag) { | 1631 static bool IsTaggedTemplate(const PreParserExpression tag) { |
1633 return !tag.IsNoTemplateTag(); | 1632 return !tag.IsNoTemplateTag(); |
1634 } | 1633 } |
1635 | 1634 |
1636 void DeclareFormalParameter(void* parsing_state, PreParserExpression pattern, | 1635 void DeclareFormalParameter(PreParserFormalParameters* parameters, |
1637 ExpressionClassifier* classifier, bool is_rest) {} | 1636 PreParserExpression pattern, bool is_rest, |
| 1637 ExpressionClassifier* classifier) {} |
1638 | 1638 |
1639 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {} | 1639 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {} |
1640 | 1640 |
1641 // Temporary glue; these functions will move to ParserBase. | 1641 // Temporary glue; these functions will move to ParserBase. |
1642 PreParserExpression ParseV8Intrinsic(bool* ok); | 1642 PreParserExpression ParseV8Intrinsic(bool* ok); |
1643 PreParserExpression ParseFunctionLiteral( | 1643 PreParserExpression ParseFunctionLiteral( |
1644 PreParserIdentifier name, Scanner::Location function_name_location, | 1644 PreParserIdentifier name, Scanner::Location function_name_location, |
1645 FunctionNameValidity function_name_validity, FunctionKind kind, | 1645 FunctionNameValidity function_name_validity, FunctionKind kind, |
1646 int function_token_position, FunctionLiteral::FunctionType type, | 1646 int function_token_position, FunctionLiteral::FunctionType type, |
1647 FunctionLiteral::ArityRestriction arity_restriction, | 1647 FunctionLiteral::ArityRestriction arity_restriction, |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1778 Statement ParseTryStatement(bool* ok); | 1778 Statement ParseTryStatement(bool* ok); |
1779 Statement ParseDebuggerStatement(bool* ok); | 1779 Statement ParseDebuggerStatement(bool* ok); |
1780 Expression ParseConditionalExpression(bool accept_IN, bool* ok); | 1780 Expression ParseConditionalExpression(bool accept_IN, bool* ok); |
1781 Expression ParseObjectLiteral(bool* ok); | 1781 Expression ParseObjectLiteral(bool* ok); |
1782 Expression ParseV8Intrinsic(bool* ok); | 1782 Expression ParseV8Intrinsic(bool* ok); |
1783 | 1783 |
1784 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count, | 1784 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count, |
1785 int* expected_property_count, bool* ok); | 1785 int* expected_property_count, bool* ok); |
1786 V8_INLINE PreParserStatementList | 1786 V8_INLINE PreParserStatementList |
1787 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, | 1787 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, |
1788 const FormalParameterParsingStateT& formal_parameters, | 1788 const PreParserFormalParameters& parameters, |
1789 Variable* fvar, Token::Value fvar_init_op, | 1789 Variable* fvar, Token::Value fvar_init_op, |
1790 FunctionKind kind, bool* ok); | 1790 FunctionKind kind, bool* ok); |
1791 | 1791 |
1792 Expression ParseFunctionLiteral( | 1792 Expression ParseFunctionLiteral( |
1793 Identifier name, Scanner::Location function_name_location, | 1793 Identifier name, Scanner::Location function_name_location, |
1794 FunctionNameValidity function_name_validity, FunctionKind kind, | 1794 FunctionNameValidity function_name_validity, FunctionKind kind, |
1795 int function_token_pos, FunctionLiteral::FunctionType function_type, | 1795 int function_token_pos, FunctionLiteral::FunctionType function_type, |
1796 FunctionLiteral::ArityRestriction arity_restriction, | 1796 FunctionLiteral::ArityRestriction arity_restriction, |
1797 LanguageMode language_mode, bool* ok); | 1797 LanguageMode language_mode, bool* ok); |
1798 void ParseLazyFunctionLiteralBody(bool* ok, | 1798 void ParseLazyFunctionLiteralBody(bool* ok, |
(...skipping 26 matching lines...) Expand all Loading... |
1825 } | 1825 } |
1826 | 1826 |
1827 PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function, | 1827 PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function, |
1828 PreParserExpressionList args, | 1828 PreParserExpressionList args, |
1829 int pos) { | 1829 int pos) { |
1830 return pre_parser_->factory()->NewCallNew(function, args, pos); | 1830 return pre_parser_->factory()->NewCallNew(function, args, pos); |
1831 } | 1831 } |
1832 | 1832 |
1833 | 1833 |
1834 void PreParserTraits::ParseArrowFunctionFormalParameters( | 1834 void PreParserTraits::ParseArrowFunctionFormalParameters( |
1835 PreParserFormalParameterParsingState* parsing_state, | 1835 PreParserFormalParameters* parameters, |
1836 PreParserExpression params, const Scanner::Location& params_loc, | 1836 PreParserExpression params, const Scanner::Location& params_loc, |
1837 Scanner::Location* duplicate_loc, bool* ok) { | 1837 Scanner::Location* duplicate_loc, bool* ok) { |
1838 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter | 1838 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter |
1839 // lists that are too long. | 1839 // lists that are too long. |
1840 } | 1840 } |
1841 | 1841 |
1842 | 1842 |
1843 PreParserStatementList PreParser::ParseEagerFunctionBody( | 1843 PreParserStatementList PreParser::ParseEagerFunctionBody( |
1844 PreParserIdentifier function_name, int pos, | 1844 PreParserIdentifier function_name, int pos, |
1845 const PreParserFormalParameterParsingState& formal_parameters, | 1845 const PreParserFormalParameters& parameters, |
1846 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok) { | 1846 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok) { |
1847 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); | 1847 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
1848 | 1848 |
1849 ParseStatementList(Token::RBRACE, ok); | 1849 ParseStatementList(Token::RBRACE, ok); |
1850 if (!*ok) return PreParserStatementList(); | 1850 if (!*ok) return PreParserStatementList(); |
1851 | 1851 |
1852 Expect(Token::RBRACE, ok); | 1852 Expect(Token::RBRACE, ok); |
1853 return PreParserStatementList(); | 1853 return PreParserStatementList(); |
1854 } | 1854 } |
1855 | 1855 |
1856 | 1856 |
1857 PreParserStatementList PreParserTraits::ParseEagerFunctionBody( | 1857 PreParserStatementList PreParserTraits::ParseEagerFunctionBody( |
1858 PreParserIdentifier function_name, int pos, | 1858 PreParserIdentifier function_name, int pos, |
1859 const PreParserFormalParameterParsingState& formal_parameters, | 1859 const PreParserFormalParameters& parameters, |
1860 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok) { | 1860 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok) { |
1861 return pre_parser_->ParseEagerFunctionBody( | 1861 return pre_parser_->ParseEagerFunctionBody( |
1862 function_name, pos, formal_parameters, fvar, fvar_init_op, kind, ok); | 1862 function_name, pos, parameters, fvar, fvar_init_op, kind, ok); |
1863 } | 1863 } |
1864 | 1864 |
1865 | 1865 |
1866 template <class Traits> | 1866 template <class Traits> |
1867 ParserBase<Traits>::FunctionState::FunctionState( | 1867 ParserBase<Traits>::FunctionState::FunctionState( |
1868 FunctionState** function_state_stack, Scope** scope_stack, Scope* scope, | 1868 FunctionState** function_state_stack, Scope** scope_stack, Scope* scope, |
1869 FunctionKind kind, typename Traits::Type::Factory* factory) | 1869 FunctionKind kind, typename Traits::Type::Factory* factory) |
1870 : next_materialized_literal_index_(0), | 1870 : next_materialized_literal_index_(0), |
1871 expected_property_count_(0), | 1871 expected_property_count_(0), |
1872 this_location_(Scanner::Location::invalid()), | 1872 this_location_(Scanner::Location::invalid()), |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2259 Token::String(Token::RPAREN)); | 2259 Token::String(Token::RPAREN)); |
2260 // Give a good error to the user who might have typed e.g. "return();". | 2260 // Give a good error to the user who might have typed e.g. "return();". |
2261 if (peek() != Token::ARROW) { | 2261 if (peek() != Token::ARROW) { |
2262 ReportUnexpectedTokenAt(scanner_->peek_location(), peek(), | 2262 ReportUnexpectedTokenAt(scanner_->peek_location(), peek(), |
2263 MessageTemplate::kMissingArrow); | 2263 MessageTemplate::kMissingArrow); |
2264 *ok = false; | 2264 *ok = false; |
2265 return this->EmptyExpression(); | 2265 return this->EmptyExpression(); |
2266 } | 2266 } |
2267 Scope* scope = | 2267 Scope* scope = |
2268 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); | 2268 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); |
2269 FormalParameterParsingStateT parsing_state(scope); | 2269 FormalParametersT parameters(scope); |
2270 scope->set_start_position(beg_pos); | 2270 scope->set_start_position(beg_pos); |
2271 ExpressionClassifier args_classifier; | 2271 ExpressionClassifier args_classifier; |
2272 result = this->ParseArrowFunctionLiteral(parsing_state, args_classifier, | 2272 result = this->ParseArrowFunctionLiteral(parameters, args_classifier, |
2273 CHECK_OK); | 2273 CHECK_OK); |
2274 } else if (allow_harmony_arrow_functions() && | 2274 } else if (allow_harmony_arrow_functions() && |
2275 allow_harmony_rest_params() && Check(Token::ELLIPSIS)) { | 2275 allow_harmony_rest_params() && Check(Token::ELLIPSIS)) { |
2276 // (...x) => y | 2276 // (...x) => y |
2277 Scope* scope = | 2277 Scope* scope = |
2278 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); | 2278 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); |
2279 FormalParameterParsingStateT parsing_state(scope); | 2279 FormalParametersT parameters(scope); |
2280 scope->set_start_position(beg_pos); | 2280 scope->set_start_position(beg_pos); |
2281 ExpressionClassifier args_classifier; | 2281 ExpressionClassifier args_classifier; |
2282 const bool is_rest = true; | 2282 const bool is_rest = true; |
2283 this->ParseFormalParameter(is_rest, &parsing_state, &args_classifier, | 2283 this->ParseFormalParameter(is_rest, ¶meters, &args_classifier, |
2284 CHECK_OK); | 2284 CHECK_OK); |
2285 if (peek() == Token::COMMA) { | 2285 if (peek() == Token::COMMA) { |
2286 ReportMessageAt(scanner()->peek_location(), | 2286 ReportMessageAt(scanner()->peek_location(), |
2287 MessageTemplate::kParamAfterRest); | 2287 MessageTemplate::kParamAfterRest); |
2288 *ok = false; | 2288 *ok = false; |
2289 return this->EmptyExpression(); | 2289 return this->EmptyExpression(); |
2290 } | 2290 } |
2291 Expect(Token::RPAREN, CHECK_OK); | 2291 Expect(Token::RPAREN, CHECK_OK); |
2292 result = this->ParseArrowFunctionLiteral(parsing_state, args_classifier, | 2292 result = this->ParseArrowFunctionLiteral(parameters, args_classifier, |
2293 CHECK_OK); | 2293 CHECK_OK); |
2294 } else { | 2294 } else { |
2295 // Heuristically try to detect immediately called functions before | 2295 // Heuristically try to detect immediately called functions before |
2296 // seeing the call parentheses. | 2296 // seeing the call parentheses. |
2297 parenthesized_function_ = (peek() == Token::FUNCTION); | 2297 parenthesized_function_ = (peek() == Token::FUNCTION); |
2298 result = this->ParseExpression(true, classifier, CHECK_OK); | 2298 result = this->ParseExpression(true, classifier, CHECK_OK); |
2299 Expect(Token::RPAREN, CHECK_OK); | 2299 Expect(Token::RPAREN, CHECK_OK); |
2300 } | 2300 } |
2301 break; | 2301 break; |
2302 | 2302 |
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2829 ExpressionT expression = this->ParseConditionalExpression( | 2829 ExpressionT expression = this->ParseConditionalExpression( |
2830 accept_IN, &arrow_formals_classifier, CHECK_OK); | 2830 accept_IN, &arrow_formals_classifier, CHECK_OK); |
2831 | 2831 |
2832 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) { | 2832 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) { |
2833 BindingPatternUnexpectedToken(classifier); | 2833 BindingPatternUnexpectedToken(classifier); |
2834 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, | 2834 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, |
2835 parenthesized_formals, CHECK_OK); | 2835 parenthesized_formals, CHECK_OK); |
2836 Scanner::Location loc(lhs_location.beg_pos, scanner()->location().end_pos); | 2836 Scanner::Location loc(lhs_location.beg_pos, scanner()->location().end_pos); |
2837 Scope* scope = | 2837 Scope* scope = |
2838 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); | 2838 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); |
2839 FormalParameterParsingStateT parsing_state(scope); | 2839 FormalParametersT parameters(scope); |
2840 checkpoint.Restore(&parsing_state.materialized_literals_count); | 2840 checkpoint.Restore(¶meters.materialized_literals_count); |
2841 | 2841 |
2842 scope->set_start_position(lhs_location.beg_pos); | 2842 scope->set_start_position(lhs_location.beg_pos); |
2843 Scanner::Location duplicate_loc = Scanner::Location::invalid(); | 2843 Scanner::Location duplicate_loc = Scanner::Location::invalid(); |
2844 this->ParseArrowFunctionFormalParameters(&parsing_state, expression, loc, | 2844 this->ParseArrowFunctionFormalParameters(¶meters, expression, loc, |
2845 &duplicate_loc, CHECK_OK); | 2845 &duplicate_loc, CHECK_OK); |
2846 if (duplicate_loc.IsValid()) { | 2846 if (duplicate_loc.IsValid()) { |
2847 arrow_formals_classifier.RecordDuplicateFormalParameterError( | 2847 arrow_formals_classifier.RecordDuplicateFormalParameterError( |
2848 duplicate_loc); | 2848 duplicate_loc); |
2849 } | 2849 } |
2850 expression = this->ParseArrowFunctionLiteral( | 2850 expression = this->ParseArrowFunctionLiteral( |
2851 parsing_state, arrow_formals_classifier, CHECK_OK); | 2851 parameters, arrow_formals_classifier, CHECK_OK); |
2852 return expression; | 2852 return expression; |
2853 } | 2853 } |
2854 | 2854 |
2855 // "expression" was not itself an arrow function parameter list, but it might | 2855 // "expression" was not itself an arrow function parameter list, but it might |
2856 // form part of one. Propagate speculative formal parameter error locations. | 2856 // form part of one. Propagate speculative formal parameter error locations. |
2857 classifier->Accumulate(arrow_formals_classifier, | 2857 classifier->Accumulate(arrow_formals_classifier, |
2858 ExpressionClassifier::StandardProductions | | 2858 ExpressionClassifier::StandardProductions | |
2859 ExpressionClassifier::FormalParametersProductions); | 2859 ExpressionClassifier::FormalParametersProductions); |
2860 | 2860 |
2861 if (!Token::IsAssignmentOp(peek())) { | 2861 if (!Token::IsAssignmentOp(peek())) { |
(...skipping 747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3609 return expression; | 3609 return expression; |
3610 } | 3610 } |
3611 } | 3611 } |
3612 DCHECK(false); | 3612 DCHECK(false); |
3613 return this->EmptyExpression(); | 3613 return this->EmptyExpression(); |
3614 } | 3614 } |
3615 | 3615 |
3616 | 3616 |
3617 template <class Traits> | 3617 template <class Traits> |
3618 void ParserBase<Traits>::ParseFormalParameter( | 3618 void ParserBase<Traits>::ParseFormalParameter( |
3619 bool is_rest, FormalParameterParsingStateT* parsing_state, | 3619 bool is_rest, FormalParametersT* parameters, |
3620 ExpressionClassifier* classifier, bool* ok) { | 3620 ExpressionClassifier* classifier, bool* ok) { |
3621 // FormalParameter[Yield,GeneratorParameter] : | 3621 // FormalParameter[Yield,GeneratorParameter] : |
3622 // BindingElement[?Yield, ?GeneratorParameter] | 3622 // BindingElement[?Yield, ?GeneratorParameter] |
3623 | 3623 |
3624 Token::Value next = peek(); | 3624 Token::Value next = peek(); |
3625 ExpressionT pattern = ParsePrimaryExpression(classifier, ok); | 3625 ExpressionT pattern = ParsePrimaryExpression(classifier, ok); |
3626 if (!*ok) return; | 3626 if (!*ok) return; |
3627 | 3627 |
3628 ValidateBindingPattern(classifier, ok); | 3628 ValidateBindingPattern(classifier, ok); |
3629 if (!*ok) return; | 3629 if (!*ok) return; |
3630 | 3630 |
3631 if (!allow_harmony_destructuring() && !Traits::IsIdentifier(pattern)) { | 3631 if (!allow_harmony_destructuring() && !Traits::IsIdentifier(pattern)) { |
3632 ReportUnexpectedToken(next); | 3632 ReportUnexpectedToken(next); |
3633 *ok = false; | 3633 *ok = false; |
3634 return; | 3634 return; |
3635 } | 3635 } |
3636 | 3636 |
3637 if (parsing_state->is_simple_parameter_list) { | 3637 if (parameters->is_simple) { |
3638 parsing_state->is_simple_parameter_list = | 3638 parameters->is_simple = !is_rest && Traits::IsIdentifier(pattern); |
3639 !is_rest && Traits::IsIdentifier(pattern); | |
3640 } | 3639 } |
3641 parsing_state->has_rest = is_rest; | 3640 parameters->has_rest = is_rest; |
3642 if (is_rest && !Traits::IsIdentifier(pattern)) { | 3641 if (is_rest && !Traits::IsIdentifier(pattern)) { |
3643 ReportUnexpectedToken(next); | 3642 ReportUnexpectedToken(next); |
3644 *ok = false; | 3643 *ok = false; |
3645 return; | 3644 return; |
3646 } | 3645 } |
3647 Traits::DeclareFormalParameter(parsing_state, pattern, classifier, is_rest); | 3646 Traits::DeclareFormalParameter(parameters, pattern, is_rest, classifier); |
3648 } | 3647 } |
3649 | 3648 |
3650 | 3649 |
3651 template <class Traits> | 3650 template <class Traits> |
3652 int ParserBase<Traits>::ParseFormalParameterList( | 3651 int ParserBase<Traits>::ParseFormalParameterList( |
3653 FormalParameterParsingStateT* parsing_state, | 3652 FormalParametersT* parameters, ExpressionClassifier* classifier, bool* ok) { |
3654 ExpressionClassifier* classifier, bool* ok) { | |
3655 // FormalParameters[Yield,GeneratorParameter] : | 3653 // FormalParameters[Yield,GeneratorParameter] : |
3656 // [empty] | 3654 // [empty] |
3657 // FormalParameterList[?Yield, ?GeneratorParameter] | 3655 // FormalParameterList[?Yield, ?GeneratorParameter] |
3658 // | 3656 // |
3659 // FormalParameterList[Yield,GeneratorParameter] : | 3657 // FormalParameterList[Yield,GeneratorParameter] : |
3660 // FunctionRestParameter[?Yield] | 3658 // FunctionRestParameter[?Yield] |
3661 // FormalsList[?Yield, ?GeneratorParameter] | 3659 // FormalsList[?Yield, ?GeneratorParameter] |
3662 // FormalsList[?Yield, ?GeneratorParameter] , FunctionRestParameter[?Yield] | 3660 // FormalsList[?Yield, ?GeneratorParameter] , FunctionRestParameter[?Yield] |
3663 // | 3661 // |
3664 // FormalsList[Yield,GeneratorParameter] : | 3662 // FormalsList[Yield,GeneratorParameter] : |
3665 // FormalParameter[?Yield, ?GeneratorParameter] | 3663 // FormalParameter[?Yield, ?GeneratorParameter] |
3666 // FormalsList[?Yield, ?GeneratorParameter] , | 3664 // FormalsList[?Yield, ?GeneratorParameter] , |
3667 // FormalParameter[?Yield,?GeneratorParameter] | 3665 // FormalParameter[?Yield,?GeneratorParameter] |
3668 | 3666 |
3669 int parameter_count = 0; | 3667 int arity = 0; |
3670 | 3668 |
3671 if (peek() != Token::RPAREN) { | 3669 if (peek() != Token::RPAREN) { |
3672 do { | 3670 do { |
3673 if (++parameter_count > Code::kMaxArguments) { | 3671 if (++arity > Code::kMaxArguments) { |
3674 ReportMessage(MessageTemplate::kTooManyParameters); | 3672 ReportMessage(MessageTemplate::kTooManyParameters); |
3675 *ok = false; | 3673 *ok = false; |
3676 return -1; | 3674 return -1; |
3677 } | 3675 } |
3678 bool is_rest = allow_harmony_rest_params() && Check(Token::ELLIPSIS); | 3676 bool is_rest = allow_harmony_rest_params() && Check(Token::ELLIPSIS); |
3679 ParseFormalParameter(is_rest, parsing_state, classifier, ok); | 3677 ParseFormalParameter(is_rest, parameters, classifier, ok); |
3680 if (!*ok) return -1; | 3678 if (!*ok) return -1; |
3681 } while (!parsing_state->has_rest && Check(Token::COMMA)); | 3679 } while (!parameters->has_rest && Check(Token::COMMA)); |
3682 | 3680 |
3683 if (parsing_state->has_rest && peek() == Token::COMMA) { | 3681 if (parameters->has_rest && peek() == Token::COMMA) { |
3684 ReportMessageAt(scanner()->peek_location(), | 3682 ReportMessageAt(scanner()->peek_location(), |
3685 MessageTemplate::kParamAfterRest); | 3683 MessageTemplate::kParamAfterRest); |
3686 *ok = false; | 3684 *ok = false; |
3687 return -1; | 3685 return -1; |
3688 } | 3686 } |
3689 } | 3687 } |
3690 | 3688 |
3691 return parameter_count; | 3689 return arity; |
3692 } | 3690 } |
3693 | 3691 |
3694 | 3692 |
3695 template <class Traits> | 3693 template <class Traits> |
3696 void ParserBase<Traits>::CheckArityRestrictions( | 3694 void ParserBase<Traits>::CheckArityRestrictions( |
3697 int param_count, FunctionLiteral::ArityRestriction arity_restriction, | 3695 int param_count, FunctionLiteral::ArityRestriction arity_restriction, |
3698 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok) { | 3696 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok) { |
3699 switch (arity_restriction) { | 3697 switch (arity_restriction) { |
3700 case FunctionLiteral::GETTER_ARITY: | 3698 case FunctionLiteral::GETTER_ARITY: |
3701 if (param_count != 0) { | 3699 if (param_count != 0) { |
(...skipping 16 matching lines...) Expand all Loading... |
3718 break; | 3716 break; |
3719 default: | 3717 default: |
3720 break; | 3718 break; |
3721 } | 3719 } |
3722 } | 3720 } |
3723 | 3721 |
3724 | 3722 |
3725 template <class Traits> | 3723 template <class Traits> |
3726 typename ParserBase<Traits>::ExpressionT | 3724 typename ParserBase<Traits>::ExpressionT |
3727 ParserBase<Traits>::ParseArrowFunctionLiteral( | 3725 ParserBase<Traits>::ParseArrowFunctionLiteral( |
3728 const FormalParameterParsingStateT& formal_parameters, | 3726 const FormalParametersT& formal_parameters, |
3729 const ExpressionClassifier& formals_classifier, bool* ok) { | 3727 const ExpressionClassifier& formals_classifier, bool* ok) { |
3730 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) { | 3728 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) { |
3731 // ASI inserts `;` after arrow parameters if a line terminator is found. | 3729 // ASI inserts `;` after arrow parameters if a line terminator is found. |
3732 // `=> ...` is never a valid expression, so report as syntax error. | 3730 // `=> ...` is never a valid expression, so report as syntax error. |
3733 // If next token is not `=>`, it's a syntax error anyways. | 3731 // If next token is not `=>`, it's a syntax error anyways. |
3734 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); | 3732 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); |
3735 *ok = false; | 3733 *ok = false; |
3736 return this->EmptyExpression(); | 3734 return this->EmptyExpression(); |
3737 } | 3735 } |
3738 | 3736 |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4012 *ok = false; | 4010 *ok = false; |
4013 return; | 4011 return; |
4014 } | 4012 } |
4015 has_seen_constructor_ = true; | 4013 has_seen_constructor_ = true; |
4016 return; | 4014 return; |
4017 } | 4015 } |
4018 } | 4016 } |
4019 } } // v8::internal | 4017 } } // v8::internal |
4020 | 4018 |
4021 #endif // V8_PREPARSER_H | 4019 #endif // V8_PREPARSER_H |
OLD | NEW |