diff --git a/src/parser.cc b/src/parser.cc index fd0dd2913e..49e9a81db0 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -3518,34 +3518,15 @@ FunctionLiteral* Parser::ParseFunctionLiteral( handler_count = function_state.handler_count(); } - // Validate strict mode. We can do this only after parsing the function, - // since the function can declare itself strict. + // Validate strict mode. if (strict_mode() == STRICT) { - if (IsEvalOrArguments(function_name)) { - ReportMessageAt(function_name_location, "strict_eval_arguments"); - *ok = false; - return NULL; - } - if (name_is_strict_reserved) { - ReportMessageAt(function_name_location, "unexpected_strict_reserved"); - *ok = false; - return NULL; - } - if (eval_args_error_log.IsValid()) { - ReportMessageAt(eval_args_error_log, "strict_eval_arguments"); - *ok = false; - return NULL; - } - if (dupe_error_loc.IsValid()) { - ReportMessageAt(dupe_error_loc, "strict_param_dupe"); - *ok = false; - return NULL; - } - if (reserved_loc.IsValid()) { - ReportMessageAt(reserved_loc, "unexpected_strict_reserved"); - *ok = false; - return NULL; - } + CheckStrictFunctionNameAndParameters(function_name, + name_is_strict_reserved, + function_name_location, + eval_args_error_log, + dupe_error_loc, + reserved_loc, + CHECK_OK); CheckOctalLiteral(scope->start_position(), scope->end_position(), CHECK_OK); diff --git a/src/parser.h b/src/parser.h index a66d564eb5..d01116158d 100644 --- a/src/parser.h +++ b/src/parser.h @@ -515,7 +515,7 @@ class ParserTraits { // Reporting errors. void ReportMessageAt(Scanner::Location source_location, const char* message, - const char* arg, + const char* arg = NULL, bool is_reference_error = false); void ReportMessage(const char* message, MaybeHandle arg, diff --git a/src/preparser.h b/src/preparser.h index 220108c884..f8e6203a54 100644 --- a/src/preparser.h +++ b/src/preparser.h @@ -334,6 +334,44 @@ class ParserBase : public Traits { } } + // 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) { + if (this->IsEvalOrArguments(function_name)) { + Traits::ReportMessageAt(function_name_loc, "strict_eval_arguments"); + *ok = false; + return; + } + if (function_name_is_strict_reserved) { + Traits::ReportMessageAt(function_name_loc, "unexpected_strict_reserved"); + *ok = false; + return; + } + if (eval_args_error_loc.IsValid()) { + Traits::ReportMessageAt(eval_args_error_loc, "strict_eval_arguments"); + *ok = false; + return; + } + if (dupe_error_loc.IsValid()) { + Traits::ReportMessageAt(dupe_error_loc, "strict_param_dupe"); + *ok = false; + return; + } + if (reserved_loc.IsValid()) { + Traits::ReportMessageAt(reserved_loc, "unexpected_strict_reserved"); + *ok = false; + return; + } + } + // Determine precedence of given token. static int Precedence(Token::Value token, bool accept_IN) { if (token == Token::IN && !accept_IN)