From 1fd638e2843105ad82d62a83a8110ae62f6a0667 Mon Sep 17 00:00:00 2001 From: "marja@chromium.org" Date: Fri, 20 Jun 2014 09:45:05 +0000 Subject: [PATCH] Parser: Refactor strict mode checks for functions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Moves the strict mode checks and error reporting for the function and parameter names into a separate CheckStrictFunctionNameAndParameters() function in ParserBase. Parsing of arrow functions will then use this new function instead of duplicating the error code. BUG= R=marja@chromium.org Review URL: https://codereview.chromium.org/332053004 Patch from Adrián Pérez de Castro . git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21896 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/parser.cc | 35 ++++++++--------------------------- src/parser.h | 2 +- src/preparser.h | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/src/parser.cc b/src/parser.cc index fd0dd29..49e9a81 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 a66d564..d011161 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 220108c..f8e6203 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) -- 2.7.4