Index: src/preparser.cc |
diff --git a/src/preparser.cc b/src/preparser.cc |
index 291dfd303f8d80be4fd0775e2e10f5290707d9fd..95fde93f3efc7274bfd0d3b19faac594b2e56228 100644 |
--- a/src/preparser.cc |
+++ b/src/preparser.cc |
@@ -149,7 +149,8 @@ PreParser::SourceElements PreParser::ParseSourceElements(int end_token, |
Statement statement = ParseSourceElement(CHECK_OK); |
if (allow_directive_prologue) { |
if (statement.IsUseStrictLiteral()) { |
- set_strict_mode(); |
+ set_language_mode(harmony_scoping_ ? |
+ i::EXTENDED_MODE : i::STRICT_MODE); |
} else if (!statement.IsStringLiteral()) { |
allow_directive_prologue = false; |
} |
@@ -242,7 +243,7 @@ PreParser::Statement PreParser::ParseStatement(bool* ok) { |
i::Scanner::Location start_location = scanner_->peek_location(); |
Statement statement = ParseFunctionDeclaration(CHECK_OK); |
i::Scanner::Location end_location = scanner_->location(); |
- if (strict_mode() || harmony_scoping_) { |
+ if (!is_classic_mode()) { |
ReportMessageAt(start_location.beg_pos, end_location.end_pos, |
"strict_function", NULL); |
*ok = false; |
@@ -295,7 +296,7 @@ PreParser::Statement PreParser::ParseBlock(bool* ok) { |
// |
Expect(i::Token::LBRACE, CHECK_OK); |
while (peek() != i::Token::RBRACE) { |
- if (harmony_scoping_) { |
+ if (is_extended_mode()) { |
ParseSourceElement(CHECK_OK); |
} else { |
ParseStatement(CHECK_OK); |
@@ -348,24 +349,30 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
if (peek() == i::Token::VAR) { |
Consume(i::Token::VAR); |
} else if (peek() == i::Token::CONST) { |
- if (harmony_scoping_) { |
- if (var_context != kSourceElement && |
- var_context != kForStatement) { |
+ switch (language_mode()) { |
+ case i::CLASSIC_MODE: |
+ break; |
+ case i::STRICT_MODE: { |
i::Scanner::Location location = scanner_->peek_location(); |
- ReportMessageAt(location.beg_pos, location.end_pos, |
- "unprotected_const", NULL); |
+ ReportMessageAt(location, "strict_const", NULL); |
*ok = false; |
return Statement::Default(); |
} |
- require_initializer = true; |
- } else if (strict_mode()) { |
- i::Scanner::Location location = scanner_->peek_location(); |
- ReportMessageAt(location, "strict_const", NULL); |
- *ok = false; |
- return Statement::Default(); |
+ case i::EXTENDED_MODE: |
+ if (var_context != kSourceElement && |
+ var_context != kForStatement) { |
+ i::Scanner::Location location = scanner_->peek_location(); |
+ ReportMessageAt(location.beg_pos, location.end_pos, |
+ "unprotected_const", NULL); |
+ *ok = false; |
+ return Statement::Default(); |
+ } |
+ require_initializer = true; |
+ break; |
} |
Consume(i::Token::CONST); |
} else if (peek() == i::Token::LET) { |
+ ASSERT(is_extended_mode()); |
if (var_context != kSourceElement && |
var_context != kForStatement) { |
i::Scanner::Location location = scanner_->peek_location(); |
@@ -389,7 +396,7 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
// Parse variable name. |
if (nvars > 0) Consume(i::Token::COMMA); |
Identifier identifier = ParseIdentifier(CHECK_OK); |
- if (strict_mode() && !identifier.IsValidStrictVariable()) { |
+ if (!is_classic_mode() && !identifier.IsValidStrictVariable()) { |
StrictModeIdentifierViolation(scanner_->location(), |
"strict_var_name", |
identifier, |
@@ -417,7 +424,7 @@ PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) { |
Expression expr = ParseExpression(true, CHECK_OK); |
if (expr.IsRawIdentifier()) { |
ASSERT(!expr.AsIdentifier().IsFutureReserved()); |
- ASSERT(!strict_mode() || !expr.AsIdentifier().IsFutureStrictReserved()); |
+ ASSERT(is_classic_mode() || !expr.AsIdentifier().IsFutureStrictReserved()); |
if (peek() == i::Token::COLON) { |
Consume(i::Token::COLON); |
return ParseStatement(ok); |
@@ -513,7 +520,7 @@ PreParser::Statement PreParser::ParseWithStatement(bool* ok) { |
// WithStatement :: |
// 'with' '(' Expression ')' Statement |
Expect(i::Token::WITH, CHECK_OK); |
- if (strict_mode()) { |
+ if (!is_classic_mode()) { |
i::Scanner::Location location = scanner_->location(); |
ReportMessageAt(location, "strict_mode_with", NULL); |
*ok = false; |
@@ -682,7 +689,7 @@ PreParser::Statement PreParser::ParseTryStatement(bool* ok) { |
Consume(i::Token::CATCH); |
Expect(i::Token::LPAREN, CHECK_OK); |
Identifier id = ParseIdentifier(CHECK_OK); |
- if (strict_mode() && !id.IsValidStrictVariable()) { |
+ if (!is_classic_mode() && !id.IsValidStrictVariable()) { |
StrictModeIdentifierViolation(scanner_->location(), |
"strict_catch_variable", |
id, |
@@ -760,7 +767,8 @@ PreParser::Expression PreParser::ParseAssignmentExpression(bool accept_IN, |
return expression; |
} |
- if (strict_mode() && expression.IsIdentifier() && |
+ if (!is_classic_mode() && |
+ expression.IsIdentifier() && |
expression.AsIdentifier().IsEvalOrArguments()) { |
i::Scanner::Location after = scanner_->location(); |
ReportMessageAt(before.beg_pos, after.end_pos, |
@@ -848,7 +856,8 @@ PreParser::Expression PreParser::ParseUnaryExpression(bool* ok) { |
op = Next(); |
i::Scanner::Location before = scanner_->peek_location(); |
Expression expression = ParseUnaryExpression(CHECK_OK); |
- if (strict_mode() && expression.IsIdentifier() && |
+ if (!is_classic_mode() && |
+ expression.IsIdentifier() && |
expression.AsIdentifier().IsEvalOrArguments()) { |
i::Scanner::Location after = scanner_->location(); |
ReportMessageAt(before.beg_pos, after.end_pos, |
@@ -870,7 +879,8 @@ PreParser::Expression PreParser::ParsePostfixExpression(bool* ok) { |
Expression expression = ParseLeftHandSideExpression(CHECK_OK); |
if (!scanner_->HasAnyLineTerminatorBeforeNext() && |
i::Token::IsCountOp(peek())) { |
- if (strict_mode() && expression.IsIdentifier() && |
+ if (!is_classic_mode() && |
+ expression.IsIdentifier() && |
expression.AsIdentifier().IsEvalOrArguments()) { |
i::Scanner::Location after = scanner_->location(); |
ReportMessageAt(before.beg_pos, after.end_pos, |
@@ -1057,7 +1067,7 @@ PreParser::Expression PreParser::ParsePrimaryExpression(bool* ok) { |
} |
case i::Token::FUTURE_STRICT_RESERVED_WORD: |
- if (strict_mode()) { |
+ if (!is_classic_mode()) { |
Next(); |
i::Scanner::Location location = scanner_->location(); |
ReportMessageAt(location, "strict_reserved_word", NULL); |
@@ -1157,7 +1167,7 @@ void PreParser::CheckDuplicate(DuplicateFinder* finder, |
if (HasConflict(old_type, type)) { |
if (IsDataDataConflict(old_type, type)) { |
// Both are data properties. |
- if (!strict_mode()) return; |
+ if (is_classic_mode()) return; |
ReportMessageAt(scanner_->location(), |
"strict_duplicate_property", NULL); |
} else if (IsDataAccessorConflict(old_type, type)) { |
@@ -1364,13 +1374,13 @@ PreParser::Expression PreParser::ParseFunctionLiteral(bool* ok) { |
log_->LogFunction(function_block_pos, end_pos, |
function_scope.materialized_literal_count(), |
function_scope.expected_properties(), |
- strict_mode_flag()); |
+ language_mode()); |
} else { |
ParseSourceElements(i::Token::RBRACE, CHECK_OK); |
Expect(i::Token::RBRACE, CHECK_OK); |
} |
- if (strict_mode()) { |
+ if (!is_classic_mode()) { |
int end_position = scanner_->location().end_pos; |
CheckOctalLiteral(start_position, end_position, CHECK_OK); |
CheckDelayedStrictModeViolation(start_position, end_position, CHECK_OK); |
@@ -1474,7 +1484,7 @@ PreParser::Identifier PreParser::ParseIdentifier(bool* ok) { |
return GetIdentifierSymbol(); |
} |
case i::Token::FUTURE_STRICT_RESERVED_WORD: |
- if (strict_mode()) { |
+ if (!is_classic_mode()) { |
i::Scanner::Location location = scanner_->location(); |
ReportMessageAt(location.beg_pos, location.end_pos, |
"strict_reserved_word", NULL); |
@@ -1493,7 +1503,7 @@ PreParser::Identifier PreParser::ParseIdentifier(bool* ok) { |
void PreParser::SetStrictModeViolation(i::Scanner::Location location, |
const char* type, |
bool* ok) { |
- if (strict_mode()) { |
+ if (!is_classic_mode()) { |
ReportMessageAt(location, type, NULL); |
*ok = false; |
return; |
@@ -1533,7 +1543,7 @@ void PreParser::StrictModeIdentifierViolation(i::Scanner::Location location, |
} else if (identifier.IsFutureStrictReserved()) { |
type = "strict_reserved_word"; |
} |
- if (strict_mode()) { |
+ if (!is_classic_mode()) { |
ReportMessageAt(location, type, NULL); |
*ok = false; |
return; |