| Index: src/preparser.h
|
| diff --git a/src/preparser.h b/src/preparser.h
|
| index e224bea1e70e47bf33a3d31ae3e529fcd3363dfb..07e431bfc54790b0a65c081f9ea8021ab6fba84c 100644
|
| --- a/src/preparser.h
|
| +++ b/src/preparser.h
|
| @@ -1648,8 +1648,11 @@ class PreParserTraits {
|
| ++parameters->arity;
|
| }
|
| void DeclareFormalParameter(Scope* scope, PreParserIdentifier parameter,
|
| - bool is_simple,
|
| - ExpressionClassifier* classifier) {}
|
| + ExpressionClassifier* classifier) {
|
| + if (!classifier->is_simple_parameter_list()) {
|
| + scope->SetHasNonSimpleParameters();
|
| + }
|
| + }
|
|
|
| void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {}
|
|
|
| @@ -1747,8 +1750,8 @@ class PreParser : public ParserBase<PreParserTraits> {
|
| // At return, unless an error occurred, the scanner is positioned before the
|
| // the final '}'.
|
| PreParseResult PreParseLazyFunction(
|
| - LanguageMode language_mode, FunctionKind kind, ParserRecorder* log,
|
| - Scanner::BookmarkScope* bookmark = nullptr);
|
| + LanguageMode language_mode, FunctionKind kind, bool has_simple_parameters,
|
| + ParserRecorder* log, Scanner::BookmarkScope* bookmark = nullptr);
|
|
|
| private:
|
| friend class PreParserTraits;
|
| @@ -2283,6 +2286,7 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier,
|
| classifier->RecordExpressionError(scanner()->location(),
|
| MessageTemplate::kUnexpectedToken,
|
| Token::String(Token::ELLIPSIS));
|
| + classifier->RecordNonSimpleParameter();
|
| Scanner::Location expr_loc = scanner()->peek_location();
|
| Token::Value tok = peek();
|
| result = this->ParseAssignmentExpression(true, classifier, CHECK_OK);
|
| @@ -2295,6 +2299,7 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier,
|
| return this->EmptyExpression();
|
| }
|
| result = factory()->NewSpread(result, ellipsis_pos);
|
| +
|
| if (peek() == Token::COMMA) {
|
| ReportMessageAt(scanner()->peek_location(),
|
| MessageTemplate::kParamAfterRest);
|
| @@ -2385,6 +2390,7 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
|
| this->ParseAssignmentExpression(accept_IN, &binding_classifier, CHECK_OK);
|
| classifier->Accumulate(binding_classifier,
|
| ExpressionClassifier::AllProductions);
|
| + bool is_simple_parameter_list = this->IsIdentifier(result);
|
| bool seen_rest = false;
|
| while (peek() == Token::COMMA) {
|
| if (seen_rest) {
|
| @@ -2408,10 +2414,15 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
|
| ExpressionT right = this->ParseAssignmentExpression(
|
| accept_IN, &binding_classifier, CHECK_OK);
|
| if (is_rest) right = factory()->NewSpread(right, pos);
|
| + is_simple_parameter_list =
|
| + is_simple_parameter_list && this->IsIdentifier(right);
|
| classifier->Accumulate(binding_classifier,
|
| ExpressionClassifier::AllProductions);
|
| result = factory()->NewBinaryOperation(Token::COMMA, result, right, pos);
|
| }
|
| + if (!is_simple_parameter_list || seen_rest) {
|
| + classifier->RecordNonSimpleParameter();
|
| + }
|
| return result;
|
| }
|
|
|
| @@ -2839,7 +2850,6 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN,
|
| }
|
| ExpressionT expression = this->ParseConditionalExpression(
|
| accept_IN, &arrow_formals_classifier, CHECK_OK);
|
| -
|
| if (allow_harmony_arrow_functions() && peek() == Token::ARROW) {
|
| BindingPatternUnexpectedToken(classifier);
|
| ValidateArrowFormalParameters(&arrow_formals_classifier, expression,
|
| @@ -2848,6 +2858,10 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN,
|
| Scope* scope =
|
| this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction);
|
| FormalParametersT parameters(scope);
|
| + if (!arrow_formals_classifier.is_simple_parameter_list()) {
|
| + scope->SetHasNonSimpleParameters();
|
| + parameters.is_simple = false;
|
| + }
|
| checkpoint.Restore(¶meters.materialized_literals_count);
|
|
|
| scope->set_start_position(lhs_beg_pos);
|
| @@ -3662,6 +3676,7 @@ void ParserBase<Traits>::ParseFormalParameter(
|
| return;
|
| }
|
| parameters->is_simple = false;
|
| + classifier->RecordNonSimpleParameter();
|
| }
|
|
|
| ExpressionT initializer = Traits::EmptyExpression();
|
| @@ -3672,6 +3687,7 @@ void ParserBase<Traits>::ParseFormalParameter(
|
| ValidateExpression(&init_classifier, ok);
|
| if (!*ok) return;
|
| parameters->is_simple = false;
|
| + classifier->RecordNonSimpleParameter();
|
| }
|
|
|
| Traits::AddFormalParameter(parameters, pattern, initializer, is_rest);
|
| @@ -3712,6 +3728,7 @@ void ParserBase<Traits>::ParseFormalParameterList(
|
|
|
| if (parameters->has_rest) {
|
| parameters->is_simple = false;
|
| + classifier->RecordNonSimpleParameter();
|
| if (peek() == Token::COMMA) {
|
| ReportMessageAt(scanner()->peek_location(),
|
| MessageTemplate::kParamAfterRest);
|
| @@ -3723,8 +3740,7 @@ void ParserBase<Traits>::ParseFormalParameterList(
|
|
|
| for (int i = 0; i < parameters->Arity(); ++i) {
|
| auto parameter = parameters->at(i);
|
| - Traits::DeclareFormalParameter(
|
| - parameters->scope, parameter, parameters->is_simple, classifier);
|
| + Traits::DeclareFormalParameter(parameters->scope, parameter, classifier);
|
| }
|
| }
|
|
|
|
|