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 <aperez@igalia.com>. git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21896 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
969759fd3f
commit
1fd638e284
@ -3518,34 +3518,15 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
|
|||||||
handler_count = function_state.handler_count();
|
handler_count = function_state.handler_count();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate strict mode. We can do this only after parsing the function,
|
// Validate strict mode.
|
||||||
// since the function can declare itself strict.
|
|
||||||
if (strict_mode() == STRICT) {
|
if (strict_mode() == STRICT) {
|
||||||
if (IsEvalOrArguments(function_name)) {
|
CheckStrictFunctionNameAndParameters(function_name,
|
||||||
ReportMessageAt(function_name_location, "strict_eval_arguments");
|
name_is_strict_reserved,
|
||||||
*ok = false;
|
function_name_location,
|
||||||
return NULL;
|
eval_args_error_log,
|
||||||
}
|
dupe_error_loc,
|
||||||
if (name_is_strict_reserved) {
|
reserved_loc,
|
||||||
ReportMessageAt(function_name_location, "unexpected_strict_reserved");
|
CHECK_OK);
|
||||||
*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;
|
|
||||||
}
|
|
||||||
CheckOctalLiteral(scope->start_position(),
|
CheckOctalLiteral(scope->start_position(),
|
||||||
scope->end_position(),
|
scope->end_position(),
|
||||||
CHECK_OK);
|
CHECK_OK);
|
||||||
|
@ -515,7 +515,7 @@ class ParserTraits {
|
|||||||
// Reporting errors.
|
// Reporting errors.
|
||||||
void ReportMessageAt(Scanner::Location source_location,
|
void ReportMessageAt(Scanner::Location source_location,
|
||||||
const char* message,
|
const char* message,
|
||||||
const char* arg,
|
const char* arg = NULL,
|
||||||
bool is_reference_error = false);
|
bool is_reference_error = false);
|
||||||
void ReportMessage(const char* message,
|
void ReportMessage(const char* message,
|
||||||
MaybeHandle<String> arg,
|
MaybeHandle<String> arg,
|
||||||
|
@ -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.
|
// Determine precedence of given token.
|
||||||
static int Precedence(Token::Value token, bool accept_IN) {
|
static int Precedence(Token::Value token, bool accept_IN) {
|
||||||
if (token == Token::IN && !accept_IN)
|
if (token == Token::IN && !accept_IN)
|
||||||
|
Loading…
Reference in New Issue
Block a user