Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(568)

Side by Side Diff: src/preparser.cc

Issue 713413003: harmony-scoping: better error messages for let declarations in sloppy mode. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Patch for landing Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parser.cc ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <cmath> 5 #include <cmath>
6 6
7 #include "src/allocation.h" 7 #include "src/allocation.h"
8 #include "src/base/logging.h" 8 #include "src/base/logging.h"
9 #include "src/conversions-inl.h" 9 #include "src/conversions-inl.h"
10 #include "src/conversions.h" 10 #include "src/conversions.h"
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 DCHECK(!expr.AsIdentifier().IsFutureReserved()); 502 DCHECK(!expr.AsIdentifier().IsFutureReserved());
503 DCHECK(strict_mode() == SLOPPY || 503 DCHECK(strict_mode() == SLOPPY ||
504 !IsFutureStrictReserved(expr.AsIdentifier())); 504 !IsFutureStrictReserved(expr.AsIdentifier()));
505 Consume(Token::COLON); 505 Consume(Token::COLON);
506 return ParseStatement(ok); 506 return ParseStatement(ok);
507 // Preparsing is disabled for extensions (because the extension details 507 // Preparsing is disabled for extensions (because the extension details
508 // aren't passed to lazily compiled functions), so we don't 508 // aren't passed to lazily compiled functions), so we don't
509 // accept "native function" in the preparser. 509 // accept "native function" in the preparser.
510 } 510 }
511 // Parsed expression statement. 511 // Parsed expression statement.
512 // Detect attempts at 'let' declarations in sloppy mode.
513 if (peek() == Token::IDENTIFIER && strict_mode() == SLOPPY &&
514 expr.IsIdentifier() && expr.AsIdentifier().IsLet()) {
515 ReportMessage("lexical_strict_mode", NULL);
516 *ok = false;
517 return Statement::Default();
518 }
512 ExpectSemicolon(CHECK_OK); 519 ExpectSemicolon(CHECK_OK);
513 return Statement::ExpressionStatement(expr); 520 return Statement::ExpressionStatement(expr);
514 } 521 }
515 522
516 523
517 PreParser::Statement PreParser::ParseIfStatement(bool* ok) { 524 PreParser::Statement PreParser::ParseIfStatement(bool* ok) {
518 // IfStatement :: 525 // IfStatement ::
519 // 'if' '(' Expression ')' Statement ('else' Statement)? 526 // 'if' '(' Expression ')' Statement ('else' Statement)?
520 527
521 Expect(Token::IF, CHECK_OK); 528 Expect(Token::IF, CHECK_OK);
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 return false; 688 return false;
682 } 689 }
683 690
684 691
685 PreParser::Statement PreParser::ParseForStatement(bool* ok) { 692 PreParser::Statement PreParser::ParseForStatement(bool* ok) {
686 // ForStatement :: 693 // ForStatement ::
687 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement 694 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement
688 695
689 Expect(Token::FOR, CHECK_OK); 696 Expect(Token::FOR, CHECK_OK);
690 Expect(Token::LPAREN, CHECK_OK); 697 Expect(Token::LPAREN, CHECK_OK);
698 bool is_let_identifier_expression = false;
691 if (peek() != Token::SEMICOLON) { 699 if (peek() != Token::SEMICOLON) {
692 if (peek() == Token::VAR || peek() == Token::CONST || 700 if (peek() == Token::VAR || peek() == Token::CONST ||
693 (peek() == Token::LET && strict_mode() == STRICT)) { 701 (peek() == Token::LET && strict_mode() == STRICT)) {
694 bool is_lexical = peek() == Token::LET || 702 bool is_lexical = peek() == Token::LET ||
695 (peek() == Token::CONST && strict_mode() == STRICT); 703 (peek() == Token::CONST && strict_mode() == STRICT);
696 int decl_count; 704 int decl_count;
697 VariableDeclarationProperties decl_props = kHasNoInitializers; 705 VariableDeclarationProperties decl_props = kHasNoInitializers;
698 ParseVariableDeclarations( 706 ParseVariableDeclarations(
699 kForStatement, &decl_props, &decl_count, CHECK_OK); 707 kForStatement, &decl_props, &decl_count, CHECK_OK);
700 bool has_initializers = decl_props == kHasInitializers; 708 bool has_initializers = decl_props == kHasInitializers;
701 bool accept_IN = decl_count == 1 && !(is_lexical && has_initializers); 709 bool accept_IN = decl_count == 1 && !(is_lexical && has_initializers);
702 bool accept_OF = !has_initializers; 710 bool accept_OF = !has_initializers;
703 if (accept_IN && CheckInOrOf(accept_OF)) { 711 if (accept_IN && CheckInOrOf(accept_OF)) {
704 ParseExpression(true, CHECK_OK); 712 ParseExpression(true, CHECK_OK);
705 Expect(Token::RPAREN, CHECK_OK); 713 Expect(Token::RPAREN, CHECK_OK);
706 714
707 ParseStatement(CHECK_OK); 715 ParseStatement(CHECK_OK);
708 return Statement::Default(); 716 return Statement::Default();
709 } 717 }
710 } else { 718 } else {
711 Expression lhs = ParseExpression(false, CHECK_OK); 719 Expression lhs = ParseExpression(false, CHECK_OK);
720 is_let_identifier_expression =
721 lhs.IsIdentifier() && lhs.AsIdentifier().IsLet();
712 if (CheckInOrOf(lhs.IsIdentifier())) { 722 if (CheckInOrOf(lhs.IsIdentifier())) {
713 ParseExpression(true, CHECK_OK); 723 ParseExpression(true, CHECK_OK);
714 Expect(Token::RPAREN, CHECK_OK); 724 Expect(Token::RPAREN, CHECK_OK);
715 725
716 ParseStatement(CHECK_OK); 726 ParseStatement(CHECK_OK);
717 return Statement::Default(); 727 return Statement::Default();
718 } 728 }
719 } 729 }
720 } 730 }
721 731
722 // Parsed initializer at this point. 732 // Parsed initializer at this point.
733 // Detect attempts at 'let' declarations in sloppy mode.
734 if (peek() == Token::IDENTIFIER && strict_mode() == SLOPPY &&
735 is_let_identifier_expression) {
736 ReportMessage("lexical_strict_mode", NULL);
737 *ok = false;
738 return Statement::Default();
739 }
723 Expect(Token::SEMICOLON, CHECK_OK); 740 Expect(Token::SEMICOLON, CHECK_OK);
724 741
725 if (peek() != Token::SEMICOLON) { 742 if (peek() != Token::SEMICOLON) {
726 ParseExpression(true, CHECK_OK); 743 ParseExpression(true, CHECK_OK);
727 } 744 }
728 Expect(Token::SEMICOLON, CHECK_OK); 745 Expect(Token::SEMICOLON, CHECK_OK);
729 746
730 if (peek() != Token::RPAREN) { 747 if (peek() != Token::RPAREN) {
731 ParseExpression(true, CHECK_OK); 748 ParseExpression(true, CHECK_OK);
732 } 749 }
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); 1006 ParseIdentifier(kAllowEvalOrArguments, CHECK_OK);
990 ParseArguments(ok); 1007 ParseArguments(ok);
991 1008
992 return Expression::Default(); 1009 return Expression::Default();
993 } 1010 }
994 1011
995 #undef CHECK_OK 1012 #undef CHECK_OK
996 1013
997 1014
998 } } // v8::internal 1015 } } // v8::internal
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698