Index: src/preparser.cc |
diff --git a/src/preparser.cc b/src/preparser.cc |
index 43935a05ca864e09bf40ae5bb448c4814268d13c..18ba3790bb596a2cfedde06e2e987b95a09a3449 100644 |
--- a/src/preparser.cc |
+++ b/src/preparser.cc |
@@ -139,12 +139,12 @@ PreParserExpression PreParserTraits::ParseV8Intrinsic(bool* ok) { |
PreParser::PreParseResult PreParser::PreParseLazyFunction( |
- LanguageMode mode, bool is_generator, ParserRecorder* log) { |
+ StrictMode strict_mode, bool is_generator, ParserRecorder* log) { |
log_ = log; |
// Lazy functions always have trivial outer scopes (no with/catch scopes). |
PreParserScope top_scope(scope_, GLOBAL_SCOPE); |
FunctionState top_state(&function_state_, &scope_, &top_scope); |
- scope_->SetLanguageMode(mode); |
+ scope_->SetStrictMode(strict_mode); |
PreParserScope function_scope(scope_, FUNCTION_SCOPE); |
FunctionState function_state(&function_state_, &scope_, &function_scope); |
function_state.set_is_generator(is_generator); |
@@ -157,7 +157,7 @@ PreParser::PreParseResult PreParser::PreParseLazyFunction( |
ReportUnexpectedToken(scanner()->current_token()); |
} else { |
ASSERT_EQ(Token::RBRACE, scanner()->peek()); |
- if (!scope_->is_sloppy_mode()) { |
+ if (scope_->strict_mode() == STRICT) { |
int end_pos = scanner()->location().end_pos; |
CheckOctalLiteral(start_position, end_pos, &ok); |
} |
@@ -224,8 +224,7 @@ PreParser::SourceElements PreParser::ParseSourceElements(int end_token, |
Statement statement = ParseSourceElement(CHECK_OK); |
if (directive_prologue) { |
if (statement.IsUseStrictLiteral()) { |
- scope_->SetLanguageMode(allow_harmony_scoping() ? |
- EXTENDED_MODE : STRICT_MODE); |
+ scope_->SetStrictMode(STRICT); |
} else if (!statement.IsStringLiteral()) { |
directive_prologue = false; |
} |
@@ -319,7 +318,7 @@ PreParser::Statement PreParser::ParseStatement(bool* ok) { |
Scanner::Location start_location = scanner()->peek_location(); |
Statement statement = ParseFunctionDeclaration(CHECK_OK); |
Scanner::Location end_location = scanner()->location(); |
- if (!scope_->is_sloppy_mode()) { |
+ if (strict_mode() == STRICT) { |
PreParserTraits::ReportMessageAt(start_location.beg_pos, |
end_location.end_pos, |
"strict_function", |
@@ -370,7 +369,7 @@ PreParser::Statement PreParser::ParseBlock(bool* ok) { |
// |
Expect(Token::LBRACE, CHECK_OK); |
while (peek() != Token::RBRACE) { |
- if (scope_->is_extended_mode()) { |
+ if (FLAG_harmony_scoping && strict_mode() == STRICT) { |
ParseSourceElement(CHECK_OK); |
} else { |
ParseStatement(CHECK_OK); |
@@ -434,24 +433,20 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
// existing pages. Therefore we keep allowing const with the old |
// non-harmony semantics in sloppy mode. |
Consume(Token::CONST); |
- switch (scope_->language_mode()) { |
- case SLOPPY_MODE: |
- break; |
- case STRICT_MODE: { |
- Scanner::Location location = scanner()->peek_location(); |
- ReportMessageAt(location, "strict_const"); |
- *ok = false; |
- return Statement::Default(); |
- } |
- case EXTENDED_MODE: |
- if (var_context != kSourceElement && |
- var_context != kForStatement) { |
+ if (strict_mode() == STRICT) { |
+ if (FLAG_harmony_scoping) { |
+ if (var_context != kSourceElement && var_context != kForStatement) { |
ReportMessageAt(scanner()->peek_location(), "unprotected_const"); |
*ok = false; |
return Statement::Default(); |
} |
require_initializer = true; |
- break; |
+ } else { |
+ Scanner::Location location = scanner()->peek_location(); |
+ ReportMessageAt(location, "strict_const"); |
+ *ok = false; |
+ return Statement::Default(); |
+ } |
} |
} else if (peek() == Token::LET) { |
// ES6 Draft Rev4 section 12.2.1: |
@@ -460,7 +455,9 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
// |
// * It is a Syntax Error if the code that matches this production is not |
// contained in extended code. |
- if (!scope_->is_extended_mode()) { |
+ // |
+ // TODO(rossberg): make 'let' a legal identifier in sloppy mode. |
+ if (!FLAG_harmony_scoping || strict_mode() == SLOPPY) { |
ReportMessageAt(scanner()->peek_location(), "illegal_let"); |
*ok = false; |
return Statement::Default(); |
@@ -513,7 +510,7 @@ PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) { |
// Expression is a single identifier, and not, e.g., a parenthesized |
// identifier. |
ASSERT(!expr.AsIdentifier().IsFutureReserved()); |
- ASSERT(scope_->is_sloppy_mode() || |
+ ASSERT(strict_mode() == SLOPPY || |
(!expr.AsIdentifier().IsFutureStrictReserved() && |
!expr.AsIdentifier().IsYield())); |
Consume(Token::COLON); |
@@ -611,7 +608,7 @@ PreParser::Statement PreParser::ParseWithStatement(bool* ok) { |
// WithStatement :: |
// 'with' '(' Expression ')' Statement |
Expect(Token::WITH, CHECK_OK); |
- if (!scope_->is_sloppy_mode()) { |
+ if (strict_mode() == STRICT) { |
ReportMessageAt(scanner()->location(), "strict_mode_with"); |
*ok = false; |
return Statement::Default(); |
@@ -850,7 +847,7 @@ PreParser::Expression PreParser::ParseAssignmentExpression(bool accept_IN, |
return expression; |
} |
- if (!scope_->is_sloppy_mode() && |
+ if (strict_mode() == STRICT && |
expression.IsIdentifier() && |
expression.AsIdentifier().IsEvalOrArguments()) { |
Scanner::Location after = scanner()->location(); |
@@ -944,7 +941,7 @@ PreParser::Expression PreParser::ParseUnaryExpression(bool* ok) { |
op = Next(); |
Scanner::Location before = scanner()->peek_location(); |
Expression expression = ParseUnaryExpression(CHECK_OK); |
- if (!scope_->is_sloppy_mode() && |
+ if (strict_mode() == STRICT && |
expression.IsIdentifier() && |
expression.AsIdentifier().IsEvalOrArguments()) { |
Scanner::Location after = scanner()->location(); |
@@ -967,7 +964,7 @@ PreParser::Expression PreParser::ParsePostfixExpression(bool* ok) { |
Expression expression = ParseLeftHandSideExpression(CHECK_OK); |
if (!scanner()->HasAnyLineTerminatorBeforeNext() && |
Token::IsCountOp(peek())) { |
- if (!scope_->is_sloppy_mode() && |
+ if (strict_mode() == STRICT && |
expression.IsIdentifier() && |
expression.AsIdentifier().IsEvalOrArguments()) { |
Scanner::Location after = scanner()->location(); |
@@ -1129,7 +1126,7 @@ PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) { |
// | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) |
// )*[','] '}' |
- ObjectLiteralChecker checker(this, scope_->language_mode()); |
+ ObjectLiteralChecker checker(this, strict_mode()); |
Expect(Token::LBRACE, CHECK_OK); |
while (peek() != Token::RBRACE) { |
@@ -1302,7 +1299,7 @@ PreParser::Expression PreParser::ParseFunctionLiteral( |
// Validate strict mode. We can do this only after parsing the function, |
// since the function can declare itself strict. |
- if (!scope_->is_sloppy_mode()) { |
+ if (strict_mode() == STRICT) { |
if (function_name.IsEvalOrArguments()) { |
ReportMessageAt(function_name_location, "strict_eval_arguments"); |
*ok = false; |
@@ -1351,7 +1348,7 @@ void PreParser::ParseLazyFunctionLiteralBody(bool* ok) { |
log_->LogFunction(body_start, body_end, |
function_state_->materialized_literal_count(), |
function_state_->expected_property_count(), |
- scope_->language_mode()); |
+ strict_mode()); |
} |