Index: src/preparser.cc |
=================================================================== |
--- src/preparser.cc (revision 9531) |
+++ src/preparser.cc (working copy) |
@@ -117,7 +117,18 @@ |
PreParser::Statement PreParser::ParseSourceElement(bool* ok) { |
+ // (Ecma 262 5th Edition, clause 14): |
+ // SourceElement: |
+ // Statement |
+ // FunctionDeclaration |
+ // |
+ // In harmony mode we allow additionally the following productions |
+ // SourceElement: |
+ // LetDeclaration |
+ |
switch (peek()) { |
+ case i::Token::FUNCTION: |
+ return ParseFunctionDeclaration(ok); |
case i::Token::LET: |
return ParseVariableStatement(kSourceElement, ok); |
default: |
@@ -225,8 +236,19 @@ |
case i::Token::TRY: |
return ParseTryStatement(ok); |
- case i::Token::FUNCTION: |
- return ParseFunctionDeclaration(ok); |
+ case i::Token::FUNCTION: { |
+ i::Scanner::Location start_location = scanner_->peek_location(); |
+ Statement statement = ParseFunctionDeclaration(CHECK_OK); |
+ i::Scanner::Location end_location = scanner_->location(); |
+ if (strict_mode()) { |
+ ReportMessageAt(start_location.beg_pos, end_location.end_pos, |
+ "strict_function", NULL); |
+ *ok = false; |
+ return Statement::Default(); |
+ } else { |
+ return statement; |
+ } |
+ } |
case i::Token::DEBUGGER: |
return ParseDebuggerStatement(ok); |
@@ -271,14 +293,10 @@ |
// |
Expect(i::Token::LBRACE, CHECK_OK); |
while (peek() != i::Token::RBRACE) { |
- i::Scanner::Location start_location = scanner_->peek_location(); |
- Statement statement = ParseSourceElement(CHECK_OK); |
- i::Scanner::Location end_location = scanner_->location(); |
- if (strict_mode() && statement.IsFunctionDeclaration()) { |
- ReportMessageAt(start_location.beg_pos, end_location.end_pos, |
- "strict_function", NULL); |
- *ok = false; |
- return Statement::Default(); |
+ if (harmony_block_scoping_) { |
+ ParseSourceElement(CHECK_OK); |
+ } else { |
+ ParseStatement(CHECK_OK); |
} |
} |
Expect(i::Token::RBRACE, ok); |
@@ -372,18 +390,11 @@ |
Expression expr = ParseExpression(true, CHECK_OK); |
if (expr.IsRawIdentifier()) { |
- if (peek() == i::Token::COLON && |
- (!strict_mode() || !expr.AsIdentifier().IsFutureReserved())) { |
+ ASSERT(!expr.AsIdentifier().IsFutureReserved()); |
+ ASSERT(!strict_mode() || !expr.AsIdentifier().IsFutureStrictReserved()); |
+ if (peek() == i::Token::COLON) { |
Consume(i::Token::COLON); |
- i::Scanner::Location start_location = scanner_->peek_location(); |
- Statement statement = ParseStatement(CHECK_OK); |
- if (strict_mode() && statement.IsFunctionDeclaration()) { |
- i::Scanner::Location end_location = scanner_->location(); |
- ReportMessageAt(start_location.beg_pos, end_location.end_pos, |
- "strict_function", NULL); |
- *ok = false; |
- } |
- return Statement::Default(); |
+ return ParseStatement(ok); |
} |
// Preparsing is disabled for extensions (because the extension details |
// aren't passed to lazily compiled functions), so we don't |
@@ -513,15 +524,7 @@ |
Expect(i::Token::DEFAULT, CHECK_OK); |
Expect(i::Token::COLON, CHECK_OK); |
} else { |
- i::Scanner::Location start_location = scanner_->peek_location(); |
- Statement statement = ParseStatement(CHECK_OK); |
- if (strict_mode() && statement.IsFunctionDeclaration()) { |
- i::Scanner::Location end_location = scanner_->location(); |
- ReportMessageAt(start_location.beg_pos, end_location.end_pos, |
- "strict_function", NULL); |
- *ok = false; |
- return Statement::Default(); |
- } |
+ ParseStatement(CHECK_OK); |
} |
token = peek(); |
} |
@@ -1434,9 +1437,16 @@ |
ReportMessageAt(location.beg_pos, location.end_pos, |
"reserved_word", NULL); |
*ok = false; |
+ return GetIdentifierSymbol(); |
} |
+ case i::Token::FUTURE_STRICT_RESERVED_WORD: |
+ if (strict_mode()) { |
+ i::Scanner::Location location = scanner_->location(); |
+ ReportMessageAt(location.beg_pos, location.end_pos, |
+ "strict_reserved_word", NULL); |
+ *ok = false; |
+ } |
// FALLTHROUGH |
- case i::Token::FUTURE_STRICT_RESERVED_WORD: |
case i::Token::IDENTIFIER: |
return GetIdentifierSymbol(); |
default: |