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

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: Done 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
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 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 !classifier->is_valid_strong_mode_formal_parameters()) { 550 !classifier->is_valid_strong_mode_formal_parameters()) {
549 ReportClassifierError(classifier->strong_mode_formal_parameter_error()); 551 ReportClassifierError(classifier->strong_mode_formal_parameter_error());
550 *ok = false; 552 *ok = false;
551 } 553 }
552 } 554 }
553 555
554 void ValidateArrowFormalParameters(const ExpressionClassifier* classifier, 556 void ValidateArrowFormalParameters(const ExpressionClassifier* classifier,
555 ExpressionT expr, bool* ok) { 557 ExpressionT expr, bool* ok) {
556 if (classifier->is_valid_binding_pattern()) { 558 if (classifier->is_valid_binding_pattern()) {
557 // A simple arrow formal parameter: IDENTIFIER => BODY. 559 // A simple arrow formal parameter: IDENTIFIER => BODY.
558 if (!allow_harmony_destructuring() && !this->IsIdentifier(expr)) { 560 if (!this->IsIdentifier(expr)) {
559 Traits::ReportMessageAt(scanner()->location(), 561 Traits::ReportMessageAt(scanner()->location(),
560 MessageTemplate::kUnexpectedToken, 562 MessageTemplate::kUnexpectedToken,
561 Token::String(scanner()->current_token())); 563 Token::String(scanner()->current_token()));
562 *ok = false; 564 *ok = false;
563 } 565 }
564 } else if (!classifier->is_valid_arrow_formal_parameters()) { 566 } else if (!classifier->is_valid_arrow_formal_parameters()) {
565 ReportClassifierError(classifier->arrow_formal_parameters_error()); 567 ReportClassifierError(classifier->arrow_formal_parameters_error());
566 *ok = false; 568 *ok = false;
567 } 569 }
568 } 570 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 ExpressionT ParseUnaryExpression(ExpressionClassifier* classifier, bool* ok); 639 ExpressionT ParseUnaryExpression(ExpressionClassifier* classifier, bool* ok);
638 ExpressionT ParsePostfixExpression(ExpressionClassifier* classifier, 640 ExpressionT ParsePostfixExpression(ExpressionClassifier* classifier,
639 bool* ok); 641 bool* ok);
640 ExpressionT ParseLeftHandSideExpression(ExpressionClassifier* classifier, 642 ExpressionT ParseLeftHandSideExpression(ExpressionClassifier* classifier,
641 bool* ok); 643 bool* ok);
642 ExpressionT ParseMemberWithNewPrefixesExpression( 644 ExpressionT ParseMemberWithNewPrefixesExpression(
643 ExpressionClassifier* classifier, bool* ok); 645 ExpressionClassifier* classifier, bool* ok);
644 ExpressionT ParseMemberExpression(ExpressionClassifier* classifier, bool* ok); 646 ExpressionT ParseMemberExpression(ExpressionClassifier* classifier, bool* ok);
645 ExpressionT ParseMemberExpressionContinuation( 647 ExpressionT ParseMemberExpressionContinuation(
646 ExpressionT expression, ExpressionClassifier* classifier, bool* ok); 648 ExpressionT expression, ExpressionClassifier* classifier, bool* ok);
647 ExpressionT ParseArrowFunctionLiteral(Scope* function_scope, bool has_rest, 649 ExpressionT ParseArrowFunctionLiteral(
648 const ExpressionClassifier& classifier, 650 const FormalParameterParsingStateT& parsing_state,
649 bool* ok); 651 const ExpressionClassifier& classifier, bool* ok);
650 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, 652 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start,
651 ExpressionClassifier* classifier, bool* ok); 653 ExpressionClassifier* classifier, bool* ok);
652 void AddTemplateExpression(ExpressionT); 654 void AddTemplateExpression(ExpressionT);
653 ExpressionT ParseSuperExpression(bool is_new, 655 ExpressionT ParseSuperExpression(bool is_new,
654 ExpressionClassifier* classifier, bool* ok); 656 ExpressionClassifier* classifier, bool* ok);
655 ExpressionT ParseNewTargetExpression(bool* ok); 657 ExpressionT ParseNewTargetExpression(bool* ok);
656 ExpressionT ParseStrongInitializationExpression( 658 ExpressionT ParseStrongInitializationExpression(
657 ExpressionClassifier* classifier, bool* ok); 659 ExpressionClassifier* classifier, bool* ok);
658 ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier, 660 ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier,
659 bool* ok); 661 bool* ok);
660 662
661 void ParseFormalParameter(Scope* scope, bool is_rest, 663 void ParseFormalParameter(bool is_rest,
664 FormalParameterParsingStateT* parsing_result,
662 ExpressionClassifier* classifier, bool* ok); 665 ExpressionClassifier* classifier, bool* ok);
663 int ParseFormalParameterList(Scope* scope, bool* has_rest, 666 int ParseFormalParameterList(FormalParameterParsingStateT* parsing_state,
664 ExpressionClassifier* classifier, bool* ok); 667 ExpressionClassifier* classifier, bool* ok);
665 void CheckArityRestrictions( 668 void CheckArityRestrictions(
666 int param_count, FunctionLiteral::ArityRestriction arity_restriction, 669 int param_count, FunctionLiteral::ArityRestriction arity_restriction,
667 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok); 670 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok);
668 671
669 // Checks if the expression is a valid reference expression (e.g., on the 672 // Checks if the expression is a valid reference expression (e.g., on the
670 // left-hand side of assignments). Although ruled out by ECMA as early errors, 673 // left-hand side of assignments). Although ruled out by ECMA as early errors,
671 // we allow calls for web compatibility and rewrite them to a runtime throw. 674 // we allow calls for web compatibility and rewrite them to a runtime throw.
672 ExpressionT CheckAndRewriteReferenceExpression( 675 ExpressionT CheckAndRewriteReferenceExpression(
673 ExpressionT expression, Scanner::Location location, 676 ExpressionT expression, Scanner::Location location,
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after
1245 // Return the object itself as AstVisitor and implement the needed 1248 // Return the object itself as AstVisitor and implement the needed
1246 // dummy method right in this class. 1249 // dummy method right in this class.
1247 PreParserFactory* visitor() { return this; } 1250 PreParserFactory* visitor() { return this; }
1248 int* ast_properties() { 1251 int* ast_properties() {
1249 static int dummy = 42; 1252 static int dummy = 42;
1250 return &dummy; 1253 return &dummy;
1251 } 1254 }
1252 }; 1255 };
1253 1256
1254 1257
1258 struct PreParserFormalParameterParsingState {
1259 explicit PreParserFormalParameterParsingState(Scope* scope)
1260 : scope(scope), has_rest(false), is_simple_parameter_list(true) {}
1261 Scope* scope;
1262 bool has_rest;
1263 bool is_simple_parameter_list;
1264 };
1265
1266
1255 class PreParser; 1267 class PreParser;
1256 1268
1257 class PreParserTraits { 1269 class PreParserTraits {
1258 public: 1270 public:
1259 struct Type { 1271 struct Type {
1260 // TODO(marja): To be removed. The Traits object should contain all the data 1272 // TODO(marja): To be removed. The Traits object should contain all the data
1261 // it needs. 1273 // it needs.
1262 typedef PreParser* Parser; 1274 typedef PreParser* Parser;
1263 1275
1264 // PreParser doesn't need to store generator variables. 1276 // PreParser doesn't need to store generator variables.
1265 typedef void GeneratorVariable; 1277 typedef void GeneratorVariable;
1266 1278
1267 typedef int AstProperties; 1279 typedef int AstProperties;
1268 1280
1269 // Return types for traversing functions. 1281 // Return types for traversing functions.
1270 typedef PreParserIdentifier Identifier; 1282 typedef PreParserIdentifier Identifier;
1271 typedef PreParserExpression Expression; 1283 typedef PreParserExpression Expression;
1272 typedef PreParserExpression YieldExpression; 1284 typedef PreParserExpression YieldExpression;
1273 typedef PreParserExpression FunctionLiteral; 1285 typedef PreParserExpression FunctionLiteral;
1274 typedef PreParserExpression ClassLiteral; 1286 typedef PreParserExpression ClassLiteral;
1275 typedef PreParserExpression ObjectLiteralProperty; 1287 typedef PreParserExpression ObjectLiteralProperty;
1276 typedef PreParserExpression Literal; 1288 typedef PreParserExpression Literal;
1277 typedef PreParserExpressionList ExpressionList; 1289 typedef PreParserExpressionList ExpressionList;
1278 typedef PreParserExpressionList PropertyList; 1290 typedef PreParserExpressionList PropertyList;
1279 typedef PreParserIdentifier FormalParameter; 1291 typedef PreParserIdentifier FormalParameter;
1280 typedef PreParserStatementList StatementList; 1292 typedef PreParserStatementList StatementList;
1293 typedef PreParserFormalParameterParsingState FormalParameterParsingState;
1281 1294
1282 // For constructing objects returned by the traversing functions. 1295 // For constructing objects returned by the traversing functions.
1283 typedef PreParserFactory Factory; 1296 typedef PreParserFactory Factory;
1284 }; 1297 };
1285 1298
1286 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} 1299 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {}
1287 1300
1288 // Helper functions for recursive descent. 1301 // Helper functions for recursive descent.
1289 static bool IsEval(PreParserIdentifier identifier) { 1302 static bool IsEval(PreParserIdentifier identifier) {
1290 return identifier.IsEval(); 1303 return identifier.IsEval();
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
1509 } 1522 }
1510 1523
1511 static PreParserStatementList NewStatementList(int size, Zone* zone) { 1524 static PreParserStatementList NewStatementList(int size, Zone* zone) {
1512 return PreParserStatementList(); 1525 return PreParserStatementList();
1513 } 1526 }
1514 1527
1515 static PreParserExpressionList NewPropertyList(int size, Zone* zone) { 1528 static PreParserExpressionList NewPropertyList(int size, Zone* zone) {
1516 return PreParserExpressionList(); 1529 return PreParserExpressionList();
1517 } 1530 }
1518 1531
1532 static void AddParameterInitializationBlock(
1533 const PreParserFormalParameterParsingState& formal_parameters,
1534 PreParserStatementList list, bool* ok) {}
1535
1519 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count, 1536 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count,
1520 int* expected_property_count, bool* ok) { 1537 int* expected_property_count, bool* ok) {
1521 UNREACHABLE(); 1538 UNREACHABLE();
1522 } 1539 }
1523 1540
1524 V8_INLINE PreParserStatementList 1541 V8_INLINE PreParserStatementList ParseEagerFunctionBody(
1525 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, 1542 PreParserIdentifier function_name, int pos,
1526 Variable* fvar, Token::Value fvar_init_op, 1543 const PreParserFormalParameterParsingState& formal_parameters,
1527 FunctionKind kind, bool* ok); 1544 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok);
1528 1545
1529 V8_INLINE void ParseArrowFunctionFormalParameters( 1546 V8_INLINE void ParseArrowFunctionFormalParameters(
1530 Scope* scope, PreParserExpression expression, 1547 PreParserFormalParameterParsingState* parsing_state,
1531 const Scanner::Location& params_loc, bool* has_rest, 1548 PreParserExpression expression, const Scanner::Location& params_loc,
1532 Scanner::Location* duplicate_loc, bool* ok); 1549 Scanner::Location* duplicate_loc, bool* ok);
1533 1550
1534 struct TemplateLiteralState {}; 1551 struct TemplateLiteralState {};
1535 1552
1536 TemplateLiteralState OpenTemplateLiteral(int pos) { 1553 TemplateLiteralState OpenTemplateLiteral(int pos) {
1537 return TemplateLiteralState(); 1554 return TemplateLiteralState();
1538 } 1555 }
1539 void AddTemplateSpan(TemplateLiteralState*, bool) {} 1556 void AddTemplateSpan(TemplateLiteralState*, bool) {}
1540 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} 1557 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {}
1541 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, 1558 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int,
1542 PreParserExpression tag) { 1559 PreParserExpression tag) {
1543 if (IsTaggedTemplate(tag)) { 1560 if (IsTaggedTemplate(tag)) {
1544 // Emulate generation of array literals for tag callsite 1561 // Emulate generation of array literals for tag callsite
1545 // 1st is array of cooked strings, second is array of raw strings 1562 // 1st is array of cooked strings, second is array of raw strings
1546 MaterializeTemplateCallsiteLiterals(); 1563 MaterializeTemplateCallsiteLiterals();
1547 } 1564 }
1548 return EmptyExpression(); 1565 return EmptyExpression();
1549 } 1566 }
1550 inline void MaterializeTemplateCallsiteLiterals(); 1567 inline void MaterializeTemplateCallsiteLiterals();
1551 PreParserExpression NoTemplateTag() { 1568 PreParserExpression NoTemplateTag() {
1552 return PreParserExpression::NoTemplateTag(); 1569 return PreParserExpression::NoTemplateTag();
1553 } 1570 }
1554 static bool IsTaggedTemplate(const PreParserExpression tag) { 1571 static bool IsTaggedTemplate(const PreParserExpression tag) {
1555 return !tag.IsNoTemplateTag(); 1572 return !tag.IsNoTemplateTag();
1556 } 1573 }
1557 1574
1558 void DeclareFormalParameter(Scope* scope, PreParserExpression pattern, 1575 void DeclareFormalParameter(void* parsing_state, PreParserExpression pattern,
1559 ExpressionClassifier* classifier, bool is_rest) {} 1576 ExpressionClassifier* classifier, bool is_rest) {}
1560 1577
1561 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {} 1578 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {}
1562 1579
1563 // Temporary glue; these functions will move to ParserBase. 1580 // Temporary glue; these functions will move to ParserBase.
1564 PreParserExpression ParseV8Intrinsic(bool* ok); 1581 PreParserExpression ParseV8Intrinsic(bool* ok);
1565 PreParserExpression ParseFunctionLiteral( 1582 PreParserExpression ParseFunctionLiteral(
1566 PreParserIdentifier name, Scanner::Location function_name_location, 1583 PreParserIdentifier name, Scanner::Location function_name_location,
1567 bool name_is_strict_reserved, FunctionKind kind, 1584 bool name_is_strict_reserved, FunctionKind kind,
1568 int function_token_position, FunctionLiteral::FunctionType type, 1585 int function_token_position, FunctionLiteral::FunctionType type,
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1699 Statement ParseTryStatement(bool* ok); 1716 Statement ParseTryStatement(bool* ok);
1700 Statement ParseDebuggerStatement(bool* ok); 1717 Statement ParseDebuggerStatement(bool* ok);
1701 Expression ParseConditionalExpression(bool accept_IN, bool* ok); 1718 Expression ParseConditionalExpression(bool accept_IN, bool* ok);
1702 Expression ParseObjectLiteral(bool* ok); 1719 Expression ParseObjectLiteral(bool* ok);
1703 Expression ParseV8Intrinsic(bool* ok); 1720 Expression ParseV8Intrinsic(bool* ok);
1704 1721
1705 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count, 1722 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count,
1706 int* expected_property_count, bool* ok); 1723 int* expected_property_count, bool* ok);
1707 V8_INLINE PreParserStatementList 1724 V8_INLINE PreParserStatementList
1708 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, 1725 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos,
1726 const FormalParameterParsingStateT& formal_parameters,
1709 Variable* fvar, Token::Value fvar_init_op, 1727 Variable* fvar, Token::Value fvar_init_op,
1710 FunctionKind kind, bool* ok); 1728 FunctionKind kind, bool* ok);
1711 1729
1712 Expression ParseFunctionLiteral( 1730 Expression ParseFunctionLiteral(
1713 Identifier name, Scanner::Location function_name_location, 1731 Identifier name, Scanner::Location function_name_location,
1714 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos, 1732 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos,
1715 FunctionLiteral::FunctionType function_type, 1733 FunctionLiteral::FunctionType function_type,
1716 FunctionLiteral::ArityRestriction arity_restriction, bool* ok); 1734 FunctionLiteral::ArityRestriction arity_restriction, bool* ok);
1717 void ParseLazyFunctionLiteralBody(bool* ok, 1735 void ParseLazyFunctionLiteralBody(bool* ok,
1718 Scanner::BookmarkScope* bookmark = nullptr); 1736 Scanner::BookmarkScope* bookmark = nullptr);
(...skipping 25 matching lines...) Expand all
1744 } 1762 }
1745 1763
1746 PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function, 1764 PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function,
1747 PreParserExpressionList args, 1765 PreParserExpressionList args,
1748 int pos) { 1766 int pos) {
1749 return pre_parser_->factory()->NewCallNew(function, args, pos); 1767 return pre_parser_->factory()->NewCallNew(function, args, pos);
1750 } 1768 }
1751 1769
1752 1770
1753 void PreParserTraits::ParseArrowFunctionFormalParameters( 1771 void PreParserTraits::ParseArrowFunctionFormalParameters(
1754 Scope* scope, PreParserExpression params, 1772 PreParserFormalParameterParsingState* parsing_state,
1755 const Scanner::Location& params_loc, bool* has_rest, 1773 PreParserExpression params, const Scanner::Location& params_loc,
1756 Scanner::Location* duplicate_loc, bool* ok) { 1774 Scanner::Location* duplicate_loc, bool* ok) {
1757 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter 1775 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter
1758 // lists that are too long. 1776 // lists that are too long.
1759 } 1777 }
1760 1778
1761 1779
1762 PreParserStatementList PreParser::ParseEagerFunctionBody( 1780 PreParserStatementList PreParser::ParseEagerFunctionBody(
1763 PreParserIdentifier function_name, int pos, Variable* fvar, 1781 PreParserIdentifier function_name, int pos,
1764 Token::Value fvar_init_op, FunctionKind kind, bool* ok) { 1782 const PreParserFormalParameterParsingState& formal_parameters,
1783 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok) {
1765 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); 1784 ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
1766 1785
1767 ParseStatementList(Token::RBRACE, ok); 1786 ParseStatementList(Token::RBRACE, ok);
1768 if (!*ok) return PreParserStatementList(); 1787 if (!*ok) return PreParserStatementList();
1769 1788
1770 Expect(Token::RBRACE, ok); 1789 Expect(Token::RBRACE, ok);
1771 return PreParserStatementList(); 1790 return PreParserStatementList();
1772 } 1791 }
1773 1792
1774 1793
1775 PreParserStatementList PreParserTraits::ParseEagerFunctionBody( 1794 PreParserStatementList PreParserTraits::ParseEagerFunctionBody(
1776 PreParserIdentifier function_name, int pos, Variable* fvar, 1795 PreParserIdentifier function_name, int pos,
1777 Token::Value fvar_init_op, FunctionKind kind, bool* ok) { 1796 const PreParserFormalParameterParsingState& formal_parameters,
1778 return pre_parser_->ParseEagerFunctionBody(function_name, pos, fvar, 1797 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok) {
1779 fvar_init_op, kind, ok); 1798 return pre_parser_->ParseEagerFunctionBody(
1799 function_name, pos, formal_parameters, fvar, fvar_init_op, kind, ok);
1780 } 1800 }
1781 1801
1782 1802
1783 template <class Traits> 1803 template <class Traits>
1784 ParserBase<Traits>::FunctionState::FunctionState( 1804 ParserBase<Traits>::FunctionState::FunctionState(
1785 FunctionState** function_state_stack, Scope** scope_stack, Scope* scope, 1805 FunctionState** function_state_stack, Scope** scope_stack, Scope* scope,
1786 FunctionKind kind, typename Traits::Type::Factory* factory) 1806 FunctionKind kind, typename Traits::Type::Factory* factory)
1787 : next_materialized_literal_index_(0), 1807 : next_materialized_literal_index_(0),
1788 expected_property_count_(0), 1808 expected_property_count_(0),
1789 this_location_(Scanner::Location::invalid()), 1809 this_location_(Scanner::Location::invalid()),
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
2147 } 2167 }
2148 BindingPatternUnexpectedToken(classifier); 2168 BindingPatternUnexpectedToken(classifier);
2149 Consume(Token::LPAREN); 2169 Consume(Token::LPAREN);
2150 if (allow_harmony_arrow_functions() && Check(Token::RPAREN)) { 2170 if (allow_harmony_arrow_functions() && Check(Token::RPAREN)) {
2151 // As a primary expression, the only thing that can follow "()" is "=>". 2171 // As a primary expression, the only thing that can follow "()" is "=>".
2152 classifier->RecordBindingPatternError(scanner()->location(), 2172 classifier->RecordBindingPatternError(scanner()->location(),
2153 MessageTemplate::kUnexpectedToken, 2173 MessageTemplate::kUnexpectedToken,
2154 Token::String(Token::RPAREN)); 2174 Token::String(Token::RPAREN));
2155 Scope* scope = 2175 Scope* scope =
2156 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); 2176 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction);
2177 FormalParameterParsingStateT parsing_state(scope);
2157 scope->set_start_position(beg_pos); 2178 scope->set_start_position(beg_pos);
2158 ExpressionClassifier args_classifier; 2179 ExpressionClassifier args_classifier;
2159 bool has_rest = false; 2180 result = this->ParseArrowFunctionLiteral(parsing_state, args_classifier,
2160 result = this->ParseArrowFunctionLiteral(scope, has_rest, 2181 CHECK_OK);
2161 args_classifier, CHECK_OK);
2162 } else if (allow_harmony_arrow_functions() && 2182 } else if (allow_harmony_arrow_functions() &&
2163 allow_harmony_rest_params() && Check(Token::ELLIPSIS)) { 2183 allow_harmony_rest_params() && Check(Token::ELLIPSIS)) {
2164 // (...x) => y 2184 // (...x) => y
2165 Scope* scope = 2185 Scope* scope =
2166 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); 2186 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction);
2187 FormalParameterParsingStateT parsing_state(scope);
2167 scope->set_start_position(beg_pos); 2188 scope->set_start_position(beg_pos);
2168 ExpressionClassifier args_classifier; 2189 ExpressionClassifier args_classifier;
2169 const bool has_rest = true; 2190 const bool is_rest = true;
2170 this->ParseFormalParameter(scope, has_rest, &args_classifier, CHECK_OK); 2191 this->ParseFormalParameter(is_rest, &parsing_state, &args_classifier,
2192 CHECK_OK);
2171 if (peek() == Token::COMMA) { 2193 if (peek() == Token::COMMA) {
2172 ReportMessageAt(scanner()->peek_location(), 2194 ReportMessageAt(scanner()->peek_location(),
2173 MessageTemplate::kParamAfterRest); 2195 MessageTemplate::kParamAfterRest);
2174 *ok = false; 2196 *ok = false;
2175 return this->EmptyExpression(); 2197 return this->EmptyExpression();
2176 } 2198 }
2177 Expect(Token::RPAREN, CHECK_OK); 2199 Expect(Token::RPAREN, CHECK_OK);
2178 result = this->ParseArrowFunctionLiteral(scope, has_rest, 2200 result = this->ParseArrowFunctionLiteral(parsing_state, args_classifier,
2179 args_classifier, CHECK_OK); 2201 CHECK_OK);
2180 } else { 2202 } else {
2181 // Heuristically try to detect immediately called functions before 2203 // Heuristically try to detect immediately called functions before
2182 // seeing the call parentheses. 2204 // seeing the call parentheses.
2183 parenthesized_function_ = (peek() == Token::FUNCTION); 2205 parenthesized_function_ = (peek() == Token::FUNCTION);
2184 result = this->ParseExpression(true, classifier, CHECK_OK); 2206 result = this->ParseExpression(true, classifier, CHECK_OK);
2185 Expect(Token::RPAREN, CHECK_OK); 2207 Expect(Token::RPAREN, CHECK_OK);
2186 } 2208 }
2187 break; 2209 break;
2188 2210
2189 case Token::CLASS: { 2211 case Token::CLASS: {
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
2384 return expression; 2406 return expression;
2385 } 2407 }
2386 2408
2387 // Fall through. 2409 // Fall through.
2388 case Token::STATIC: 2410 case Token::STATIC:
2389 *is_static = true; 2411 *is_static = true;
2390 2412
2391 // Fall through. 2413 // Fall through.
2392 default: 2414 default:
2393 *name = ParseIdentifierNameOrGetOrSet(is_get, is_set, CHECK_OK); 2415 *name = ParseIdentifierNameOrGetOrSet(is_get, is_set, CHECK_OK);
2416 if (classifier->duplicate_finder() != nullptr && !*is_get && !*is_set &&
2417 scanner()->FindSymbol(classifier->duplicate_finder(), 1) != 0) {
2418 classifier->RecordDuplicateFormalParameterError(scanner()->location());
arv (Not doing code reviews) 2015/06/19 19:25:26 The following is not supposed to be an error. f
Dmitry Lomov (no reviews) 2015/06/22 10:14:10 Done.
2419 }
2394 break; 2420 break;
2395 } 2421 }
2396 2422
2397 uint32_t index; 2423 uint32_t index;
2398 return this->IsArrayIndex(*name, &index) 2424 return this->IsArrayIndex(*name, &index)
2399 ? factory()->NewNumberLiteral(index, pos) 2425 ? factory()->NewNumberLiteral(index, pos)
2400 : factory()->NewStringLiteral(*name, pos); 2426 : factory()->NewStringLiteral(*name, pos);
2401 } 2427 }
2402 2428
2403 2429
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
2711 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) { 2737 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) {
2712 checkpoint.Restore(); 2738 checkpoint.Restore();
2713 BindingPatternUnexpectedToken(classifier); 2739 BindingPatternUnexpectedToken(classifier);
2714 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, 2740 ValidateArrowFormalParameters(&arrow_formals_classifier, expression,
2715 CHECK_OK); 2741 CHECK_OK);
2716 Scanner::Location loc(lhs_location.beg_pos, scanner()->location().end_pos); 2742 Scanner::Location loc(lhs_location.beg_pos, scanner()->location().end_pos);
2717 Scope* scope = 2743 Scope* scope =
2718 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); 2744 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction);
2719 scope->set_start_position(lhs_location.beg_pos); 2745 scope->set_start_position(lhs_location.beg_pos);
2720 Scanner::Location duplicate_loc = Scanner::Location::invalid(); 2746 Scanner::Location duplicate_loc = Scanner::Location::invalid();
2721 bool has_rest = false; 2747 FormalParameterParsingStateT parsing_state(scope);
2722 this->ParseArrowFunctionFormalParameters(scope, expression, loc, &has_rest, 2748 this->ParseArrowFunctionFormalParameters(&parsing_state, expression, loc,
2723 &duplicate_loc, CHECK_OK); 2749 &duplicate_loc, CHECK_OK);
2724 if (duplicate_loc.IsValid()) { 2750 if (duplicate_loc.IsValid()) {
2725 arrow_formals_classifier.RecordDuplicateFormalParameterError( 2751 arrow_formals_classifier.RecordDuplicateFormalParameterError(
2726 duplicate_loc); 2752 duplicate_loc);
2727 } 2753 }
2728 expression = this->ParseArrowFunctionLiteral( 2754 expression = this->ParseArrowFunctionLiteral(
2729 scope, has_rest, arrow_formals_classifier, CHECK_OK); 2755 parsing_state, arrow_formals_classifier, CHECK_OK);
2730 return expression; 2756 return expression;
2731 } 2757 }
2732 2758
2733 // "expression" was not itself an arrow function parameter list, but it might 2759 // "expression" was not itself an arrow function parameter list, but it might
2734 // form part of one. Propagate speculative formal parameter error locations. 2760 // form part of one. Propagate speculative formal parameter error locations.
2735 classifier->Accumulate(arrow_formals_classifier, 2761 classifier->Accumulate(arrow_formals_classifier,
2736 ExpressionClassifier::StandardProductions | 2762 ExpressionClassifier::StandardProductions |
2737 ExpressionClassifier::FormalParametersProductions); 2763 ExpressionClassifier::FormalParametersProductions);
2738 2764
2739 if (!Token::IsAssignmentOp(peek())) { 2765 if (!Token::IsAssignmentOp(peek())) {
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after
3482 default: 3508 default:
3483 return expression; 3509 return expression;
3484 } 3510 }
3485 } 3511 }
3486 DCHECK(false); 3512 DCHECK(false);
3487 return this->EmptyExpression(); 3513 return this->EmptyExpression();
3488 } 3514 }
3489 3515
3490 3516
3491 template <class Traits> 3517 template <class Traits>
3492 void ParserBase<Traits>::ParseFormalParameter(Scope* scope, bool is_rest, 3518 void ParserBase<Traits>::ParseFormalParameter(
3493 ExpressionClassifier* classifier, 3519 bool is_rest, FormalParameterParsingStateT* parsing_state,
3494 bool* ok) { 3520 ExpressionClassifier* classifier, bool* ok) {
3495 // FormalParameter[Yield,GeneratorParameter] : 3521 // FormalParameter[Yield,GeneratorParameter] :
3496 // BindingElement[?Yield, ?GeneratorParameter] 3522 // BindingElement[?Yield, ?GeneratorParameter]
wingo 2015/06/22 10:22:14 if is_rest is true then we are parsing BindingRest
3497 3523
3498 Token::Value next = peek(); 3524 Token::Value next = peek();
3499 ExpressionT pattern = ParsePrimaryExpression(classifier, ok); 3525 ExpressionT pattern = ParsePrimaryExpression(classifier, ok);
3500 if (!*ok) return; 3526 if (!*ok) return;
3501 3527
3502 ValidateBindingPattern(classifier, ok); 3528 ValidateBindingPattern(classifier, ok);
3503 if (!*ok) return; 3529 if (!*ok) return;
3504 3530
3505 if (!allow_harmony_destructuring() && !Traits::IsIdentifier(pattern)) { 3531 if (!allow_harmony_destructuring() && !Traits::IsIdentifier(pattern)) {
3506 ReportUnexpectedToken(next); 3532 ReportUnexpectedToken(next);
3507 *ok = false; 3533 *ok = false;
3508 return; 3534 return;
3509 } 3535 }
3510 3536
3511 Traits::DeclareFormalParameter(scope, pattern, classifier, is_rest); 3537 if (parsing_state->is_simple_parameter_list) {
3538 parsing_state->is_simple_parameter_list =
3539 !is_rest && Traits::IsIdentifier(pattern);
3540 }
3541 parsing_state->has_rest = is_rest;
3542 Traits::DeclareFormalParameter(parsing_state, pattern, classifier, is_rest);
3512 } 3543 }
3513 3544
3514 3545
3515 template <class Traits> 3546 template <class Traits>
3516 int ParserBase<Traits>::ParseFormalParameterList( 3547 int ParserBase<Traits>::ParseFormalParameterList(
3517 Scope* scope, bool* is_rest, ExpressionClassifier* classifier, bool* ok) { 3548 FormalParameterParsingStateT* parsing_state,
3549 ExpressionClassifier* classifier, bool* ok) {
3518 // FormalParameters[Yield,GeneratorParameter] : 3550 // FormalParameters[Yield,GeneratorParameter] :
3519 // [empty] 3551 // [empty]
3520 // FormalParameterList[?Yield, ?GeneratorParameter] 3552 // FormalParameterList[?Yield, ?GeneratorParameter]
3521 // 3553 //
3522 // FormalParameterList[Yield,GeneratorParameter] : 3554 // FormalParameterList[Yield,GeneratorParameter] :
3523 // FunctionRestParameter[?Yield] 3555 // FunctionRestParameter[?Yield]
3524 // FormalsList[?Yield, ?GeneratorParameter] 3556 // FormalsList[?Yield, ?GeneratorParameter]
3525 // FormalsList[?Yield, ?GeneratorParameter] , FunctionRestParameter[?Yield] 3557 // FormalsList[?Yield, ?GeneratorParameter] , FunctionRestParameter[?Yield]
3526 // 3558 //
3527 // FormalsList[Yield,GeneratorParameter] : 3559 // FormalsList[Yield,GeneratorParameter] :
3528 // FormalParameter[?Yield, ?GeneratorParameter] 3560 // FormalParameter[?Yield, ?GeneratorParameter]
3529 // FormalsList[?Yield, ?GeneratorParameter] , 3561 // FormalsList[?Yield, ?GeneratorParameter] ,
3530 // FormalParameter[?Yield,?GeneratorParameter] 3562 // FormalParameter[?Yield,?GeneratorParameter]
3531 3563
3532 int parameter_count = 0; 3564 int parameter_count = 0;
3533 3565
3534 if (peek() != Token::RPAREN) { 3566 if (peek() != Token::RPAREN) {
3535 do { 3567 do {
3536 if (++parameter_count > Code::kMaxArguments) { 3568 if (++parameter_count > Code::kMaxArguments) {
3537 ReportMessage(MessageTemplate::kTooManyParameters); 3569 ReportMessage(MessageTemplate::kTooManyParameters);
3538 *ok = false; 3570 *ok = false;
3539 return -1; 3571 return -1;
3540 } 3572 }
3541 *is_rest = allow_harmony_rest_params() && Check(Token::ELLIPSIS); 3573 bool is_rest = allow_harmony_rest_params() && Check(Token::ELLIPSIS);
3542 ParseFormalParameter(scope, *is_rest, classifier, ok); 3574 ParseFormalParameter(is_rest, parsing_state, classifier, ok);
3543 if (!*ok) return -1; 3575 if (!*ok) return -1;
3544 } while (!*is_rest && Check(Token::COMMA)); 3576 } while (!parsing_state->has_rest && Check(Token::COMMA));
3545 3577
3546 if (*is_rest && peek() == Token::COMMA) { 3578 if (parsing_state->has_rest && peek() == Token::COMMA) {
3547 ReportMessageAt(scanner()->peek_location(), 3579 ReportMessageAt(scanner()->peek_location(),
3548 MessageTemplate::kParamAfterRest); 3580 MessageTemplate::kParamAfterRest);
3549 *ok = false; 3581 *ok = false;
3550 return -1; 3582 return -1;
3551 } 3583 }
3552 } 3584 }
3553 3585
3554 return parameter_count; 3586 return parameter_count;
3555 } 3587 }
3556 3588
(...skipping 24 matching lines...) Expand all
3581 break; 3613 break;
3582 default: 3614 default:
3583 break; 3615 break;
3584 } 3616 }
3585 } 3617 }
3586 3618
3587 3619
3588 template <class Traits> 3620 template <class Traits>
3589 typename ParserBase<Traits>::ExpressionT 3621 typename ParserBase<Traits>::ExpressionT
3590 ParserBase<Traits>::ParseArrowFunctionLiteral( 3622 ParserBase<Traits>::ParseArrowFunctionLiteral(
3591 Scope* scope, bool has_rest, const ExpressionClassifier& formals_classifier, 3623 const FormalParameterParsingStateT& formal_parameters,
3592 bool* ok) { 3624 const ExpressionClassifier& formals_classifier, bool* ok) {
3593 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) { 3625 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) {
3594 // ASI inserts `;` after arrow parameters if a line terminator is found. 3626 // ASI inserts `;` after arrow parameters if a line terminator is found.
3595 // `=> ...` is never a valid expression, so report as syntax error. 3627 // `=> ...` is never a valid expression, so report as syntax error.
3596 // If next token is not `=>`, it's a syntax error anyways. 3628 // If next token is not `=>`, it's a syntax error anyways.
3597 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); 3629 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW);
3598 *ok = false; 3630 *ok = false;
3599 return this->EmptyExpression(); 3631 return this->EmptyExpression();
3600 } 3632 }
3601 3633
3602 typename Traits::Type::StatementList body; 3634 typename Traits::Type::StatementList body;
3603 int num_parameters = scope->num_parameters(); 3635 int num_parameters = formal_parameters.scope->num_parameters();
3604 int materialized_literal_count = -1; 3636 int materialized_literal_count = -1;
3605 int expected_property_count = -1; 3637 int expected_property_count = -1;
3606 Scanner::Location super_loc; 3638 Scanner::Location super_loc;
3607 3639
3608 { 3640 {
3609 typename Traits::Type::Factory function_factory(ast_value_factory()); 3641 typename Traits::Type::Factory function_factory(ast_value_factory());
3610 FunctionState function_state(&function_state_, &scope_, scope, 3642 FunctionState function_state(&function_state_, &scope_,
3611 kArrowFunction, &function_factory); 3643 formal_parameters.scope, kArrowFunction,
3644 &function_factory);
3612 3645
3613 Expect(Token::ARROW, CHECK_OK); 3646 Expect(Token::ARROW, CHECK_OK);
3614 3647
3615 if (peek() == Token::LBRACE) { 3648 if (peek() == Token::LBRACE) {
3616 // Multiple statement body 3649 // Multiple statement body
3617 Consume(Token::LBRACE); 3650 Consume(Token::LBRACE);
3618 bool is_lazily_parsed = 3651 bool is_lazily_parsed =
3619 (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation()); 3652 (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation());
3620 if (is_lazily_parsed) { 3653 if (is_lazily_parsed) {
3621 body = this->NewStatementList(0, zone()); 3654 body = this->NewStatementList(0, zone());
3622 this->SkipLazyFunctionBody(&materialized_literal_count, 3655 this->SkipLazyFunctionBody(&materialized_literal_count,
3623 &expected_property_count, CHECK_OK); 3656 &expected_property_count, CHECK_OK);
3624 } else { 3657 } else {
3625 body = this->ParseEagerFunctionBody( 3658 body = this->ParseEagerFunctionBody(
3626 this->EmptyIdentifier(), RelocInfo::kNoPosition, NULL, 3659 this->EmptyIdentifier(), RelocInfo::kNoPosition, formal_parameters,
3627 Token::INIT_VAR, kArrowFunction, CHECK_OK); 3660 NULL, Token::INIT_VAR, kArrowFunction, CHECK_OK);
wingo 2015/06/22 10:22:14 Nit: const Variable *name = nullptr, pass by name?
3628 materialized_literal_count = 3661 materialized_literal_count =
3629 function_state.materialized_literal_count(); 3662 function_state.materialized_literal_count();
3630 expected_property_count = function_state.expected_property_count(); 3663 expected_property_count = function_state.expected_property_count();
3631 } 3664 }
3632 } else { 3665 } else {
3633 // Single-expression body 3666 // Single-expression body
3634 int pos = position(); 3667 int pos = position();
3635 parenthesized_function_ = false; 3668 parenthesized_function_ = false;
3636 ExpressionClassifier classifier; 3669 ExpressionClassifier classifier;
3637 ExpressionT expression = 3670 ExpressionT expression =
3638 ParseAssignmentExpression(true, &classifier, CHECK_OK); 3671 ParseAssignmentExpression(true, &classifier, CHECK_OK);
3639 ValidateExpression(&classifier, CHECK_OK); 3672 ValidateExpression(&classifier, CHECK_OK);
3640 body = this->NewStatementList(1, zone()); 3673 body = this->NewStatementList(1, zone());
3674 this->AddParameterInitializationBlock(formal_parameters, body, CHECK_OK);
3641 body->Add(factory()->NewReturnStatement(expression, pos), zone()); 3675 body->Add(factory()->NewReturnStatement(expression, pos), zone());
3642 materialized_literal_count = function_state.materialized_literal_count(); 3676 materialized_literal_count = function_state.materialized_literal_count();
3643 expected_property_count = function_state.expected_property_count(); 3677 expected_property_count = function_state.expected_property_count();
3644 } 3678 }
3645 super_loc = function_state.super_location(); 3679 super_loc = function_state.super_location();
3646 3680
3647 scope->set_end_position(scanner()->location().end_pos); 3681 formal_parameters.scope->set_end_position(scanner()->location().end_pos);
3648 3682
3649 // Arrow function formal parameters are parsed as StrictFormalParameterList, 3683 // Arrow function formal parameters are parsed as StrictFormalParameterList,
3650 // which is not the same as "parameters of a strict function"; it only means 3684 // which is not the same as "parameters of a strict function"; it only means
3651 // that duplicates are not allowed. Of course, the arrow function may 3685 // that duplicates are not allowed. Of course, the arrow function may
3652 // itself be strict as well. 3686 // itself be strict as well.
3653 const bool allow_duplicate_parameters = false; 3687 const bool allow_duplicate_parameters = false;
3654 this->ValidateFormalParameters(&formals_classifier, language_mode(), 3688 this->ValidateFormalParameters(&formals_classifier, language_mode(),
3655 allow_duplicate_parameters, CHECK_OK); 3689 allow_duplicate_parameters, CHECK_OK);
3656 3690
3657 // Validate strict mode. 3691 // Validate strict mode.
3658 if (is_strict(language_mode())) { 3692 if (is_strict(language_mode())) {
3659 CheckStrictOctalLiteral(scope->start_position(), 3693 CheckStrictOctalLiteral(formal_parameters.scope->start_position(),
3660 scanner()->location().end_pos, CHECK_OK); 3694 scanner()->location().end_pos, CHECK_OK);
3661 this->CheckConflictingVarDeclarations(scope, CHECK_OK); 3695 this->CheckConflictingVarDeclarations(formal_parameters.scope, CHECK_OK);
3662 } 3696 }
3663 } 3697 }
3664 3698
3665 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( 3699 FunctionLiteralT function_literal = factory()->NewFunctionLiteral(
3666 this->EmptyIdentifierString(), ast_value_factory(), scope, body, 3700 this->EmptyIdentifierString(), ast_value_factory(),
3667 materialized_literal_count, expected_property_count, num_parameters, 3701 formal_parameters.scope, body, materialized_literal_count,
3702 expected_property_count, num_parameters,
3668 FunctionLiteral::kNoDuplicateParameters, 3703 FunctionLiteral::kNoDuplicateParameters,
3669 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction, 3704 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction,
3670 FunctionLiteral::kShouldLazyCompile, FunctionKind::kArrowFunction, 3705 FunctionLiteral::kShouldLazyCompile, FunctionKind::kArrowFunction,
3671 scope->start_position()); 3706 formal_parameters.scope->start_position());
3672 3707
3673 function_literal->set_function_token_position(scope->start_position()); 3708 function_literal->set_function_token_position(
3709 formal_parameters.scope->start_position());
3674 if (super_loc.IsValid()) function_state_->set_super_location(super_loc); 3710 if (super_loc.IsValid()) function_state_->set_super_location(super_loc);
3675 3711
3676 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); 3712 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal);
3677 3713
3678 return function_literal; 3714 return function_literal;
3679 } 3715 }
3680 3716
3681 3717
3682 template <typename Traits> 3718 template <typename Traits>
3683 typename ParserBase<Traits>::ExpressionT 3719 typename ParserBase<Traits>::ExpressionT
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
3864 *ok = false; 3900 *ok = false;
3865 return; 3901 return;
3866 } 3902 }
3867 has_seen_constructor_ = true; 3903 has_seen_constructor_ = true;
3868 return; 3904 return;
3869 } 3905 }
3870 } 3906 }
3871 } } // v8::internal 3907 } } // v8::internal
3872 3908
3873 #endif // V8_PREPARSER_H 3909 #endif // V8_PREPARSER_H
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698