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 1510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1521 UNREACHABLE(); | 1521 UNREACHABLE(); |
1522 } | 1522 } |
1523 | 1523 |
1524 V8_INLINE PreParserStatementList | 1524 V8_INLINE PreParserStatementList |
1525 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, | 1525 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, |
1526 Variable* fvar, Token::Value fvar_init_op, | 1526 Variable* fvar, Token::Value fvar_init_op, |
1527 FunctionKind kind, bool* ok); | 1527 FunctionKind kind, bool* ok); |
1528 | 1528 |
1529 V8_INLINE void ParseArrowFunctionFormalParameters( | 1529 V8_INLINE void ParseArrowFunctionFormalParameters( |
1530 Scope* scope, PreParserExpression expression, | 1530 Scope* scope, PreParserExpression expression, |
1531 const Scanner::Location& params_loc, bool* is_rest, | 1531 const Scanner::Location& params_loc, bool* has_rest, |
1532 Scanner::Location* duplicate_loc, bool* ok); | 1532 Scanner::Location* duplicate_loc, bool* ok); |
1533 | 1533 |
1534 struct TemplateLiteralState {}; | 1534 struct TemplateLiteralState {}; |
1535 | 1535 |
1536 TemplateLiteralState OpenTemplateLiteral(int pos) { | 1536 TemplateLiteralState OpenTemplateLiteral(int pos) { |
1537 return TemplateLiteralState(); | 1537 return TemplateLiteralState(); |
1538 } | 1538 } |
1539 void AddTemplateSpan(TemplateLiteralState*, bool) {} | 1539 void AddTemplateSpan(TemplateLiteralState*, bool) {} |
1540 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} | 1540 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} |
1541 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, | 1541 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1745 | 1745 |
1746 PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function, | 1746 PreParserExpression PreParserTraits::SpreadCallNew(PreParserExpression function, |
1747 PreParserExpressionList args, | 1747 PreParserExpressionList args, |
1748 int pos) { | 1748 int pos) { |
1749 return pre_parser_->factory()->NewCallNew(function, args, pos); | 1749 return pre_parser_->factory()->NewCallNew(function, args, pos); |
1750 } | 1750 } |
1751 | 1751 |
1752 | 1752 |
1753 void PreParserTraits::ParseArrowFunctionFormalParameters( | 1753 void PreParserTraits::ParseArrowFunctionFormalParameters( |
1754 Scope* scope, PreParserExpression params, | 1754 Scope* scope, PreParserExpression params, |
1755 const Scanner::Location& params_loc, bool* is_rest, | 1755 const Scanner::Location& params_loc, bool* has_rest, |
1756 Scanner::Location* duplicate_loc, bool* ok) { | 1756 Scanner::Location* duplicate_loc, bool* ok) { |
1757 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter | 1757 // TODO(wingo): Detect duplicated identifiers in paramlists. Detect parameter |
1758 // lists that are too long. | 1758 // lists that are too long. |
1759 } | 1759 } |
1760 | 1760 |
1761 | 1761 |
1762 PreParserStatementList PreParser::ParseEagerFunctionBody( | 1762 PreParserStatementList PreParser::ParseEagerFunctionBody( |
1763 PreParserIdentifier function_name, int pos, Variable* fvar, | 1763 PreParserIdentifier function_name, int pos, Variable* fvar, |
1764 Token::Value fvar_init_op, FunctionKind kind, bool* ok) { | 1764 Token::Value fvar_init_op, FunctionKind kind, bool* ok) { |
1765 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); | 1765 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2152 classifier->RecordBindingPatternError(scanner()->location(), | 2152 classifier->RecordBindingPatternError(scanner()->location(), |
2153 MessageTemplate::kUnexpectedToken, | 2153 MessageTemplate::kUnexpectedToken, |
2154 Token::String(Token::RPAREN)); | 2154 Token::String(Token::RPAREN)); |
2155 Scope* scope = | 2155 Scope* scope = |
2156 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); | 2156 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); |
2157 scope->set_start_position(beg_pos); | 2157 scope->set_start_position(beg_pos); |
2158 ExpressionClassifier args_classifier; | 2158 ExpressionClassifier args_classifier; |
2159 bool has_rest = false; | 2159 bool has_rest = false; |
2160 result = this->ParseArrowFunctionLiteral(scope, has_rest, | 2160 result = this->ParseArrowFunctionLiteral(scope, has_rest, |
2161 args_classifier, CHECK_OK); | 2161 args_classifier, CHECK_OK); |
| 2162 } else if (allow_harmony_arrow_functions() && |
| 2163 allow_harmony_rest_params() && Check(Token::ELLIPSIS)) { |
| 2164 // (...x) => y |
| 2165 Scope* scope = |
| 2166 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); |
| 2167 scope->set_start_position(beg_pos); |
| 2168 ExpressionClassifier args_classifier; |
| 2169 const bool has_rest = true; |
| 2170 this->ParseFormalParameter(scope, has_rest, &args_classifier, CHECK_OK); |
| 2171 if (peek() == Token::COMMA) { |
| 2172 ReportMessageAt(scanner()->peek_location(), |
| 2173 MessageTemplate::kParamAfterRest); |
| 2174 *ok = false; |
| 2175 return this->EmptyExpression(); |
| 2176 } |
| 2177 Expect(Token::RPAREN, CHECK_OK); |
| 2178 result = this->ParseArrowFunctionLiteral(scope, has_rest, |
| 2179 args_classifier, CHECK_OK); |
2162 } else { | 2180 } else { |
2163 // Heuristically try to detect immediately called functions before | 2181 // Heuristically try to detect immediately called functions before |
2164 // seeing the call parentheses. | 2182 // seeing the call parentheses. |
2165 parenthesized_function_ = (peek() == Token::FUNCTION); | 2183 parenthesized_function_ = (peek() == Token::FUNCTION); |
2166 result = this->ParseExpression(true, classifier, CHECK_OK); | 2184 result = this->ParseExpression(true, classifier, CHECK_OK); |
2167 Expect(Token::RPAREN, CHECK_OK); | 2185 Expect(Token::RPAREN, CHECK_OK); |
2168 } | 2186 } |
2169 break; | 2187 break; |
2170 | 2188 |
2171 case Token::CLASS: { | 2189 case Token::CLASS: { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2232 bool accept_IN, ExpressionClassifier* classifier, bool* ok) { | 2250 bool accept_IN, ExpressionClassifier* classifier, bool* ok) { |
2233 // Expression :: | 2251 // Expression :: |
2234 // AssignmentExpression | 2252 // AssignmentExpression |
2235 // Expression ',' AssignmentExpression | 2253 // Expression ',' AssignmentExpression |
2236 | 2254 |
2237 ExpressionClassifier binding_classifier; | 2255 ExpressionClassifier binding_classifier; |
2238 ExpressionT result = | 2256 ExpressionT result = |
2239 this->ParseAssignmentExpression(accept_IN, &binding_classifier, CHECK_OK); | 2257 this->ParseAssignmentExpression(accept_IN, &binding_classifier, CHECK_OK); |
2240 classifier->Accumulate(binding_classifier, | 2258 classifier->Accumulate(binding_classifier, |
2241 ExpressionClassifier::AllProductions); | 2259 ExpressionClassifier::AllProductions); |
| 2260 bool seen_rest = false; |
2242 while (peek() == Token::COMMA) { | 2261 while (peek() == Token::COMMA) { |
2243 Expect(Token::COMMA, CHECK_OK); | 2262 if (seen_rest) { |
| 2263 // At this point the production can't possibly be valid, but we don't know |
| 2264 // which error to signal. |
| 2265 classifier->RecordArrowFormalParametersError( |
| 2266 scanner()->peek_location(), MessageTemplate::kParamAfterRest); |
| 2267 } |
| 2268 Consume(Token::COMMA); |
| 2269 bool is_rest = false; |
| 2270 if (allow_harmony_rest_params() && peek() == Token::ELLIPSIS) { |
| 2271 // 'x, y, ...z' in CoverParenthesizedExpressionAndArrowParameterList only |
| 2272 // as the formal parameters of'(x, y, ...z) => foo', and is not itself a |
| 2273 // valid expression or binding pattern. |
| 2274 ExpressionUnexpectedToken(classifier); |
| 2275 BindingPatternUnexpectedToken(classifier); |
| 2276 Consume(Token::ELLIPSIS); |
| 2277 seen_rest = is_rest = true; |
| 2278 } |
2244 int pos = position(); | 2279 int pos = position(); |
2245 ExpressionT right = this->ParseAssignmentExpression( | 2280 ExpressionT right = this->ParseAssignmentExpression( |
2246 accept_IN, &binding_classifier, CHECK_OK); | 2281 accept_IN, &binding_classifier, CHECK_OK); |
| 2282 if (is_rest) right = factory()->NewSpread(right, pos); |
2247 classifier->Accumulate(binding_classifier, | 2283 classifier->Accumulate(binding_classifier, |
2248 ExpressionClassifier::AllProductions); | 2284 ExpressionClassifier::AllProductions); |
2249 result = factory()->NewBinaryOperation(Token::COMMA, result, right, pos); | 2285 result = factory()->NewBinaryOperation(Token::COMMA, result, right, pos); |
2250 } | 2286 } |
2251 return result; | 2287 return result; |
2252 } | 2288 } |
2253 | 2289 |
2254 | 2290 |
2255 template <class Traits> | 2291 template <class Traits> |
2256 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( | 2292 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2664 if (fni_ != NULL) fni_->Enter(); | 2700 if (fni_ != NULL) fni_->Enter(); |
2665 ParserBase<Traits>::Checkpoint checkpoint(this); | 2701 ParserBase<Traits>::Checkpoint checkpoint(this); |
2666 ExpressionClassifier arrow_formals_classifier; | 2702 ExpressionClassifier arrow_formals_classifier; |
2667 if (peek() != Token::LPAREN) { | 2703 if (peek() != Token::LPAREN) { |
2668 // The expression we are going to read is not a parenthesized arrow function | 2704 // The expression we are going to read is not a parenthesized arrow function |
2669 // formal parameter list. | 2705 // formal parameter list. |
2670 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); | 2706 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); |
2671 } | 2707 } |
2672 ExpressionT expression = this->ParseConditionalExpression( | 2708 ExpressionT expression = this->ParseConditionalExpression( |
2673 accept_IN, &arrow_formals_classifier, CHECK_OK); | 2709 accept_IN, &arrow_formals_classifier, CHECK_OK); |
2674 classifier->Accumulate(arrow_formals_classifier); | |
2675 | 2710 |
2676 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) { | 2711 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) { |
2677 checkpoint.Restore(); | 2712 checkpoint.Restore(); |
2678 BindingPatternUnexpectedToken(classifier); | 2713 BindingPatternUnexpectedToken(classifier); |
2679 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, | 2714 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, |
2680 CHECK_OK); | 2715 CHECK_OK); |
2681 Scanner::Location loc(lhs_location.beg_pos, scanner()->location().end_pos); | 2716 Scanner::Location loc(lhs_location.beg_pos, scanner()->location().end_pos); |
2682 bool has_rest = false; | |
2683 Scope* scope = | 2717 Scope* scope = |
2684 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); | 2718 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); |
2685 scope->set_start_position(lhs_location.beg_pos); | 2719 scope->set_start_position(lhs_location.beg_pos); |
2686 Scanner::Location duplicate_loc = Scanner::Location::invalid(); | 2720 Scanner::Location duplicate_loc = Scanner::Location::invalid(); |
| 2721 bool has_rest = false; |
2687 this->ParseArrowFunctionFormalParameters(scope, expression, loc, &has_rest, | 2722 this->ParseArrowFunctionFormalParameters(scope, expression, loc, &has_rest, |
2688 &duplicate_loc, CHECK_OK); | 2723 &duplicate_loc, CHECK_OK); |
2689 if (duplicate_loc.IsValid()) { | 2724 if (duplicate_loc.IsValid()) { |
2690 arrow_formals_classifier.RecordDuplicateFormalParameterError( | 2725 arrow_formals_classifier.RecordDuplicateFormalParameterError( |
2691 duplicate_loc); | 2726 duplicate_loc); |
2692 } | 2727 } |
2693 expression = this->ParseArrowFunctionLiteral( | 2728 expression = this->ParseArrowFunctionLiteral( |
2694 scope, has_rest, arrow_formals_classifier, CHECK_OK); | 2729 scope, has_rest, arrow_formals_classifier, CHECK_OK); |
2695 return expression; | 2730 return expression; |
2696 } | 2731 } |
2697 | 2732 |
2698 // "expression" was not itself an arrow function parameter list, but it might | 2733 // "expression" was not itself an arrow function parameter list, but it might |
2699 // form part of one. Propagate speculative formal parameter error locations. | 2734 // form part of one. Propagate speculative formal parameter error locations. |
2700 classifier->Accumulate(arrow_formals_classifier, | 2735 classifier->Accumulate(arrow_formals_classifier, |
2701 ExpressionClassifier::FormalParametersProductions); | 2736 ExpressionClassifier::StandardProductions | |
| 2737 ExpressionClassifier::FormalParametersProductions); |
2702 | 2738 |
2703 if (!Token::IsAssignmentOp(peek())) { | 2739 if (!Token::IsAssignmentOp(peek())) { |
2704 if (fni_ != NULL) fni_->Leave(); | 2740 if (fni_ != NULL) fni_->Leave(); |
2705 // Parsed conditional expression only (no assignment). | 2741 // Parsed conditional expression only (no assignment). |
2706 return expression; | 2742 return expression; |
2707 } | 2743 } |
2708 | 2744 |
2709 if (!allow_harmony_destructuring()) { | 2745 if (!allow_harmony_destructuring()) { |
2710 BindingPatternUnexpectedToken(classifier); | 2746 BindingPatternUnexpectedToken(classifier); |
2711 } | 2747 } |
(...skipping 1098 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3810 *ok = false; | 3846 *ok = false; |
3811 return; | 3847 return; |
3812 } | 3848 } |
3813 has_seen_constructor_ = true; | 3849 has_seen_constructor_ = true; |
3814 return; | 3850 return; |
3815 } | 3851 } |
3816 } | 3852 } |
3817 } } // v8::internal | 3853 } } // v8::internal |
3818 | 3854 |
3819 #endif // V8_PREPARSER_H | 3855 #endif // V8_PREPARSER_H |
OLD | NEW |