Reviewers: rossberg, marja, wingo, Dmitry Lomov (chromium), Michael
Starzinger,
Message:
It would be nice to have this change applied so arrow function
parsing could use the factored out code, as suggested in
https://codereview.chromium.org/160073006/
Description:
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=
Please review this at https://codereview.chromium.org/332053004/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+47, -28 lines):
M src/parser.h
M src/parser.cc
M src/preparser.h
Index: src/parser.cc
diff --git a/src/parser.cc b/src/parser.cc
index
722ed8beaf470288df7de99157ea58a191ec7c23..cb8e4d747d2bfae97046030a27ce96d7e2960dfb
100644
--- a/src/parser.cc
+++ b/src/parser.cc
@@ -3506,34 +3506,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);
Index: src/parser.h
diff --git a/src/parser.h b/src/parser.h
index
e3bd0b182984a75137815c8ddec7cf81c60169c6..fb395ce8cc87c01961c15fdab818afcf95957c41
100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -516,7 +516,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,
const char* arg = NULL,
Index: src/preparser.h
diff --git a/src/preparser.h b/src/preparser.h
index
287c26bf742ecd2ab89fd80945317e6b13f1d592..f17a5bd9f5b830da718ebdb9f5aff0b84018d1c4
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)
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.