Index: src/preparser.cc |
diff --git a/src/preparser.cc b/src/preparser.cc |
index 68d9109db4e85aa7972db4fe377f62a101fd9ba3..2bed1932710e0573a015a3503bbe2894fa23d11d 100644 |
--- a/src/preparser.cc |
+++ b/src/preparser.cc |
@@ -102,13 +102,13 @@ PreParserExpression PreParserTraits::ParseFunctionLiteral( |
PreParser::PreParseResult PreParser::PreParseLazyFunction( |
- StrictMode strict_mode, bool is_generator, ParserRecorder* log) { |
+ LanguageMode language_mode, bool is_generator, ParserRecorder* log) { |
log_ = log; |
// Lazy functions always have trivial outer scopes (no with/catch scopes). |
PreParserScope top_scope(scope_, SCRIPT_SCOPE); |
PreParserFactory top_factory(NULL); |
FunctionState top_state(&function_state_, &scope_, &top_scope, &top_factory); |
- scope_->SetStrictMode(strict_mode); |
+ scope_->SetLanguageMode(language_mode); |
PreParserScope function_scope(scope_, FUNCTION_SCOPE); |
PreParserFactory function_factory(NULL); |
FunctionState function_state(&function_state_, &scope_, &function_scope, |
@@ -123,7 +123,7 @@ PreParser::PreParseResult PreParser::PreParseLazyFunction( |
ReportUnexpectedToken(scanner()->current_token()); |
} else { |
DCHECK_EQ(Token::RBRACE, scanner()->peek()); |
- if (scope_->strict_mode() == STRICT) { |
+ if (is_strict(scope_->language_mode())) { |
int end_pos = scanner()->location().end_pos; |
CheckStrictOctalLiteral(start_position, end_pos, &ok); |
} |
@@ -188,7 +188,7 @@ PreParser::Statement PreParser::ParseSourceElement(bool* ok) { |
return ParseVariableStatement(kSourceElement, ok); |
case Token::LET: |
DCHECK(allow_harmony_scoping()); |
- if (strict_mode() == STRICT) { |
+ if (is_strict(language_mode())) { |
return ParseVariableStatement(kSourceElement, ok); |
} |
// Fall through. |
@@ -211,7 +211,8 @@ PreParser::SourceElements PreParser::ParseSourceElements(int end_token, |
Statement statement = ParseSourceElement(CHECK_OK); |
if (directive_prologue) { |
if (statement.IsUseStrictLiteral()) { |
- scope_->SetStrictMode(STRICT); |
+ scope_->SetLanguageMode( |
+ static_cast<LanguageMode>(scope_->language_mode() | STRICT)); |
} else if (!statement.IsStringLiteral()) { |
directive_prologue = false; |
} |
@@ -300,7 +301,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 (strict_mode() == STRICT) { |
+ if (is_strict(language_mode())) { |
PreParserTraits::ReportMessageAt(start_location.beg_pos, |
end_location.end_pos, |
"strict_function"); |
@@ -321,7 +322,7 @@ PreParser::Statement PreParser::ParseStatement(bool* ok) { |
// In ES6 CONST is not allowed as a Statement, only as a |
// LexicalDeclaration, however we continue to allow it in sloppy mode for |
// backwards compatibility. |
- if (strict_mode() == SLOPPY) { |
+ if (is_sloppy(language_mode())) { |
return ParseVariableStatement(kStatement, ok); |
} |
@@ -355,7 +356,7 @@ PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) { |
PreParser::Statement PreParser::ParseClassDeclaration(bool* ok) { |
Expect(Token::CLASS, CHECK_OK); |
- if (!allow_harmony_sloppy() && strict_mode() == SLOPPY) { |
+ if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { |
ReportMessage("sloppy_lexical"); |
*ok = false; |
return Statement::Default(); |
@@ -380,7 +381,7 @@ PreParser::Statement PreParser::ParseBlock(bool* ok) { |
// |
Expect(Token::LBRACE, CHECK_OK); |
while (peek() != Token::RBRACE) { |
- if (allow_harmony_scoping() && strict_mode() == STRICT) { |
+ if (allow_harmony_scoping() && is_strict(language_mode())) { |
ParseSourceElement(CHECK_OK); |
} else { |
ParseStatement(CHECK_OK); |
@@ -445,7 +446,7 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
// existing pages. Therefore we keep allowing const with the old |
// non-harmony semantics in sloppy mode. |
Consume(Token::CONST); |
- if (strict_mode() == STRICT) { |
+ if (is_strict(language_mode())) { |
DCHECK(var_context != kStatement); |
if (!allow_harmony_scoping()) { |
Scanner::Location location = scanner()->peek_location(); |
@@ -456,7 +457,7 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
is_strict_const = true; |
require_initializer = var_context != kForStatement; |
} |
- } else if (peek() == Token::LET && strict_mode() == STRICT) { |
+ } else if (peek() == Token::LET && is_strict(language_mode())) { |
Consume(Token::LET); |
DCHECK(var_context != kStatement); |
} else { |
@@ -518,7 +519,7 @@ PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) { |
// Expression is a single identifier, and not, e.g., a parenthesized |
// identifier. |
DCHECK(!expr.AsIdentifier().IsFutureReserved()); |
- DCHECK(strict_mode() == SLOPPY || |
+ DCHECK(is_sloppy(language_mode()) || |
!IsFutureStrictReserved(expr.AsIdentifier())); |
Consume(Token::COLON); |
return ParseStatement(ok); |
@@ -528,7 +529,7 @@ PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) { |
} |
// Parsed expression statement. |
// Detect attempts at 'let' declarations in sloppy mode. |
- if (peek() == Token::IDENTIFIER && strict_mode() == SLOPPY && |
+ if (peek() == Token::IDENTIFIER && is_sloppy(language_mode()) && |
expr.IsIdentifier() && expr.AsIdentifier().IsLet()) { |
ReportMessage("sloppy_lexical", NULL); |
*ok = false; |
@@ -622,7 +623,7 @@ PreParser::Statement PreParser::ParseWithStatement(bool* ok) { |
// WithStatement :: |
// 'with' '(' Expression ')' Statement |
Expect(Token::WITH, CHECK_OK); |
- if (strict_mode() == STRICT) { |
+ if (is_strict(language_mode())) { |
ReportMessageAt(scanner()->location(), "strict_mode_with"); |
*ok = false; |
return Statement::Default(); |
@@ -716,9 +717,9 @@ PreParser::Statement PreParser::ParseForStatement(bool* ok) { |
bool is_let_identifier_expression = false; |
if (peek() != Token::SEMICOLON) { |
if (peek() == Token::VAR || peek() == Token::CONST || |
- (peek() == Token::LET && strict_mode() == STRICT)) { |
+ (peek() == Token::LET && is_strict(language_mode()))) { |
bool is_lexical = peek() == Token::LET || |
- (peek() == Token::CONST && strict_mode() == STRICT); |
+ (peek() == Token::CONST && is_strict(language_mode())); |
int decl_count; |
VariableDeclarationProperties decl_props = kHasNoInitializers; |
ParseVariableDeclarations( |
@@ -749,7 +750,7 @@ PreParser::Statement PreParser::ParseForStatement(bool* ok) { |
// Parsed initializer at this point. |
// Detect attempts at 'let' declarations in sloppy mode. |
- if (peek() == Token::IDENTIFIER && strict_mode() == SLOPPY && |
+ if (peek() == Token::IDENTIFIER && is_sloppy(language_mode()) && |
is_let_identifier_expression) { |
ReportMessage("sloppy_lexical", NULL); |
*ok = false; |
@@ -934,7 +935,7 @@ PreParser::Expression PreParser::ParseFunctionLiteral( |
// Validate strict mode. We can do this only after parsing the function, |
// since the function can declare itself strict. |
// Concise methods use StrictFormalParameters. |
- if (strict_mode() == STRICT || IsConciseMethod(kind) || is_rest) { |
+ if (is_strict(language_mode()) || IsConciseMethod(kind) || is_rest) { |
if (function_name.IsEvalOrArguments()) { |
ReportMessageAt(function_name_location, "strict_eval_arguments"); |
*ok = false; |
@@ -977,10 +978,9 @@ void PreParser::ParseLazyFunctionLiteralBody(bool* ok) { |
// Position right after terminal '}'. |
DCHECK_EQ(Token::RBRACE, scanner()->peek()); |
int body_end = scanner()->peek_location().end_pos; |
- log_->LogFunction(body_start, body_end, |
- function_state_->materialized_literal_count(), |
- function_state_->expected_property_count(), |
- strict_mode()); |
+ log_->LogFunction( |
+ body_start, body_end, function_state_->materialized_literal_count(), |
+ function_state_->expected_property_count(), language_mode()); |
} |
@@ -1001,7 +1001,8 @@ PreParserExpression PreParser::ParseClassLiteral( |
PreParserScope scope = NewScope(scope_, BLOCK_SCOPE); |
BlockState block_state(&scope_, &scope); |
- scope_->SetStrictMode(STRICT); |
+ scope_->SetLanguageMode( |
+ static_cast<LanguageMode>(scope_->language_mode() | STRICT)); |
scope_->SetScopeName(name); |
bool has_extends = Check(Token::EXTENDS); |