Chromium Code Reviews| Index: src/preparser.h |
| diff --git a/src/preparser.h b/src/preparser.h |
| index 7bf08458750b94ab76a738aab5347ba0bc402bf3..aae376cdbf01c7475d07513a9b19f697b9dcefdf 100644 |
| --- a/src/preparser.h |
| +++ b/src/preparser.h |
| @@ -110,6 +110,7 @@ class ParserBase : public Traits { |
| allow_harmony_sloppy_(false), |
| allow_harmony_sloppy_let_(false), |
| allow_harmony_rest_parameters_(false), |
| + allow_harmony_default_parameters_(false), |
| allow_harmony_spreadcalls_(false), |
| allow_harmony_destructuring_(false), |
| allow_harmony_spread_arrays_(false), |
| @@ -127,6 +128,7 @@ class ParserBase : public Traits { |
| ALLOW_ACCESSORS(harmony_sloppy); |
| ALLOW_ACCESSORS(harmony_sloppy_let); |
| ALLOW_ACCESSORS(harmony_rest_parameters); |
| + ALLOW_ACCESSORS(harmony_default_parameters); |
| ALLOW_ACCESSORS(harmony_spreadcalls); |
| ALLOW_ACCESSORS(harmony_destructuring); |
| ALLOW_ACCESSORS(harmony_spread_arrays); |
| @@ -698,8 +700,7 @@ class ParserBase : public Traits { |
| ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier, |
| bool* ok); |
| - void ParseFormalParameter(bool is_rest, |
| - FormalParametersT* parameters, |
| + void ParseFormalParameter(FormalParametersT* parameters, |
| ExpressionClassifier* classifier, bool* ok); |
| void ParseFormalParameterList(FormalParametersT* parameters, |
| ExpressionClassifier* classifier, bool* ok); |
| @@ -800,6 +801,7 @@ class ParserBase : public Traits { |
| bool allow_harmony_sloppy_; |
| bool allow_harmony_sloppy_let_; |
| bool allow_harmony_rest_parameters_; |
| + bool allow_harmony_default_parameters_; |
| bool allow_harmony_spreadcalls_; |
| bool allow_harmony_destructuring_; |
| bool allow_harmony_spread_arrays_; |
| @@ -1632,7 +1634,7 @@ class PreParserTraits { |
| void AddFormalParameter( |
| PreParserFormalParameters* parameters, PreParserExpression pattern, |
| - bool is_rest) { |
| + PreParserExpression initializer, bool is_rest) { |
| ++parameters->arity; |
| } |
| void DeclareFormalParameter(Scope* scope, PreParserIdentifier parameter, |
| @@ -2281,9 +2283,8 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier, |
| FormalParametersT formals(scope); |
| scope->set_start_position(beg_pos); |
| ExpressionClassifier formals_classifier; |
| - const bool is_rest = true; |
| - this->ParseFormalParameter(is_rest, &formals, &formals_classifier, |
| - CHECK_OK); |
| + formals.has_rest = true; |
| + this->ParseFormalParameter(&formals, &formals_classifier, CHECK_OK); |
| Traits::DeclareFormalParameter( |
| formals.scope, formals.at(0), formals.is_simple, |
| &formals_classifier); |
| @@ -3622,10 +3623,10 @@ ParserBase<Traits>::ParseMemberExpressionContinuation( |
| template <class Traits> |
| void ParserBase<Traits>::ParseFormalParameter( |
| - bool is_rest, FormalParametersT* parameters, |
|
adamk
2015/08/12 18:22:59
This rest refactoring seems separate, could it be
rossberg
2015/08/13 11:06:36
Split into separate CL: https://codereview.chromiu
|
| - ExpressionClassifier* classifier, bool* ok) { |
| + FormalParametersT* parameters, ExpressionClassifier* classifier, bool* ok) { |
| // FormalParameter[Yield,GeneratorParameter] : |
| // BindingElement[?Yield, ?GeneratorParameter] |
| + bool is_rest = parameters->has_rest; |
| Token::Value next = peek(); |
| ExpressionT pattern = ParsePrimaryExpression(classifier, ok); |
| @@ -3634,22 +3635,26 @@ void ParserBase<Traits>::ParseFormalParameter( |
| ValidateBindingPattern(classifier, ok); |
| if (!*ok) return; |
| - if (!allow_harmony_destructuring() && !Traits::IsIdentifier(pattern)) { |
| - ReportUnexpectedToken(next); |
| - *ok = false; |
| - return; |
| + if (!Traits::IsIdentifier(pattern)) { |
| + if (is_rest || !allow_harmony_destructuring()) { |
| + ReportUnexpectedToken(next); |
| + *ok = false; |
| + return; |
| + } |
| + parameters->is_simple = false; |
| } |
| - if (parameters->is_simple) { |
| - parameters->is_simple = !is_rest && Traits::IsIdentifier(pattern); |
| - } |
| - parameters->has_rest = is_rest; |
| - if (is_rest && !Traits::IsIdentifier(pattern)) { |
| - ReportUnexpectedToken(next); |
| - *ok = false; |
| - return; |
| + ExpressionT initializer = Traits::EmptyExpression(); |
| + if (!is_rest && allow_harmony_default_parameters() && Check(Token::ASSIGN)) { |
| + ExpressionClassifier init_classifier; |
| + initializer = ParseAssignmentExpression(true, &init_classifier, ok); |
| + if (!*ok) return; |
| + ValidateExpression(&init_classifier, ok); |
| + if (!*ok) return; |
| + parameters->is_simple = false; |
| } |
| - Traits::AddFormalParameter(parameters, pattern, is_rest); |
| + |
| + Traits::AddFormalParameter(parameters, pattern, initializer, is_rest); |
| } |
| @@ -3679,16 +3684,20 @@ void ParserBase<Traits>::ParseFormalParameterList( |
| *ok = false; |
| return; |
| } |
| - bool is_rest = allow_harmony_rest_parameters() && Check(Token::ELLIPSIS); |
| - ParseFormalParameter(is_rest, parameters, classifier, ok); |
| + parameters->has_rest = |
| + allow_harmony_rest_parameters() && Check(Token::ELLIPSIS); |
| + ParseFormalParameter(parameters, classifier, ok); |
| if (!*ok) return; |
| } while (!parameters->has_rest && Check(Token::COMMA)); |
| - if (parameters->has_rest && peek() == Token::COMMA) { |
| - ReportMessageAt(scanner()->peek_location(), |
| + if (parameters->has_rest) { |
| + parameters->is_simple = false; |
| + if (peek() == Token::COMMA) { |
| + ReportMessageAt(scanner()->peek_location(), |
| MessageTemplate::kParamAfterRest); |
| - *ok = false; |
| - return; |
| + *ok = false; |
| + return; |
| + } |
| } |
| } |