Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index b25a7b1af2054bb060ade921caa3911f5a20330f..65b22aa28ae06ff83606c3aa8520135c6fbfa540 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -1158,13 +1158,18 @@ Statement* Parser::ParseModuleElement(ZoneList<const AstRawString*>* labels, |
switch (peek()) { |
case Token::FUNCTION: |
return ParseFunctionDeclaration(NULL, ok); |
- case Token::LET: |
- case Token::CONST: |
- return ParseVariableStatement(kModuleElement, NULL, ok); |
case Token::IMPORT: |
return ParseImportDeclaration(ok); |
case Token::EXPORT: |
return ParseExportDeclaration(ok); |
+ case Token::CONST: |
+ return ParseVariableStatement(kModuleElement, NULL, ok); |
+ case Token::LET: |
+ ASSERT(allow_harmony_scoping()); |
+ if (strict_mode() == STRICT) { |
+ return ParseVariableStatement(kModuleElement, NULL, ok); |
+ } |
+ // Fall through. |
default: { |
Statement* stmt = ParseStatement(labels, CHECK_OK); |
// Handle 'module' as a context-sensitive keyword. |
@@ -1463,6 +1468,8 @@ Statement* Parser::ParseExportDeclaration(bool* ok) { |
// |
// TODO(ES6): implement structuring ExportSpecifiers |
+ ASSERT(strict_mode() == STRICT); |
+ |
Expect(Token::EXPORT, CHECK_OK); |
Statement* result = NULL; |
@@ -1545,9 +1552,14 @@ Statement* Parser::ParseBlockElement(ZoneList<const AstRawString*>* labels, |
switch (peek()) { |
case Token::FUNCTION: |
return ParseFunctionDeclaration(NULL, ok); |
- case Token::LET: |
case Token::CONST: |
return ParseVariableStatement(kModuleElement, NULL, ok); |
+ case Token::LET: |
+ ASSERT(allow_harmony_scoping()); |
+ if (strict_mode() == STRICT) { |
+ return ParseVariableStatement(kModuleElement, NULL, ok); |
+ } |
+ // Fall through. |
default: |
return ParseStatement(labels, ok); |
} |
@@ -1583,11 +1595,6 @@ Statement* Parser::ParseStatement(ZoneList<const AstRawString*>* labels, |
case Token::LBRACE: |
return ParseBlock(labels, ok); |
- case Token::CONST: // fall through |
- case Token::LET: |
- case Token::VAR: |
- return ParseVariableStatement(kStatement, NULL, ok); |
- |
case Token::SEMICOLON: |
Next(); |
return factory()->NewEmptyStatement(RelocInfo::kNoPosition); |
@@ -1659,6 +1666,16 @@ Statement* Parser::ParseStatement(ZoneList<const AstRawString*>* labels, |
case Token::DEBUGGER: |
return ParseDebuggerStatement(ok); |
+ case Token::VAR: |
+ case Token::CONST: |
+ return ParseVariableStatement(kStatement, NULL, ok); |
+ |
+ case Token::LET: |
+ ASSERT(allow_harmony_scoping()); |
+ if (strict_mode() == STRICT) { |
+ return ParseVariableStatement(kStatement, NULL, ok); |
+ } |
+ // Fall through. |
default: |
return ParseExpressionOrLabelledStatement(labels, ok); |
} |
@@ -2062,20 +2079,7 @@ Block* Parser::ParseVariableDeclarations( |
} |
is_const = true; |
needs_init = true; |
- } else if (peek() == Token::LET) { |
- // ES6 Draft Rev4 section 12.2.1: |
- // |
- // LetDeclaration : let LetBindingList ; |
- // |
- // * It is a Syntax Error if the code that matches this production is not |
- // contained in extended code. |
- // |
- // TODO(rossberg): make 'let' a legal identifier in sloppy mode. |
- if (!allow_harmony_scoping() || strict_mode() == SLOPPY) { |
- ReportMessage("illegal_let"); |
- *ok = false; |
- return NULL; |
- } |
+ } else if (peek() == Token::LET && strict_mode() == STRICT) { |
marja
2014/07/10 14:05:28
Here you probably also want to ASSERT(allow_harmon
|
Consume(Token::LET); |
if (var_context == kStatement) { |
// Let declarations are only allowed in source element positions. |
@@ -3114,7 +3118,7 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
} else { |
init = variable_statement; |
} |
- } else if (peek() == Token::LET) { |
+ } else if (peek() == Token::LET && strict_mode() == STRICT) { |
marja
2014/07/10 14:05:28
Ditto
|
const AstRawString* name = NULL; |
VariableDeclarationProperties decl_props = kHasNoInitializers; |
Block* variable_statement = |
@@ -3500,8 +3504,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
fvar_init_op = Token::INIT_CONST; |
} |
VariableMode fvar_mode = |
- allow_harmony_scoping() && strict_mode() == STRICT ? CONST |
- : CONST_LEGACY; |
+ allow_harmony_scoping() && strict_mode() == STRICT |
+ ? CONST : CONST_LEGACY; |
ASSERT(function_name != NULL); |
fvar = new(zone()) Variable(scope_, |
function_name, fvar_mode, true /* is valid LHS */, |