Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/preparser.h

Issue 1189743003: [destructuring] Implement parameter pattern matching. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix magic number issue Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/pattern-rewriter.cc ('k') | src/preparser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 template <typename Traits> 63 template <typename Traits>
64 class ParserBase : public Traits { 64 class ParserBase : public Traits {
65 public: 65 public:
66 // Shorten type names defined by Traits. 66 // Shorten type names defined by Traits.
67 typedef typename Traits::Type::Expression ExpressionT; 67 typedef typename Traits::Type::Expression ExpressionT;
68 typedef typename Traits::Type::Identifier IdentifierT; 68 typedef typename Traits::Type::Identifier IdentifierT;
69 typedef typename Traits::Type::FormalParameter FormalParameterT; 69 typedef typename Traits::Type::FormalParameter FormalParameterT;
70 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; 70 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT;
71 typedef typename Traits::Type::Literal LiteralT; 71 typedef typename Traits::Type::Literal LiteralT;
72 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; 72 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT;
73 typedef typename Traits::Type::FormalParameterParsingState
74 FormalParameterParsingStateT;
73 75
74 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, 76 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit,
75 v8::Extension* extension, AstValueFactory* ast_value_factory, 77 v8::Extension* extension, AstValueFactory* ast_value_factory,
76 ParserRecorder* log, typename Traits::Type::Parser this_object) 78 ParserRecorder* log, typename Traits::Type::Parser this_object)
77 : Traits(this_object), 79 : Traits(this_object),
78 parenthesized_function_(false), 80 parenthesized_function_(false),
79 scope_(NULL), 81 scope_(NULL),
80 function_state_(NULL), 82 function_state_(NULL),
81 extension_(extension), 83 extension_(extension),
82 fni_(NULL), 84 fni_(NULL),
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 !classifier->is_valid_strong_mode_formal_parameters()) { 552 !classifier->is_valid_strong_mode_formal_parameters()) {
551 ReportClassifierError(classifier->strong_mode_formal_parameter_error()); 553 ReportClassifierError(classifier->strong_mode_formal_parameter_error());
552 *ok = false; 554 *ok = false;
553 } 555 }
554 } 556 }
555 557
556 void ValidateArrowFormalParameters(const ExpressionClassifier* classifier, 558 void ValidateArrowFormalParameters(const ExpressionClassifier* classifier,
557 ExpressionT expr, bool* ok) { 559 ExpressionT expr, bool* ok) {
558 if (classifier->is_valid_binding_pattern()) { 560 if (classifier->is_valid_binding_pattern()) {
559 // A simple arrow formal parameter: IDENTIFIER => BODY. 561 // A simple arrow formal parameter: IDENTIFIER => BODY.
560 if (!allow_harmony_destructuring() && !this->IsIdentifier(expr)) { 562 if (!this->IsIdentifier(expr)) {
561 Traits::ReportMessageAt(scanner()->location(), 563 Traits::ReportMessageAt(scanner()->location(),
562 MessageTemplate::kUnexpectedToken, 564 MessageTemplate::kUnexpectedToken,
563 Token::String(scanner()->current_token())); 565 Token::String(scanner()->current_token()));
564 *ok = false; 566 *ok = false;
565 } 567 }
566 } else if (!classifier->is_valid_arrow_formal_parameters()) { 568 } else if (!classifier->is_valid_arrow_formal_parameters()) {
567 ReportClassifierError(classifier->arrow_formal_parameters_error()); 569 ReportClassifierError(classifier->arrow_formal_parameters_error());
568 *ok = false; 570 *ok = false;
569 } 571 }
570 } 572 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 ExpressionT ParseUnaryExpression(ExpressionClassifier* classifier, bool* ok); 641 ExpressionT ParseUnaryExpression(ExpressionClassifier* classifier, bool* ok);
640 ExpressionT ParsePostfixExpression(ExpressionClassifier* classifier, 642 ExpressionT ParsePostfixExpression(ExpressionClassifier* classifier,
641 bool* ok); 643 bool* ok);
642 ExpressionT ParseLeftHandSideExpression(ExpressionClassifier* classifier, 644 ExpressionT ParseLeftHandSideExpression(ExpressionClassifier* classifier,
643 bool* ok); 645 bool* ok);
644 ExpressionT ParseMemberWithNewPrefixesExpression( 646 ExpressionT ParseMemberWithNewPrefixesExpression(
645 ExpressionClassifier* classifier, bool* ok); 647 ExpressionClassifier* classifier, bool* ok);
646 ExpressionT ParseMemberExpression(ExpressionClassifier* classifier, bool* ok); 648 ExpressionT ParseMemberExpression(ExpressionClassifier* classifier, bool* ok);
647 ExpressionT ParseMemberExpressionContinuation( 649 ExpressionT ParseMemberExpressionContinuation(
648 ExpressionT expression, ExpressionClassifier* classifier, bool* ok); 650 ExpressionT expression, ExpressionClassifier* classifier, bool* ok);
649 ExpressionT ParseArrowFunctionLiteral(Scope* function_scope, bool has_rest, 651 ExpressionT ParseArrowFunctionLiteral(
650 const ExpressionClassifier& classifier, 652 const FormalParameterParsingStateT& parsing_state,
651 bool* ok); 653 const ExpressionClassifier& classifier, bool* ok);
652 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, 654 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start,
653 ExpressionClassifier* classifier, bool* ok); 655 ExpressionClassifier* classifier, bool* ok);
654 void AddTemplateExpression(ExpressionT); 656 void AddTemplateExpression(ExpressionT);
655 ExpressionT ParseSuperExpression(bool is_new, 657 ExpressionT ParseSuperExpression(bool is_new,
656 ExpressionClassifier* classifier, bool* ok); 658 ExpressionClassifier* classifier, bool* ok);
657 ExpressionT ParseNewTargetExpression(bool* ok); 659 ExpressionT ParseNewTargetExpression(bool* ok);
658 ExpressionT ParseStrongInitializationExpression( 660 ExpressionT ParseStrongInitializationExpression(
659 ExpressionClassifier* classifier, bool* ok); 661 ExpressionClassifier* classifier, bool* ok);
660 ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier, 662 ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier,
661 bool* ok); 663 bool* ok);
662 664
663 void ParseFormalParameter(Scope* scope, bool is_rest, 665 void ParseFormalParameter(bool is_rest,
666 FormalParameterParsingStateT* parsing_result,
664 ExpressionClassifier* classifier, bool* ok); 667 ExpressionClassifier* classifier, bool* ok);
665 int ParseFormalParameterList(Scope* scope, bool* has_rest, 668 int ParseFormalParameterList(FormalParameterParsingStateT* parsing_state,
666 ExpressionClassifier* classifier, bool* ok); 669 ExpressionClassifier* classifier, bool* ok);
667 void CheckArityRestrictions( 670 void CheckArityRestrictions(
668 int param_count, FunctionLiteral::ArityRestriction arity_restriction, 671 int param_count, FunctionLiteral::ArityRestriction arity_restriction,
669 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok); 672 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok);
670 673
671 // Checks if the expression is a valid reference expression (e.g., on the 674 // Checks if the expression is a valid reference expression (e.g., on the
672 // left-hand side of assignments). Although ruled out by ECMA as early errors, 675 // left-hand side of assignments). Although ruled out by ECMA as early errors,
673 // we allow calls for web compatibility and rewrite them to a runtime throw. 676 // we allow calls for web compatibility and rewrite them to a runtime throw.
674 ExpressionT CheckAndRewriteReferenceExpression( 677 ExpressionT CheckAndRewriteReferenceExpression(
675 ExpressionT expression, Scanner::Location location, 678 ExpressionT expression, Scanner::Location location,
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after
1247 // Return the object itself as AstVisitor and implement the needed 1250 // Return the object itself as AstVisitor and implement the needed
1248 // dummy method right in this class. 1251 // dummy method right in this class.
1249 PreParserFactory* visitor() { return this; } 1252 PreParserFactory* visitor() { return this; }
1250 int* ast_properties() { 1253 int* ast_properties() {
1251 static int dummy = 42; 1254 static int dummy = 42;
1252 return &dummy; 1255 return &dummy;
1253 } 1256 }
1254 }; 1257 };
1255 1258
1256 1259
1260 struct PreParserFormalParameterParsingState {
1261 explicit PreParserFormalParameterParsingState(Scope* scope)
1262 : scope(scope), has_rest(false), is_simple_parameter_list(true) {}
1263 Scope* scope;
1264 bool has_rest;
1265 bool is_simple_parameter_list;
1266 };
1267
1268
1257 class PreParser; 1269 class PreParser;
1258 1270
1259 class PreParserTraits { 1271 class PreParserTraits {
1260 public: 1272 public:
1261 struct Type { 1273 struct Type {
1262 // TODO(marja): To be removed. The Traits object should contain all the data 1274 // TODO(marja): To be removed. The Traits object should contain all the data
1263 // it needs. 1275 // it needs.
1264 typedef PreParser* Parser; 1276 typedef PreParser* Parser;
1265 1277
1266 // PreParser doesn't need to store generator variables. 1278 // PreParser doesn't need to store generator variables.
1267 typedef void GeneratorVariable; 1279 typedef void GeneratorVariable;
1268 1280
1269 typedef int AstProperties; 1281 typedef int AstProperties;
1270 1282
1271 // Return types for traversing functions. 1283 // Return types for traversing functions.
1272 typedef PreParserIdentifier Identifier; 1284 typedef PreParserIdentifier Identifier;
1273 typedef PreParserExpression Expression; 1285 typedef PreParserExpression Expression;
1274 typedef PreParserExpression YieldExpression; 1286 typedef PreParserExpression YieldExpression;
1275 typedef PreParserExpression FunctionLiteral; 1287 typedef PreParserExpression FunctionLiteral;
1276 typedef PreParserExpression ClassLiteral; 1288 typedef PreParserExpression ClassLiteral;
1277 typedef PreParserExpression ObjectLiteralProperty; 1289 typedef PreParserExpression ObjectLiteralProperty;
1278 typedef PreParserExpression Literal; 1290 typedef PreParserExpression Literal;
1279 typedef PreParserExpressionList ExpressionList; 1291 typedef PreParserExpressionList ExpressionList;
1280 typedef PreParserExpressionList PropertyList; 1292 typedef PreParserExpressionList PropertyList;
1281 typedef PreParserIdentifier FormalParameter; 1293 typedef PreParserIdentifier FormalParameter;
1282 typedef PreParserStatementList StatementList; 1294 typedef PreParserStatementList StatementList;
1295 typedef PreParserFormalParameterParsingState FormalParameterParsingState;
1283 1296
1284 // For constructing objects returned by the traversing functions. 1297 // For constructing objects returned by the traversing functions.
1285 typedef PreParserFactory Factory; 1298 typedef PreParserFactory Factory;
1286 }; 1299 };
1287 1300
1288 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} 1301 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {}
1289 1302
1290 // Helper functions for recursive descent. 1303 // Helper functions for recursive descent.
1291 static bool IsEval(PreParserIdentifier identifier) { 1304 static bool IsEval(PreParserIdentifier identifier) {
1292 return identifier.IsEval(); 1305 return identifier.IsEval();
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
1511 } 1524 }
1512 1525
1513 static PreParserStatementList NewStatementList(int size, Zone* zone) { 1526 static PreParserStatementList NewStatementList(int size, Zone* zone) {
1514 return PreParserStatementList(); 1527 return PreParserStatementList();
1515 } 1528 }
1516 1529
1517 static PreParserExpressionList NewPropertyList(int size, Zone* zone) { 1530 static PreParserExpressionList NewPropertyList(int size, Zone* zone) {
1518 return PreParserExpressionList(); 1531 return PreParserExpressionList();
1519 } 1532 }
1520 1533
1534 static void AddParameterInitializationBlock(
1535 const PreParserFormalParameterParsingState& formal_parameters,
1536 PreParserStatementList list, bool* ok) {}
1537
1521 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count, 1538 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count,
1522 int* expected_property_count, bool* ok) { 1539 int* expected_property_count, bool* ok) {
1523 UNREACHABLE(); 1540 UNREACHABLE();
1524 } 1541 }
1525 1542
1526 V8_INLINE PreParserStatementList 1543 V8_INLINE PreParserStatementList ParseEagerFunctionBody(
1527 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, 1544 PreParserIdentifier function_name, int pos,
1528 Variable* fvar, Token::Value fvar_init_op, 1545 const PreParserFormalParameterParsingState& formal_parameters,
1529 FunctionKind kind, bool* ok); 1546 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok);
1530 1547
1531 V8_INLINE void ParseArrowFunctionFormalParameters( 1548 V8_INLINE void ParseArrowFunctionFormalParameters(
1532 Scope* scope, PreParserExpression expression, 1549 PreParserFormalParameterParsingState* parsing_state,
1533 const Scanner::Location& params_loc, bool* has_rest, 1550 PreParserExpression expression, const Scanner::Location& params_loc,
1534 Scanner::Location* duplicate_loc, bool* ok); 1551 Scanner::Location* duplicate_loc, bool* ok);
1535 1552
1536 struct TemplateLiteralState {}; 1553 struct TemplateLiteralState {};
1537 1554
1538 TemplateLiteralState OpenTemplateLiteral(int pos) { 1555 TemplateLiteralState OpenTemplateLiteral(int pos) {
1539 return TemplateLiteralState(); 1556 return TemplateLiteralState();
1540 } 1557 }
1541 void AddTemplateSpan(TemplateLiteralState*, bool) {} 1558 void AddTemplateSpan(TemplateLiteralState*, bool) {}
1542 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} 1559 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {}
1543 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, 1560 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int,
1544 PreParserExpression tag) { 1561 PreParserExpression tag) {
1545 if (IsTaggedTemplate(tag)) { 1562 if (IsTaggedTemplate(tag)) {
1546 // Emulate generation of array literals for tag callsite 1563 // Emulate generation of array literals for tag callsite
1547 // 1st is array of cooked strings, second is array of raw strings 1564 // 1st is array of cooked strings, second is array of raw strings
1548 MaterializeTemplateCallsiteLiterals(); 1565 MaterializeTemplateCallsiteLiterals();
1549 } 1566 }
1550 return EmptyExpression(); 1567 return EmptyExpression();
1551 } 1568 }
1552 inline void MaterializeTemplateCallsiteLiterals(); 1569 inline void MaterializeTemplateCallsiteLiterals();
1553 PreParserExpression NoTemplateTag() { 1570 PreParserExpression NoTemplateTag() {
1554 return PreParserExpression::NoTemplateTag(); 1571 return PreParserExpression::NoTemplateTag();
1555 } 1572 }
1556 static bool IsTaggedTemplate(const PreParserExpression tag) { 1573 static bool IsTaggedTemplate(const PreParserExpression tag) {
1557 return !tag.IsNoTemplateTag(); 1574 return !tag.IsNoTemplateTag();
1558 } 1575 }
1559 1576
1560 void DeclareFormalParameter(Scope* scope, PreParserExpression pattern, 1577 void DeclareFormalParameter(void* parsing_state, PreParserExpression pattern,
1561 ExpressionClassifier* classifier, bool is_rest) {} 1578 ExpressionClassifier* classifier, bool is_rest) {}
1562 1579
1563 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {} 1580 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {}
1564 1581
1565 // Temporary glue; these functions will move to ParserBase. 1582 // Temporary glue; these functions will move to ParserBase.
1566 PreParserExpression ParseV8Intrinsic(bool* ok); 1583 PreParserExpression ParseV8Intrinsic(bool* ok);
1567 PreParserExpression ParseFunctionLiteral( 1584 PreParserExpression ParseFunctionLiteral(
1568 PreParserIdentifier name, Scanner::Location function_name_location, 1585 PreParserIdentifier name, Scanner::Location function_name_location,
1569 bool name_is_strict_reserved, FunctionKind kind, 1586 bool name_is_strict_reserved, FunctionKind kind,
1570 int function_token_position, FunctionLiteral::FunctionType type, 1587 int function_token_position, FunctionLiteral::FunctionType type,
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1701 Statement ParseTryStatement(bool* ok); 1718 Statement ParseTryStatement(bool* ok);
1702 Statement ParseDebuggerStatement(bool* ok); 1719 Statement ParseDebuggerStatement(bool* ok);
1703 Expression ParseConditionalExpression(bool accept_IN, bool* ok); 1720 Expression ParseConditionalExpression(bool accept_IN, bool* ok);
1704 Expression ParseObjectLiteral(bool* ok); 1721 Expression ParseObjectLiteral(bool* ok);
1705 Expression ParseV8Intrinsic(bool* ok); 1722 Expression ParseV8Intrinsic(bool* ok);
1706 1723
1707 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count, 1724 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count,
1708 int* expected_property_count, bool* ok); 1725 int* expected_property_count, bool* ok);
1709 V8_INLINE PreParserStatementList 1726 V8_INLINE PreParserStatementList
1710 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, 1727 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos,
1728 const FormalParameterParsingStateT& formal_parameters,
1711 Variable* fvar, Token::Value fvar_init_op, 1729 Variable* fvar, Token::Value fvar_init_op,
1712 FunctionKind kind, bool* ok); 1730 FunctionKind kind, bool* ok);
1713 1731
1714 Expression ParseFunctionLiteral( 1732 Expression ParseFunctionLiteral(
1715 Identifier name, Scanner::Location function_name_location, 1733 Identifier name, Scanner::Location function_name_location,
1716 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos, 1734 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos,
1717 FunctionLiteral::FunctionType function_type, 1735 FunctionLiteral::FunctionType function_type,
1718 FunctionLiteral::ArityRestriction arity_restriction, bool* ok); 1736 FunctionLiteral::ArityRestriction arity_restriction, bool* ok);
1719 void ParseLazyFunctionLiteralBody(bool* ok, 1737 void ParseLazyFunctionLiteralBody(bool* ok,
1720 Scanner::BookmarkScope* bookmark = nullptr); 1738 Scanner::BookmarkScope* bookmark = nullptr);
(...skipping 25 matching lines...) Expand all
1746 } 1764 }
1747 1765
1748 PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function, 1766 PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function,
1749 PreParserExpressionList args, 1767 PreParserExpressionList args,
1750 int pos) { 1768 int pos) {
1751 return pre_parser_->factory()->NewCallNew(function, args, pos); 1769 return pre_parser_->factory()->NewCallNew(function, args, pos);
1752 } 1770 }
1753 1771
1754 1772
1755 void PreParserTraits::ParseArrowFunctionFormalParameters( 1773 void PreParserTraits::ParseArrowFunctionFormalParameters(
1756 Scope* scope, PreParserExpression params, 1774 PreParserFormalParameterParsingState* parsing_state,
1757 const Scanner::Location& params_loc, bool* has_rest, 1775 PreParserExpression params, const Scanner::Location& params_loc,
1758 Scanner::Location* duplicate_loc, bool* ok) { 1776 Scanner::Location* duplicate_loc, bool* ok) {
1759 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter 1777 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter
1760 // lists that are too long. 1778 // lists that are too long.
1761 } 1779 }
1762 1780
1763 1781
1764 PreParserStatementList PreParser::ParseEagerFunctionBody( 1782 PreParserStatementList PreParser::ParseEagerFunctionBody(
1765 PreParserIdentifier function_name, int pos, Variable* fvar, 1783 PreParserIdentifier function_name, int pos,
1766 Token::Value fvar_init_op, FunctionKind kind, bool* ok) { 1784 const PreParserFormalParameterParsingState& formal_parameters,
1785 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok) {
1767 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); 1786 ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
1768 1787
1769 ParseStatementList(Token::RBRACE, ok); 1788 ParseStatementList(Token::RBRACE, ok);
1770 if (!*ok) return PreParserStatementList(); 1789 if (!*ok) return PreParserStatementList();
1771 1790
1772 Expect(Token::RBRACE, ok); 1791 Expect(Token::RBRACE, ok);
1773 return PreParserStatementList(); 1792 return PreParserStatementList();
1774 } 1793 }
1775 1794
1776 1795
1777 PreParserStatementList PreParserTraits::ParseEagerFunctionBody( 1796 PreParserStatementList PreParserTraits::ParseEagerFunctionBody(
1778 PreParserIdentifier function_name, int pos, Variable* fvar, 1797 PreParserIdentifier function_name, int pos,
1779 Token::Value fvar_init_op, FunctionKind kind, bool* ok) { 1798 const PreParserFormalParameterParsingState& formal_parameters,
1780 return pre_parser_->ParseEagerFunctionBody(function_name, pos, fvar, 1799 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok) {
1781 fvar_init_op, kind, ok); 1800 return pre_parser_->ParseEagerFunctionBody(
1801 function_name, pos, formal_parameters, fvar, fvar_init_op, kind, ok);
1782 } 1802 }
1783 1803
1784 1804
1785 template <class Traits> 1805 template <class Traits>
1786 ParserBase<Traits>::FunctionState::FunctionState( 1806 ParserBase<Traits>::FunctionState::FunctionState(
1787 FunctionState** function_state_stack, Scope** scope_stack, Scope* scope, 1807 FunctionState** function_state_stack, Scope** scope_stack, Scope* scope,
1788 FunctionKind kind, typename Traits::Type::Factory* factory) 1808 FunctionKind kind, typename Traits::Type::Factory* factory)
1789 : next_materialized_literal_index_(0), 1809 : next_materialized_literal_index_(0),
1790 expected_property_count_(0), 1810 expected_property_count_(0),
1791 this_location_(Scanner::Location::invalid()), 1811 this_location_(Scanner::Location::invalid()),
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
2155 Token::String(Token::RPAREN)); 2175 Token::String(Token::RPAREN));
2156 // Give a good error to the user who might have typed e.g. "return();". 2176 // Give a good error to the user who might have typed e.g. "return();".
2157 if (peek() != Token::ARROW) { 2177 if (peek() != Token::ARROW) {
2158 ReportUnexpectedTokenAt(scanner_->peek_location(), peek(), 2178 ReportUnexpectedTokenAt(scanner_->peek_location(), peek(),
2159 MessageTemplate::kMissingArrow); 2179 MessageTemplate::kMissingArrow);
2160 *ok = false; 2180 *ok = false;
2161 return this->EmptyExpression(); 2181 return this->EmptyExpression();
2162 } 2182 }
2163 Scope* scope = 2183 Scope* scope =
2164 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); 2184 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction);
2185 FormalParameterParsingStateT parsing_state(scope);
2165 scope->set_start_position(beg_pos); 2186 scope->set_start_position(beg_pos);
2166 ExpressionClassifier args_classifier; 2187 ExpressionClassifier args_classifier;
2167 bool has_rest = false; 2188 result = this->ParseArrowFunctionLiteral(parsing_state, args_classifier,
2168 result = this->ParseArrowFunctionLiteral(scope, has_rest, 2189 CHECK_OK);
2169 args_classifier, CHECK_OK);
2170 } else if (allow_harmony_arrow_functions() && 2190 } else if (allow_harmony_arrow_functions() &&
2171 allow_harmony_rest_params() && Check(Token::ELLIPSIS)) { 2191 allow_harmony_rest_params() && Check(Token::ELLIPSIS)) {
2172 // (...x) => y 2192 // (...x) => y
2173 Scope* scope = 2193 Scope* scope =
2174 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); 2194 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction);
2195 FormalParameterParsingStateT parsing_state(scope);
2175 scope->set_start_position(beg_pos); 2196 scope->set_start_position(beg_pos);
2176 ExpressionClassifier args_classifier; 2197 ExpressionClassifier args_classifier;
2177 const bool has_rest = true; 2198 const bool is_rest = true;
2178 this->ParseFormalParameter(scope, has_rest, &args_classifier, CHECK_OK); 2199 this->ParseFormalParameter(is_rest, &parsing_state, &args_classifier,
2200 CHECK_OK);
2179 if (peek() == Token::COMMA) { 2201 if (peek() == Token::COMMA) {
2180 ReportMessageAt(scanner()->peek_location(), 2202 ReportMessageAt(scanner()->peek_location(),
2181 MessageTemplate::kParamAfterRest); 2203 MessageTemplate::kParamAfterRest);
2182 *ok = false; 2204 *ok = false;
2183 return this->EmptyExpression(); 2205 return this->EmptyExpression();
2184 } 2206 }
2185 Expect(Token::RPAREN, CHECK_OK); 2207 Expect(Token::RPAREN, CHECK_OK);
2186 result = this->ParseArrowFunctionLiteral(scope, has_rest, 2208 result = this->ParseArrowFunctionLiteral(parsing_state, args_classifier,
2187 args_classifier, CHECK_OK); 2209 CHECK_OK);
2188 } else { 2210 } else {
2189 // Heuristically try to detect immediately called functions before 2211 // Heuristically try to detect immediately called functions before
2190 // seeing the call parentheses. 2212 // seeing the call parentheses.
2191 parenthesized_function_ = (peek() == Token::FUNCTION); 2213 parenthesized_function_ = (peek() == Token::FUNCTION);
2192 result = this->ParseExpression(true, classifier, CHECK_OK); 2214 result = this->ParseExpression(true, classifier, CHECK_OK);
2193 Expect(Token::RPAREN, CHECK_OK); 2215 Expect(Token::RPAREN, CHECK_OK);
2194 } 2216 }
2195 break; 2217 break;
2196 2218
2197 case Token::CLASS: { 2219 case Token::CLASS: {
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
2517 name_expression, value, 2539 name_expression, value,
2518 is_get ? ObjectLiteralProperty::GETTER : ObjectLiteralProperty::SETTER, 2540 is_get ? ObjectLiteralProperty::GETTER : ObjectLiteralProperty::SETTER,
2519 is_static, *is_computed_name); 2541 is_static, *is_computed_name);
2520 2542
2521 } else if (!in_class && allow_harmony_object_literals_ && 2543 } else if (!in_class && allow_harmony_object_literals_ &&
2522 Token::IsIdentifier(name_token, language_mode(), 2544 Token::IsIdentifier(name_token, language_mode(),
2523 this->is_generator())) { 2545 this->is_generator())) {
2524 DCHECK(!*is_computed_name); 2546 DCHECK(!*is_computed_name);
2525 DCHECK(!is_static); 2547 DCHECK(!is_static);
2526 2548
2549 if (classifier->duplicate_finder() != nullptr &&
2550 scanner()->FindSymbol(classifier->duplicate_finder(), 1) != 0) {
2551 classifier->RecordDuplicateFormalParameterError(scanner()->location());
2552 }
2553
2527 ExpressionT lhs = this->ExpressionFromIdentifier( 2554 ExpressionT lhs = this->ExpressionFromIdentifier(
2528 name, next_beg_pos, next_end_pos, scope_, factory()); 2555 name, next_beg_pos, next_end_pos, scope_, factory());
2529 if (peek() == Token::ASSIGN) { 2556 if (peek() == Token::ASSIGN) {
2530 this->ExpressionUnexpectedToken(classifier); 2557 this->ExpressionUnexpectedToken(classifier);
2531 Consume(Token::ASSIGN); 2558 Consume(Token::ASSIGN);
2532 ExpressionClassifier rhs_classifier; 2559 ExpressionClassifier rhs_classifier;
2533 ExpressionT rhs = this->ParseAssignmentExpression( 2560 ExpressionT rhs = this->ParseAssignmentExpression(
2534 true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 2561 true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
2535 classifier->AccumulateReclassifyingAsPattern(rhs_classifier); 2562 classifier->AccumulateReclassifyingAsPattern(rhs_classifier);
2536 value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs, 2563 value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs,
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
2700 // LeftHandSideExpression AssignmentOperator AssignmentExpression 2727 // LeftHandSideExpression AssignmentOperator AssignmentExpression
2701 2728
2702 Scanner::Location lhs_location = scanner()->peek_location(); 2729 Scanner::Location lhs_location = scanner()->peek_location();
2703 2730
2704 if (peek() == Token::YIELD && is_generator()) { 2731 if (peek() == Token::YIELD && is_generator()) {
2705 return this->ParseYieldExpression(classifier, ok); 2732 return this->ParseYieldExpression(classifier, ok);
2706 } 2733 }
2707 2734
2708 if (fni_ != NULL) fni_->Enter(); 2735 if (fni_ != NULL) fni_->Enter();
2709 ParserBase<Traits>::Checkpoint checkpoint(this); 2736 ParserBase<Traits>::Checkpoint checkpoint(this);
2710 ExpressionClassifier arrow_formals_classifier; 2737 ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder());
2711 if (peek() != Token::LPAREN) { 2738 if (peek() != Token::LPAREN) {
2712 // The expression we are going to read is not a parenthesized arrow function 2739 // The expression we are going to read is not a parenthesized arrow function
2713 // formal parameter list. 2740 // formal parameter list.
2714 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); 2741 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier);
2715 } 2742 }
2716 ExpressionT expression = this->ParseConditionalExpression( 2743 ExpressionT expression = this->ParseConditionalExpression(
2717 accept_IN, &arrow_formals_classifier, CHECK_OK); 2744 accept_IN, &arrow_formals_classifier, CHECK_OK);
2718 2745
2719 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) { 2746 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) {
2720 checkpoint.Restore(); 2747 checkpoint.Restore();
2721 BindingPatternUnexpectedToken(classifier); 2748 BindingPatternUnexpectedToken(classifier);
2722 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, 2749 ValidateArrowFormalParameters(&arrow_formals_classifier, expression,
2723 CHECK_OK); 2750 CHECK_OK);
2724 Scanner::Location loc(lhs_location.beg_pos, scanner()->location().end_pos); 2751 Scanner::Location loc(lhs_location.beg_pos, scanner()->location().end_pos);
2725 Scope* scope = 2752 Scope* scope =
2726 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); 2753 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction);
2727 scope->set_start_position(lhs_location.beg_pos); 2754 scope->set_start_position(lhs_location.beg_pos);
2728 Scanner::Location duplicate_loc = Scanner::Location::invalid(); 2755 Scanner::Location duplicate_loc = Scanner::Location::invalid();
2729 bool has_rest = false; 2756 FormalParameterParsingStateT parsing_state(scope);
2730 this->ParseArrowFunctionFormalParameters(scope, expression, loc, &has_rest, 2757 this->ParseArrowFunctionFormalParameters(&parsing_state, expression, loc,
2731 &duplicate_loc, CHECK_OK); 2758 &duplicate_loc, CHECK_OK);
2732 if (duplicate_loc.IsValid()) { 2759 if (duplicate_loc.IsValid()) {
2733 arrow_formals_classifier.RecordDuplicateFormalParameterError( 2760 arrow_formals_classifier.RecordDuplicateFormalParameterError(
2734 duplicate_loc); 2761 duplicate_loc);
2735 } 2762 }
2736 expression = this->ParseArrowFunctionLiteral( 2763 expression = this->ParseArrowFunctionLiteral(
2737 scope, has_rest, arrow_formals_classifier, CHECK_OK); 2764 parsing_state, arrow_formals_classifier, CHECK_OK);
2738 return expression; 2765 return expression;
2739 } 2766 }
2740 2767
2741 // "expression" was not itself an arrow function parameter list, but it might 2768 // "expression" was not itself an arrow function parameter list, but it might
2742 // form part of one. Propagate speculative formal parameter error locations. 2769 // form part of one. Propagate speculative formal parameter error locations.
2743 classifier->Accumulate(arrow_formals_classifier, 2770 classifier->Accumulate(arrow_formals_classifier,
2744 ExpressionClassifier::StandardProductions | 2771 ExpressionClassifier::StandardProductions |
2745 ExpressionClassifier::FormalParametersProductions); 2772 ExpressionClassifier::FormalParametersProductions);
2746 2773
2747 if (!Token::IsAssignmentOp(peek())) { 2774 if (!Token::IsAssignmentOp(peek())) {
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after
3490 default: 3517 default:
3491 return expression; 3518 return expression;
3492 } 3519 }
3493 } 3520 }
3494 DCHECK(false); 3521 DCHECK(false);
3495 return this->EmptyExpression(); 3522 return this->EmptyExpression();
3496 } 3523 }
3497 3524
3498 3525
3499 template <class Traits> 3526 template <class Traits>
3500 void ParserBase<Traits>::ParseFormalParameter(Scope* scope, bool is_rest, 3527 void ParserBase<Traits>::ParseFormalParameter(
3501 ExpressionClassifier* classifier, 3528 bool is_rest, FormalParameterParsingStateT* parsing_state,
3502 bool* ok) { 3529 ExpressionClassifier* classifier, bool* ok) {
3503 // FormalParameter[Yield,GeneratorParameter] : 3530 // FormalParameter[Yield,GeneratorParameter] :
3504 // BindingElement[?Yield, ?GeneratorParameter] 3531 // BindingElement[?Yield, ?GeneratorParameter]
3505 3532
3506 Token::Value next = peek(); 3533 Token::Value next = peek();
3507 ExpressionT pattern = ParsePrimaryExpression(classifier, ok); 3534 ExpressionT pattern = ParsePrimaryExpression(classifier, ok);
3508 if (!*ok) return; 3535 if (!*ok) return;
3509 3536
3510 ValidateBindingPattern(classifier, ok); 3537 ValidateBindingPattern(classifier, ok);
3511 if (!*ok) return; 3538 if (!*ok) return;
3512 3539
3513 if (!allow_harmony_destructuring() && !Traits::IsIdentifier(pattern)) { 3540 if (!allow_harmony_destructuring() && !Traits::IsIdentifier(pattern)) {
3514 ReportUnexpectedToken(next); 3541 ReportUnexpectedToken(next);
3515 *ok = false; 3542 *ok = false;
3516 return; 3543 return;
3517 } 3544 }
3518 3545
3519 Traits::DeclareFormalParameter(scope, pattern, classifier, is_rest); 3546 if (parsing_state->is_simple_parameter_list) {
3547 parsing_state->is_simple_parameter_list =
3548 !is_rest && Traits::IsIdentifier(pattern);
3549 }
3550 parsing_state->has_rest = is_rest;
3551 if (is_rest && !Traits::IsIdentifier(pattern)) {
3552 ReportUnexpectedToken(next);
3553 *ok = false;
3554 return;
3555 }
3556 Traits::DeclareFormalParameter(parsing_state, pattern, classifier, is_rest);
3520 } 3557 }
3521 3558
3522 3559
3523 template <class Traits> 3560 template <class Traits>
3524 int ParserBase<Traits>::ParseFormalParameterList( 3561 int ParserBase<Traits>::ParseFormalParameterList(
3525 Scope* scope, bool* is_rest, ExpressionClassifier* classifier, bool* ok) { 3562 FormalParameterParsingStateT* parsing_state,
3563 ExpressionClassifier* classifier, bool* ok) {
3526 // FormalParameters[Yield,GeneratorParameter] : 3564 // FormalParameters[Yield,GeneratorParameter] :
3527 // [empty] 3565 // [empty]
3528 // FormalParameterList[?Yield, ?GeneratorParameter] 3566 // FormalParameterList[?Yield, ?GeneratorParameter]
3529 // 3567 //
3530 // FormalParameterList[Yield,GeneratorParameter] : 3568 // FormalParameterList[Yield,GeneratorParameter] :
3531 // FunctionRestParameter[?Yield] 3569 // FunctionRestParameter[?Yield]
3532 // FormalsList[?Yield, ?GeneratorParameter] 3570 // FormalsList[?Yield, ?GeneratorParameter]
3533 // FormalsList[?Yield, ?GeneratorParameter] , FunctionRestParameter[?Yield] 3571 // FormalsList[?Yield, ?GeneratorParameter] , FunctionRestParameter[?Yield]
3534 // 3572 //
3535 // FormalsList[Yield,GeneratorParameter] : 3573 // FormalsList[Yield,GeneratorParameter] :
3536 // FormalParameter[?Yield, ?GeneratorParameter] 3574 // FormalParameter[?Yield, ?GeneratorParameter]
3537 // FormalsList[?Yield, ?GeneratorParameter] , 3575 // FormalsList[?Yield, ?GeneratorParameter] ,
3538 // FormalParameter[?Yield,?GeneratorParameter] 3576 // FormalParameter[?Yield,?GeneratorParameter]
3539 3577
3540 int parameter_count = 0; 3578 int parameter_count = 0;
3541 3579
3542 if (peek() != Token::RPAREN) { 3580 if (peek() != Token::RPAREN) {
3543 do { 3581 do {
3544 if (++parameter_count > Code::kMaxArguments) { 3582 if (++parameter_count > Code::kMaxArguments) {
3545 ReportMessage(MessageTemplate::kTooManyParameters); 3583 ReportMessage(MessageTemplate::kTooManyParameters);
3546 *ok = false; 3584 *ok = false;
3547 return -1; 3585 return -1;
3548 } 3586 }
3549 *is_rest = allow_harmony_rest_params() && Check(Token::ELLIPSIS); 3587 bool is_rest = allow_harmony_rest_params() && Check(Token::ELLIPSIS);
3550 ParseFormalParameter(scope, *is_rest, classifier, ok); 3588 ParseFormalParameter(is_rest, parsing_state, classifier, ok);
3551 if (!*ok) return -1; 3589 if (!*ok) return -1;
3552 } while (!*is_rest && Check(Token::COMMA)); 3590 } while (!parsing_state->has_rest && Check(Token::COMMA));
3553 3591
3554 if (*is_rest && peek() == Token::COMMA) { 3592 if (parsing_state->has_rest && peek() == Token::COMMA) {
3555 ReportMessageAt(scanner()->peek_location(), 3593 ReportMessageAt(scanner()->peek_location(),
3556 MessageTemplate::kParamAfterRest); 3594 MessageTemplate::kParamAfterRest);
3557 *ok = false; 3595 *ok = false;
3558 return -1; 3596 return -1;
3559 } 3597 }
3560 } 3598 }
3561 3599
3562 return parameter_count; 3600 return parameter_count;
3563 } 3601 }
3564 3602
(...skipping 24 matching lines...) Expand all
3589 break; 3627 break;
3590 default: 3628 default:
3591 break; 3629 break;
3592 } 3630 }
3593 } 3631 }
3594 3632
3595 3633
3596 template <class Traits> 3634 template <class Traits>
3597 typename ParserBase<Traits>::ExpressionT 3635 typename ParserBase<Traits>::ExpressionT
3598 ParserBase<Traits>::ParseArrowFunctionLiteral( 3636 ParserBase<Traits>::ParseArrowFunctionLiteral(
3599 Scope* scope, bool has_rest, const ExpressionClassifier& formals_classifier, 3637 const FormalParameterParsingStateT& formal_parameters,
3600 bool* ok) { 3638 const ExpressionClassifier& formals_classifier, bool* ok) {
3601 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) { 3639 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) {
3602 // ASI inserts `;` after arrow parameters if a line terminator is found. 3640 // ASI inserts `;` after arrow parameters if a line terminator is found.
3603 // `=> ...` is never a valid expression, so report as syntax error. 3641 // `=> ...` is never a valid expression, so report as syntax error.
3604 // If next token is not `=>`, it's a syntax error anyways. 3642 // If next token is not `=>`, it's a syntax error anyways.
3605 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); 3643 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW);
3606 *ok = false; 3644 *ok = false;
3607 return this->EmptyExpression(); 3645 return this->EmptyExpression();
3608 } 3646 }
3609 3647
3610 typename Traits::Type::StatementList body; 3648 typename Traits::Type::StatementList body;
3611 int num_parameters = scope->num_parameters(); 3649 int num_parameters = formal_parameters.scope->num_parameters();
3612 int materialized_literal_count = -1; 3650 int materialized_literal_count = -1;
3613 int expected_property_count = -1; 3651 int expected_property_count = -1;
3614 Scanner::Location super_loc; 3652 Scanner::Location super_loc;
3615 3653
3616 { 3654 {
3617 typename Traits::Type::Factory function_factory(ast_value_factory()); 3655 typename Traits::Type::Factory function_factory(ast_value_factory());
3618 FunctionState function_state(&function_state_, &scope_, scope, 3656 FunctionState function_state(&function_state_, &scope_,
3619 kArrowFunction, &function_factory); 3657 formal_parameters.scope, kArrowFunction,
3658 &function_factory);
3620 3659
3621 Expect(Token::ARROW, CHECK_OK); 3660 Expect(Token::ARROW, CHECK_OK);
3622 3661
3623 if (peek() == Token::LBRACE) { 3662 if (peek() == Token::LBRACE) {
3624 // Multiple statement body 3663 // Multiple statement body
3625 Consume(Token::LBRACE); 3664 Consume(Token::LBRACE);
3626 bool is_lazily_parsed = 3665 bool is_lazily_parsed =
3627 (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation()); 3666 (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation());
3628 if (is_lazily_parsed) { 3667 if (is_lazily_parsed) {
3629 body = this->NewStatementList(0, zone()); 3668 body = this->NewStatementList(0, zone());
3630 this->SkipLazyFunctionBody(&materialized_literal_count, 3669 this->SkipLazyFunctionBody(&materialized_literal_count,
3631 &expected_property_count, CHECK_OK); 3670 &expected_property_count, CHECK_OK);
3632 } else { 3671 } else {
3633 body = this->ParseEagerFunctionBody( 3672 body = this->ParseEagerFunctionBody(
3634 this->EmptyIdentifier(), RelocInfo::kNoPosition, NULL, 3673 this->EmptyIdentifier(), RelocInfo::kNoPosition, formal_parameters,
3635 Token::INIT_VAR, kArrowFunction, CHECK_OK); 3674 NULL, Token::INIT_VAR, kArrowFunction, CHECK_OK);
3636 materialized_literal_count = 3675 materialized_literal_count =
3637 function_state.materialized_literal_count(); 3676 function_state.materialized_literal_count();
3638 expected_property_count = function_state.expected_property_count(); 3677 expected_property_count = function_state.expected_property_count();
3639 } 3678 }
3640 } else { 3679 } else {
3641 // Single-expression body 3680 // Single-expression body
3642 int pos = position(); 3681 int pos = position();
3643 parenthesized_function_ = false; 3682 parenthesized_function_ = false;
3644 ExpressionClassifier classifier; 3683 ExpressionClassifier classifier;
3645 ExpressionT expression = 3684 ExpressionT expression =
3646 ParseAssignmentExpression(true, &classifier, CHECK_OK); 3685 ParseAssignmentExpression(true, &classifier, CHECK_OK);
3647 ValidateExpression(&classifier, CHECK_OK); 3686 ValidateExpression(&classifier, CHECK_OK);
3648 body = this->NewStatementList(1, zone()); 3687 body = this->NewStatementList(1, zone());
3688 this->AddParameterInitializationBlock(formal_parameters, body, CHECK_OK);
3649 body->Add(factory()->NewReturnStatement(expression, pos), zone()); 3689 body->Add(factory()->NewReturnStatement(expression, pos), zone());
3650 materialized_literal_count = function_state.materialized_literal_count(); 3690 materialized_literal_count = function_state.materialized_literal_count();
3651 expected_property_count = function_state.expected_property_count(); 3691 expected_property_count = function_state.expected_property_count();
3652 } 3692 }
3653 super_loc = function_state.super_location(); 3693 super_loc = function_state.super_location();
3654 3694
3655 scope->set_end_position(scanner()->location().end_pos); 3695 formal_parameters.scope->set_end_position(scanner()->location().end_pos);
3656 3696
3657 // Arrow function formal parameters are parsed as StrictFormalParameterList, 3697 // Arrow function formal parameters are parsed as StrictFormalParameterList,
3658 // which is not the same as "parameters of a strict function"; it only means 3698 // which is not the same as "parameters of a strict function"; it only means
3659 // that duplicates are not allowed. Of course, the arrow function may 3699 // that duplicates are not allowed. Of course, the arrow function may
3660 // itself be strict as well. 3700 // itself be strict as well.
3661 const bool allow_duplicate_parameters = false; 3701 const bool allow_duplicate_parameters = false;
3662 this->ValidateFormalParameters(&formals_classifier, language_mode(), 3702 this->ValidateFormalParameters(&formals_classifier, language_mode(),
3663 allow_duplicate_parameters, CHECK_OK); 3703 allow_duplicate_parameters, CHECK_OK);
3664 3704
3665 // Validate strict mode. 3705 // Validate strict mode.
3666 if (is_strict(language_mode())) { 3706 if (is_strict(language_mode())) {
3667 CheckStrictOctalLiteral(scope->start_position(), 3707 CheckStrictOctalLiteral(formal_parameters.scope->start_position(),
3668 scanner()->location().end_pos, CHECK_OK); 3708 scanner()->location().end_pos, CHECK_OK);
3669 this->CheckConflictingVarDeclarations(scope, CHECK_OK); 3709 this->CheckConflictingVarDeclarations(formal_parameters.scope, CHECK_OK);
3670 } 3710 }
3671 } 3711 }
3672 3712
3673 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( 3713 FunctionLiteralT function_literal = factory()->NewFunctionLiteral(
3674 this->EmptyIdentifierString(), ast_value_factory(), scope, body, 3714 this->EmptyIdentifierString(), ast_value_factory(),
3675 materialized_literal_count, expected_property_count, num_parameters, 3715 formal_parameters.scope, body, materialized_literal_count,
3716 expected_property_count, num_parameters,
3676 FunctionLiteral::kNoDuplicateParameters, 3717 FunctionLiteral::kNoDuplicateParameters,
3677 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction, 3718 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction,
3678 FunctionLiteral::kShouldLazyCompile, FunctionKind::kArrowFunction, 3719 FunctionLiteral::kShouldLazyCompile, FunctionKind::kArrowFunction,
3679 scope->start_position()); 3720 formal_parameters.scope->start_position());
3680 3721
3681 function_literal->set_function_token_position(scope->start_position()); 3722 function_literal->set_function_token_position(
3723 formal_parameters.scope->start_position());
3682 if (super_loc.IsValid()) function_state_->set_super_location(super_loc); 3724 if (super_loc.IsValid()) function_state_->set_super_location(super_loc);
3683 3725
3684 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); 3726 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal);
3685 3727
3686 return function_literal; 3728 return function_literal;
3687 } 3729 }
3688 3730
3689 3731
3690 template <typename Traits> 3732 template <typename Traits>
3691 typename ParserBase<Traits>::ExpressionT 3733 typename ParserBase<Traits>::ExpressionT
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
3872 *ok = false; 3914 *ok = false;
3873 return; 3915 return;
3874 } 3916 }
3875 has_seen_constructor_ = true; 3917 has_seen_constructor_ = true;
3876 return; 3918 return;
3877 } 3919 }
3878 } 3920 }
3879 } } // v8::internal 3921 } } // v8::internal
3880 3922
3881 #endif // V8_PREPARSER_H 3923 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/pattern-rewriter.cc ('k') | src/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698