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

Side by Side Diff: src/preparser.cc

Issue 1065983005: Introduce "expression classifier" to the parser. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 months 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
« src/preparser.h ('K') | « src/preparser.h ('k') | no next file » | 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 481 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 do { 492 do {
493 // Parse variable name. 493 // Parse variable name.
494 if (nvars > 0) Consume(Token::COMMA); 494 if (nvars > 0) Consume(Token::COMMA);
495 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); 495 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK);
496 Scanner::Location variable_loc = scanner()->location(); 496 Scanner::Location variable_loc = scanner()->location();
497 nvars++; 497 nvars++;
498 if (peek() == Token::ASSIGN || require_initializer || 498 if (peek() == Token::ASSIGN || require_initializer ||
499 // require initializers for multiple consts. 499 // require initializers for multiple consts.
500 (is_strict_const && peek() == Token::COMMA)) { 500 (is_strict_const && peek() == Token::COMMA)) {
501 Expect(Token::ASSIGN, CHECK_OK); 501 Expect(Token::ASSIGN, CHECK_OK);
502 ParseAssignmentExpression(var_context != kForStatement, CHECK_OK); 502 ExpressionClassifier classifier;
503 ParseAssignmentExpression(var_context != kForStatement, &classifier,
504 CHECK_OK);
505 // TODO(dslomov): report error if not valid expression.
503 506
504 variable_loc.end_pos = scanner()->location().end_pos; 507 variable_loc.end_pos = scanner()->location().end_pos;
505 if (first_initializer_loc && !first_initializer_loc->IsValid()) { 508 if (first_initializer_loc && !first_initializer_loc->IsValid()) {
506 *first_initializer_loc = variable_loc; 509 *first_initializer_loc = variable_loc;
507 } 510 }
508 } 511 }
509 } while (peek() == Token::COMMA); 512 } while (peek() == Token::COMMA);
510 513
511 if (bindings_loc) { 514 if (bindings_loc) {
512 *bindings_loc = 515 *bindings_loc =
(...skipping 20 matching lines...) Expand all
533 return Statement::Default(); 536 return Statement::Default();
534 537
535 // TODO(arv): Handle `let [` 538 // TODO(arv): Handle `let [`
536 // https://code.google.com/p/v8/issues/detail?id=3847 539 // https://code.google.com/p/v8/issues/detail?id=3847
537 540
538 default: 541 default:
539 break; 542 break;
540 } 543 }
541 544
542 bool starts_with_identifier = peek_any_identifier(); 545 bool starts_with_identifier = peek_any_identifier();
543 Expression expr = ParseExpression(true, CHECK_OK); 546 ExpressionClassifier classifier;
547 Expression expr = ParseExpression(true, &classifier, CHECK_OK);
548 // TODO(dslomov): report error if not a valid expression.
549
544 // Even if the expression starts with an identifier, it is not necessarily an 550 // Even if the expression starts with an identifier, it is not necessarily an
545 // identifier. For example, "foo + bar" starts with an identifier but is not 551 // identifier. For example, "foo + bar" starts with an identifier but is not
546 // an identifier. 552 // an identifier.
547 if (starts_with_identifier && expr.IsIdentifier() && peek() == Token::COLON) { 553 if (starts_with_identifier && expr.IsIdentifier() && peek() == Token::COLON) {
548 // Expression is a single identifier, and not, e.g., a parenthesized 554 // Expression is a single identifier, and not, e.g., a parenthesized
549 // identifier. 555 // identifier.
550 DCHECK(!expr.AsIdentifier().IsFutureReserved()); 556 DCHECK(!expr.AsIdentifier().IsFutureReserved());
551 DCHECK(is_sloppy(language_mode()) || 557 DCHECK(is_sloppy(language_mode()) ||
552 !IsFutureStrictReserved(expr.AsIdentifier())); 558 !IsFutureStrictReserved(expr.AsIdentifier()));
553 Consume(Token::COLON); 559 Consume(Token::COLON);
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
1061 1067
1062 Scope* scope = NewScope(scope_, BLOCK_SCOPE); 1068 Scope* scope = NewScope(scope_, BLOCK_SCOPE);
1063 BlockState block_state(&scope_, scope); 1069 BlockState block_state(&scope_, scope);
1064 scope_->SetLanguageMode( 1070 scope_->SetLanguageMode(
1065 static_cast<LanguageMode>(class_language_mode | STRICT_BIT)); 1071 static_cast<LanguageMode>(class_language_mode | STRICT_BIT));
1066 // TODO(marja): Make PreParser use scope names too. 1072 // TODO(marja): Make PreParser use scope names too.
1067 // scope_->SetScopeName(name); 1073 // scope_->SetScopeName(name);
1068 1074
1069 bool has_extends = Check(Token::EXTENDS); 1075 bool has_extends = Check(Token::EXTENDS);
1070 if (has_extends) { 1076 if (has_extends) {
1071 ParseLeftHandSideExpression(CHECK_OK); 1077 ExpressionClassifier classifier;
1078 ParseLeftHandSideExpression(&classifier, CHECK_OK);
1079 // TODO(dslomov): report error if not a valid expression.
1072 } 1080 }
1073 1081
1074 ClassLiteralChecker checker(this); 1082 ClassLiteralChecker checker(this);
1075 bool has_seen_constructor = false; 1083 bool has_seen_constructor = false;
1076 1084
1077 Expect(Token::LBRACE, CHECK_OK); 1085 Expect(Token::LBRACE, CHECK_OK);
1078 while (peek() != Token::RBRACE) { 1086 while (peek() != Token::RBRACE) {
1079 if (Check(Token::SEMICOLON)) continue; 1087 if (Check(Token::SEMICOLON)) continue;
1080 const bool in_class = true; 1088 const bool in_class = true;
1081 const bool is_static = false; 1089 const bool is_static = false;
1082 bool is_computed_name = false; // Classes do not care about computed 1090 bool is_computed_name = false; // Classes do not care about computed
1083 // property names here. 1091 // property names here.
1092 ExpressionClassifier classifier;
1084 ParsePropertyDefinition(&checker, in_class, has_extends, is_static, 1093 ParsePropertyDefinition(&checker, in_class, has_extends, is_static,
1085 &is_computed_name, &has_seen_constructor, CHECK_OK); 1094 &is_computed_name, &has_seen_constructor,
1095 &classifier, CHECK_OK);
1096 // TODO(dslomov): report error if not a valid expression.
1086 } 1097 }
1087 1098
1088 Expect(Token::RBRACE, CHECK_OK); 1099 Expect(Token::RBRACE, CHECK_OK);
1089 1100
1090 return Expression::Default(); 1101 return Expression::Default();
1091 } 1102 }
1092 1103
1093 1104
1094 PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) { 1105 PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) {
1095 // CallRuntime :: 1106 // CallRuntime ::
1096 // '%' Identifier Arguments 1107 // '%' Identifier Arguments
1097 Expect(Token::MOD, CHECK_OK); 1108 Expect(Token::MOD, CHECK_OK);
1098 if (!allow_natives()) { 1109 if (!allow_natives()) {
1099 *ok = false; 1110 *ok = false;
1100 return Expression::Default(); 1111 return Expression::Default();
1101 } 1112 }
1102 // Allow "eval" or "arguments" for backward compatibility. 1113 // Allow "eval" or "arguments" for backward compatibility.
1103 ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); 1114 ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK);
1104 Scanner::Location spread_pos; 1115 Scanner::Location spread_pos;
1105 ParseArguments(&spread_pos, ok); 1116 ExpressionClassifier classifier;
1117 ParseArguments(&spread_pos, &classifier, ok);
1118 // TODO(dslomov): report error if not a valid expression.
1106 1119
1107 DCHECK(!spread_pos.IsValid()); 1120 DCHECK(!spread_pos.IsValid());
1108 1121
1109 return Expression::Default(); 1122 return Expression::Default();
1110 } 1123 }
1111 1124
1112 #undef CHECK_OK 1125 #undef CHECK_OK
1113 1126
1114 1127
1115 } } // v8::internal 1128 } } // v8::internal
OLDNEW
« src/preparser.h ('K') | « src/preparser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698