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; |
+ } |
} |
} |