| Index: src/preparser.h
|
| diff --git a/src/preparser.h b/src/preparser.h
|
| index 29a2b55e83e89719ee6472c35f9826765adb5be6..59b6e26f83fe30481cfc36b506a5735e5995ed63 100644
|
| --- a/src/preparser.h
|
| +++ b/src/preparser.h
|
| @@ -425,17 +425,18 @@ class ParserBase : public Traits {
|
| CheckOctalLiteral(beg_pos, end_pos, "template_octal_literal", ok);
|
| }
|
|
|
| - // Validates strict mode for function parameter lists. This has to be
|
| - // done after parsing the function, since the function can declare
|
| - // itself strict.
|
| - void CheckStrictFunctionNameAndParameters(
|
| - IdentifierT function_name,
|
| - bool function_name_is_strict_reserved,
|
| - const Scanner::Location& function_name_loc,
|
| - const Scanner::Location& eval_args_error_loc,
|
| - const Scanner::Location& dupe_error_loc,
|
| - const Scanner::Location& reserved_loc,
|
| - bool* ok) {
|
| + // Checking the name of a function literal. This has to be done after parsing
|
| + // the function, since the function can declare itself strict.
|
| + void CheckFunctionName(LanguageMode language_mode, FunctionKind kind,
|
| + IdentifierT function_name,
|
| + bool function_name_is_strict_reserved,
|
| + const Scanner::Location& function_name_loc,
|
| + bool* ok) {
|
| + // Property names are never checked.
|
| + if (IsConciseMethod(kind) || IsAccessorFunction(kind)) return;
|
| + // The function name needs to be checked in strict mode.
|
| + if (is_sloppy(language_mode)) return;
|
| +
|
| if (this->IsEvalOrArguments(function_name)) {
|
| Traits::ReportMessageAt(function_name_loc, "strict_eval_arguments");
|
| *ok = false;
|
| @@ -446,11 +447,25 @@ class ParserBase : public Traits {
|
| *ok = false;
|
| return;
|
| }
|
| + }
|
| +
|
| + // Checking the parameter names of a function literal. This has to be done
|
| + // after parsing the function, since the function can declare itself strict.
|
| + void CheckFunctionParameterNames(LanguageMode language_mode,
|
| + bool strict_params,
|
| + const Scanner::Location& eval_args_error_loc,
|
| + const Scanner::Location& dupe_error_loc,
|
| + const Scanner::Location& reserved_loc,
|
| + bool* ok) {
|
| + if (is_sloppy(language_mode) && !strict_params) return;
|
| +
|
| if (eval_args_error_loc.IsValid()) {
|
| Traits::ReportMessageAt(eval_args_error_loc, "strict_eval_arguments");
|
| *ok = false;
|
| return;
|
| }
|
| + // TODO(arv): When we add support for destructuring in setters we also need
|
| + // to check for duplicate names.
|
| if (dupe_error_loc.IsValid()) {
|
| Traits::ReportMessageAt(dupe_error_loc, "strict_param_dupe");
|
| *ok = false;
|
| @@ -2840,6 +2855,7 @@ ParserBase<Traits>::ParseArrowFunctionLiteral(int start_pos,
|
| Traits::Type::ptr_to_scope(scope),
|
| &function_factory);
|
| Scanner::Location dupe_error_loc = Scanner::Location::invalid();
|
| + // TODO(arv): Pass in eval_args_error_loc and reserved_loc here.
|
| num_parameters = Traits::DeclareArrowParametersFromExpression(
|
| params_ast, scope_, &dupe_error_loc, ok);
|
| if (!*ok) {
|
| @@ -2894,14 +2910,13 @@ ParserBase<Traits>::ParseArrowFunctionLiteral(int start_pos,
|
| scope->set_end_position(scanner()->location().end_pos);
|
|
|
| // Arrow function *parameter lists* are always checked as in strict mode.
|
| - bool function_name_is_strict_reserved = false;
|
| - Scanner::Location function_name_loc = Scanner::Location::invalid();
|
| + // TODO(arv): eval_args_error_loc and reserved_loc needs to be set by
|
| + // DeclareArrowParametersFromExpression.
|
| Scanner::Location eval_args_error_loc = Scanner::Location::invalid();
|
| Scanner::Location reserved_loc = Scanner::Location::invalid();
|
| - this->CheckStrictFunctionNameAndParameters(
|
| - this->EmptyIdentifier(), function_name_is_strict_reserved,
|
| - function_name_loc, eval_args_error_loc, dupe_error_loc, reserved_loc,
|
| - CHECK_OK);
|
| + const bool use_strict_params = true;
|
| + this->CheckFunctionParameterNames(language_mode(), use_strict_params,
|
| + eval_args_error_loc, dupe_error_loc, reserved_loc, CHECK_OK);
|
|
|
| // Validate strict mode.
|
| if (is_strict(language_mode())) {
|
|
|