Chromium Code Reviews| Index: src/parser.cc |
| diff --git a/src/parser.cc b/src/parser.cc |
| index 26771e4e347830c81c13377cbd24c7d1d5897213..0c0daf8e6893560349211496bb8edc00775a7aa9 100644 |
| --- a/src/parser.cc |
| +++ b/src/parser.cc |
| @@ -1138,22 +1138,20 @@ FunctionLiteral* Parser::ParseLazy(Isolate* isolate, ParseInfo* info, |
| if (shared_info->is_arrow()) { |
| Scope* scope = NewScope(scope_, ARROW_SCOPE); |
| scope->set_start_position(shared_info->start_position()); |
| - FormalParameterErrorLocations error_locs; |
| + ExpressionClassifier formals_classifier; |
| bool has_rest = false; |
| if (Check(Token::LPAREN)) { |
| // '(' StrictFormalParameters ')' |
| - ParseFormalParameterList(scope, &error_locs, &has_rest, &ok); |
| + ParseFormalParameterList(scope, &has_rest, &formals_classifier, &ok); |
| if (ok) ok = Check(Token::RPAREN); |
| } else { |
| // BindingIdentifier |
| - ParseFormalParameter(scope, &error_locs, has_rest, &ok); |
| + ParseFormalParameter(scope, has_rest, &formals_classifier, &ok); |
| } |
| if (ok) { |
| - ExpressionClassifier classifier; |
| - Expression* expression = ParseArrowFunctionLiteral( |
| - scope, error_locs, has_rest, &classifier, &ok); |
| - ValidateExpression(&classifier, &ok); |
| + Expression* expression = |
| + ParseArrowFunctionLiteral(scope, has_rest, formals_classifier, &ok); |
| if (ok) { |
| // Scanning must end at the same position that was recorded |
| // previously. If not, parsing has been interrupted due to a stack |
| @@ -3720,7 +3718,7 @@ Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { |
| void ParserTraits::DeclareArrowFunctionParameters( |
| Scope* scope, Expression* expr, const Scanner::Location& params_loc, |
| - FormalParameterErrorLocations* error_locs, bool* ok) { |
| + Scanner::Location* duplicate_loc, bool* ok) { |
| if (scope->num_parameters() >= Code::kMaxArguments) { |
| ReportMessageAt(params_loc, "malformed_arrow_function_parameter_list"); |
| *ok = false; |
| @@ -3739,6 +3737,7 @@ void ParserTraits::DeclareArrowFunctionParameters( |
| // need to match the pre-parser's behavior. |
| if (expr->IsBinaryOperation()) { |
| BinaryOperation* binop = expr->AsBinaryOperation(); |
| + // TODO(wingo): These checks are now unnecessary, given the classifier. |
| if (binop->op() != Token::COMMA) { |
| ReportMessageAt(params_loc, "malformed_arrow_function_parameter_list"); |
| *ok = false; |
| @@ -3751,7 +3750,7 @@ void ParserTraits::DeclareArrowFunctionParameters( |
| *ok = false; |
| return; |
| } |
| - DeclareArrowFunctionParameters(scope, left, params_loc, error_locs, ok); |
| + DeclareArrowFunctionParameters(scope, left, params_loc, duplicate_loc, ok); |
| if (!*ok) return; |
| // LHS of comma expression should be unparenthesized. |
| expr = right; |
| @@ -3774,13 +3773,6 @@ void ParserTraits::DeclareArrowFunctionParameters( |
| return; |
| } |
| - if (!error_locs->eval_or_arguments.IsValid() && IsEvalOrArguments(raw_name)) |
| - error_locs->eval_or_arguments = param_location; |
| - if (!error_locs->reserved.IsValid() && IsFutureStrictReserved(raw_name)) |
| - error_locs->reserved = param_location; |
| - if (!error_locs->undefined.IsValid() && IsUndefined(raw_name)) |
| - error_locs->undefined = param_location; |
| - |
| // When the formal parameter was originally seen, it was parsed as a |
| // VariableProxy and recorded as unresolved in the scope. Here we undo that |
| // parse-time side-effect. |
| @@ -3789,22 +3781,15 @@ void ParserTraits::DeclareArrowFunctionParameters( |
| bool is_rest = false; |
| bool is_duplicate = DeclareFormalParameter(scope, raw_name, is_rest); |
| - if (is_duplicate) { |
| - // Arrow function parameter lists are parsed as StrictFormalParameters, |
| - // which means that they cannot have duplicates. Note that this is a subset |
| - // of the restrictions placed on parameters to functions whose body is |
| - // strict. |
| - ReportMessageAt(param_location, |
| - "duplicate_arrow_function_formal_parameter"); |
| - *ok = false; |
| - return; |
| + if (is_duplicate && !duplicate_loc->IsValid()) { |
| + *duplicate_loc = param_location; |
| } |
| } |
| void ParserTraits::ParseArrowFunctionFormalParameters( |
| Scope* scope, Expression* params, const Scanner::Location& params_loc, |
| - FormalParameterErrorLocations* error_locs, bool* is_rest, bool* ok) { |
| + bool* is_rest, Scanner::Location* duplicate_loc, bool* ok) { |
| // Too many parentheses around expression: |
| // (( ... )) => ... |
| if (params->is_multi_parenthesized()) { |
| @@ -3814,7 +3799,7 @@ void ParserTraits::ParseArrowFunctionFormalParameters( |
| return; |
| } |
| - DeclareArrowFunctionParameters(scope, params, params_loc, error_locs, ok); |
| + DeclareArrowFunctionParameters(scope, params, params_loc, duplicate_loc, ok); |
| } |
| @@ -3887,7 +3872,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
| int materialized_literal_count = -1; |
| int expected_property_count = -1; |
| int handler_count = 0; |
| - FormalParameterErrorLocations error_locs; |
| + ExpressionClassifier formals_classifier; |
| FunctionLiteral::EagerCompileHint eager_compile_hint = |
| parenthesized_function_ ? FunctionLiteral::kShouldEagerCompile |
| : FunctionLiteral::kShouldLazyCompile; |
| @@ -3917,8 +3902,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
| Expect(Token::LPAREN, CHECK_OK); |
| int start_position = scanner()->location().beg_pos; |
| scope_->set_start_position(start_position); |
| - num_parameters = |
| - ParseFormalParameterList(scope, &error_locs, &has_rest, CHECK_OK); |
| + num_parameters = ParseFormalParameterList(scope, &has_rest, |
| + &formals_classifier, CHECK_OK); |
| Expect(Token::RPAREN, CHECK_OK); |
| int formals_end_position = scanner()->location().end_pos; |
| @@ -4041,8 +4026,10 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
| name_is_strict_reserved, function_name_location, |
| CHECK_OK); |
| const bool use_strict_params = has_rest || IsConciseMethod(kind); |
| - CheckFunctionParameterNames(language_mode(), use_strict_params, error_locs, |
| - CHECK_OK); |
| + const bool allow_duplicate_parameters = |
|
arv (Not doing code reviews)
2015/05/13 14:13:05
Does this handle patterns?
// sloppy
function f(x
wingo
2015/05/15 12:30:30
I guess it should but it doesn't. In a similar wa
|
| + is_sloppy(language_mode()) && !use_strict_params; |
| + ValidateFormalParameters(&formals_classifier, language_mode(), |
| + allow_duplicate_parameters, CHECK_OK); |
| if (is_strict(language_mode())) { |
| CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), |
| @@ -4051,9 +4038,11 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
| } |
| } |
| + bool has_duplicate_parameters = |
| + !formals_classifier.is_valid_formal_parameter_list_without_duplicates(); |
| FunctionLiteral::ParameterFlag duplicate_parameters = |
| - error_locs.duplicate.IsValid() ? FunctionLiteral::kHasDuplicateParameters |
| - : FunctionLiteral::kNoDuplicateParameters; |
| + has_duplicate_parameters ? FunctionLiteral::kHasDuplicateParameters |
| + : FunctionLiteral::kNoDuplicateParameters; |
| FunctionLiteral* function_literal = factory()->NewFunctionLiteral( |
| function_name, ast_value_factory(), scope, body, |