Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index d795b3ce166ae54af87e623553386faf888cc25f..55b4122d71f8cbcccc2d04e8c5d494ef01e508a1 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -919,6 +919,7 @@ Parser::Parser(ParseInfo* info) |
set_allow_harmony_spread_arrays(FLAG_harmony_spread_arrays); |
set_allow_harmony_new_target(FLAG_harmony_new_target); |
set_allow_strong_mode(FLAG_strong_mode); |
+ set_allow_legacy_const(FLAG_legacy_const); |
for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; |
++feature) { |
use_counts_[feature] = 0; |
@@ -1379,16 +1380,21 @@ Statement* Parser::ParseStatementListItem(bool* ok) { |
} |
return ParseClassDeclaration(NULL, ok); |
case Token::CONST: |
+ if (allow_const()) { |
+ return ParseVariableStatement(kStatementListItem, NULL, ok); |
+ } |
+ break; |
case Token::VAR: |
return ParseVariableStatement(kStatementListItem, NULL, ok); |
case Token::LET: |
if (is_strict(language_mode())) { |
return ParseVariableStatement(kStatementListItem, NULL, ok); |
} |
- // Fall through. |
+ break; |
default: |
- return ParseStatement(NULL, ok); |
+ break; |
} |
+ return ParseStatement(NULL, ok); |
} |
@@ -1937,7 +1943,7 @@ Statement* Parser::ParseSubStatement(ZoneList<const AstRawString*>* labels, |
// 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 (is_sloppy(language_mode())) { |
+ if (is_sloppy(language_mode()) && allow_legacy_const()) { |
return ParseVariableStatement(kStatement, NULL, ok); |
} |
@@ -2426,13 +2432,14 @@ void Parser::ParseVariableDeclarations(VariableDeclarationContext var_context, |
return; |
} |
Consume(Token::VAR); |
- } else if (peek() == Token::CONST) { |
+ } else if (peek() == Token::CONST && allow_const()) { |
Consume(Token::CONST); |
- if (is_sloppy(language_mode())) { |
+ if (is_sloppy(language_mode()) && allow_legacy_const()) { |
parsing_result->descriptor.mode = CONST_LEGACY; |
parsing_result->descriptor.init_op = Token::INIT_CONST_LEGACY; |
++use_counts_[v8::Isolate::kLegacyConst]; |
} else { |
+ DCHECK(is_strict(language_mode())); |
DCHECK(var_context != kStatement); |
parsing_result->descriptor.mode = CONST; |
parsing_result->descriptor.init_op = Token::INIT_CONST; |
@@ -3490,7 +3497,7 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
bool is_let_identifier_expression = false; |
DeclarationParsingResult parsing_result; |
if (peek() != Token::SEMICOLON) { |
- if (peek() == Token::VAR || peek() == Token::CONST || |
+ if (peek() == Token::VAR || (peek() == Token::CONST && allow_const()) || |
(peek() == Token::LET && is_strict(language_mode()))) { |
ParseVariableDeclarations(kForStatement, &parsing_result, CHECK_OK); |
is_const = parsing_result.descriptor.mode == CONST; |
@@ -3531,8 +3538,7 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
Block* init_block = nullptr; |
// special case for legacy for (var/const x =.... in) |
- if (is_sloppy(language_mode()) && |
- !IsLexicalVariableMode(parsing_result.descriptor.mode) && |
+ if (!IsLexicalVariableMode(parsing_result.descriptor.mode) && |
parsing_result.declarations[0].initializer != nullptr) { |
VariableProxy* single_var = scope_->NewUnresolved( |
factory(), parsing_result.SingleName(), Variable::NORMAL, |
@@ -3615,8 +3621,7 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
} |
// Create a TDZ for any lexically-bound names. |
- if (is_strict(language_mode()) && |
- IsLexicalVariableMode(parsing_result.descriptor.mode)) { |
+ if (IsLexicalVariableMode(parsing_result.descriptor.mode)) { |
DCHECK_NULL(init_block); |
init_block = |