From: marja@chromium.org Date: Fri, 20 Jun 2014 09:45:05 +0000 (+0000) Subject: Parser: Refactor strict mode checks for functions X-Git-Tag: upstream/4.7.83~8638 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1fd638e2843105ad82d62a83a8110ae62f6a0667;p=platform%2Fupstream%2Fv8.git Parser: Refactor strict mode checks for functions 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 --- 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)