Chromium Code Reviews| Index: src/preparser.cc |
| diff --git a/src/preparser.cc b/src/preparser.cc |
| index df9e48ef769afa8b018d383c324440412819498e..2490ebad2bf92036748114f362471adab0bc3d8a 100644 |
| --- a/src/preparser.cc |
| +++ b/src/preparser.cc |
| @@ -61,6 +61,8 @@ PreParserIdentifier PreParserTraits::GetSymbol(Scanner* scanner) { |
| } else if (scanner->current_token() == |
| Token::FUTURE_STRICT_RESERVED_WORD) { |
| return PreParserIdentifier::FutureStrictReserved(); |
| + } else if (scanner->current_token() == Token::LET) { |
| + return PreParserIdentifier::Let(); |
| } else if (scanner->current_token() == Token::YIELD) { |
| return PreParserIdentifier::Yield(); |
| } |
| @@ -167,9 +169,13 @@ PreParser::Statement PreParser::ParseSourceElement(bool* ok) { |
| switch (peek()) { |
| case Token::FUNCTION: |
| return ParseFunctionDeclaration(ok); |
| - case Token::LET: |
| case Token::CONST: |
| return ParseVariableStatement(kSourceElement, ok); |
| + case Token::LET: |
| + if (allow_harmony_scoping() && strict_mode() == STRICT) { |
|
marja
2014/07/09 14:24:45
Ditto
|
| + return ParseVariableStatement(kSourceElement, ok); |
| + } |
| + // Fall through. |
| default: |
| return ParseStatement(ok); |
| } |
| @@ -237,11 +243,6 @@ PreParser::Statement PreParser::ParseStatement(bool* ok) { |
| case Token::LBRACE: |
| return ParseBlock(ok); |
| - case Token::CONST: |
| - case Token::LET: |
| - case Token::VAR: |
| - return ParseVariableStatement(kStatement, ok); |
| - |
| case Token::SEMICOLON: |
| Next(); |
| return Statement::Default(); |
| @@ -297,6 +298,15 @@ PreParser::Statement PreParser::ParseStatement(bool* ok) { |
| case Token::DEBUGGER: |
| return ParseDebuggerStatement(ok); |
| + case Token::VAR: |
| + case Token::CONST: |
| + return ParseVariableStatement(kStatement, ok); |
| + |
| + case Token::LET: |
| + if (allow_harmony_scoping() && strict_mode() == STRICT) { |
|
marja
2014/07/09 14:24:45
Ditto
|
| + return ParseVariableStatement(kStatement, ok); |
| + } |
| + // Fall through. |
| default: |
| return ParseExpressionOrLabelledStatement(ok); |
| } |
| @@ -415,23 +425,9 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
| return Statement::Default(); |
| } |
| } |
| - } 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) { |
| - ReportMessageAt(scanner()->peek_location(), "illegal_let"); |
| - *ok = false; |
| - return Statement::Default(); |
| - } |
| + } else if (peek() == Token::LET && strict_mode() == STRICT) { |
| Consume(Token::LET); |
| - if (var_context != kSourceElement && |
| - var_context != kForStatement) { |
| + if (var_context != kSourceElement && var_context != kForStatement) { |
| ReportMessageAt(scanner()->peek_location(), "unprotected_let"); |
| *ok = false; |
| return Statement::Default(); |
| @@ -669,7 +665,7 @@ PreParser::Statement PreParser::ParseForStatement(bool* ok) { |
| Expect(Token::LPAREN, CHECK_OK); |
| if (peek() != Token::SEMICOLON) { |
| if (peek() == Token::VAR || peek() == Token::CONST || |
| - peek() == Token::LET) { |
| + (peek() == Token::LET && strict_mode() == STRICT)) { |
| bool is_let = peek() == Token::LET; |
| int decl_count; |
| VariableDeclarationProperties decl_props = kHasNoInitializers; |