Index: src/preparser.cc |
diff --git a/src/preparser.cc b/src/preparser.cc |
index 15fca26788d56ad5a970d17bcbb834b3d796f244..d4515fcb51d9b8c555daf52457a4a63c209ec747 100644 |
--- a/src/preparser.cc |
+++ b/src/preparser.cc |
@@ -53,6 +53,9 @@ PreParserIdentifier PreParserTraits::GetSymbol(Scanner* scanner) { |
if (scanner->UnescapedLiteralMatches("arguments", 9)) { |
return PreParserIdentifier::Arguments(); |
} |
+ if (scanner->UnescapedLiteralMatches("undefined", 9)) { |
+ return PreParserIdentifier::Undefined(); |
+ } |
if (scanner->LiteralMatches("prototype", 9)) { |
return PreParserIdentifier::Prototype(); |
} |
@@ -483,7 +486,7 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
do { |
// Parse variable name. |
if (nvars > 0) Consume(Token::COMMA); |
- ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); |
+ ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); |
Scanner::Location variable_loc = scanner()->location(); |
nvars++; |
if (peek() == Token::ASSIGN || require_initializer || |
@@ -588,7 +591,7 @@ PreParser::Statement PreParser::ParseContinueStatement(bool* ok) { |
tok != Token::RBRACE && |
tok != Token::EOS) { |
// ECMA allows "eval" or "arguments" as labels even in strict mode. |
- ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); |
+ ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
} |
ExpectSemicolon(CHECK_OK); |
return Statement::Default(); |
@@ -606,7 +609,7 @@ PreParser::Statement PreParser::ParseBreakStatement(bool* ok) { |
tok != Token::RBRACE && |
tok != Token::EOS) { |
// ECMA allows "eval" or "arguments" as labels even in strict mode. |
- ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); |
+ ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
} |
ExpectSemicolon(CHECK_OK); |
return Statement::Default(); |
@@ -853,7 +856,7 @@ PreParser::Statement PreParser::ParseTryStatement(bool* ok) { |
if (tok == Token::CATCH) { |
Consume(Token::CATCH); |
Expect(Token::LPAREN, CHECK_OK); |
- ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); |
+ ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); |
Expect(Token::RPAREN, CHECK_OK); |
{ |
Scope* with_scope = NewScope(scope_, WITH_SCOPE); |
@@ -917,6 +920,9 @@ PreParser::Expression PreParser::ParseFunctionLiteral( |
Scanner::Location dupe_error_loc = Scanner::Location::invalid(); |
Scanner::Location reserved_error_loc = Scanner::Location::invalid(); |
+ // Similarly for strong mode. |
+ Scanner::Location undefined_error_loc = Scanner::Location::invalid(); |
+ |
bool is_rest = false; |
bool done = arity_restriction == FunctionLiteral::GETTER_ARITY || |
(peek() == Token::RPAREN && |
@@ -933,6 +939,9 @@ PreParser::Expression PreParser::ParseFunctionLiteral( |
if (!eval_args_error_loc.IsValid() && param_name.IsEvalOrArguments()) { |
eval_args_error_loc = scanner()->location(); |
} |
+ if (!undefined_error_loc.IsValid() && param_name.IsUndefined()) { |
+ undefined_error_loc = scanner()->location(); |
+ } |
if (!reserved_error_loc.IsValid() && is_strict_reserved) { |
reserved_error_loc = scanner()->location(); |
} |
@@ -976,8 +985,8 @@ PreParser::Expression PreParser::ParseFunctionLiteral( |
name_is_strict_reserved, function_name_location, CHECK_OK); |
const bool use_strict_params = is_rest || IsConciseMethod(kind); |
CheckFunctionParameterNames(language_mode(), use_strict_params, |
- eval_args_error_loc, dupe_error_loc, |
- reserved_error_loc, CHECK_OK); |
+ eval_args_error_loc, undefined_error_loc, |
+ dupe_error_loc, reserved_error_loc, CHECK_OK); |
if (is_strict(language_mode())) { |
int end_position = scanner()->location().end_pos; |
@@ -1026,11 +1035,17 @@ PreParserExpression PreParser::ParseClassLiteral( |
*ok = false; |
return EmptyExpression(); |
} |
+ LanguageMode class_language_mode = language_mode(); |
+ if (is_strong(class_language_mode) && IsUndefined(name)) { |
+ ReportMessageAt(class_name_location, "strong_undefined"); |
+ *ok = false; |
+ return EmptyExpression(); |
+ } |
Scope* scope = NewScope(scope_, BLOCK_SCOPE); |
BlockState block_state(&scope_, scope); |
scope_->SetLanguageMode( |
- static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); |
+ static_cast<LanguageMode>(class_language_mode | STRICT_BIT)); |
// TODO(marja): Make PreParser use scope names too. |
// scope_->SetScopeName(name); |
@@ -1068,7 +1083,7 @@ PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) { |
return Expression::Default(); |
} |
// Allow "eval" or "arguments" for backward compatibility. |
- ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); |
+ ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
Scanner::Location spread_pos; |
ParseArguments(&spread_pos, ok); |