| OLD | NEW |
| 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 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 | 506 |
| 507 // The scope of a var/const declared variable anywhere inside a function | 507 // The scope of a var/const declared variable anywhere inside a function |
| 508 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). The scope | 508 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). The scope |
| 509 // of a let declared variable is the scope of the immediately enclosing | 509 // of a let declared variable is the scope of the immediately enclosing |
| 510 // block. | 510 // block. |
| 511 int nvars = 0; // the number of variables declared | 511 int nvars = 0; // the number of variables declared |
| 512 int bindings_start = peek_position(); | 512 int bindings_start = peek_position(); |
| 513 do { | 513 do { |
| 514 // Parse variable name. | 514 // Parse variable name. |
| 515 if (nvars > 0) Consume(Token::COMMA); | 515 if (nvars > 0) Consume(Token::COMMA); |
| 516 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); | 516 { |
| 517 ExpressionClassifier pattern_classifier; |
| 518 Token::Value next = peek(); |
| 519 PreParserExpression pattern = |
| 520 ParsePrimaryExpression(&pattern_classifier, CHECK_OK); |
| 521 ValidateBindingPattern(&pattern_classifier, CHECK_OK); |
| 522 |
| 523 if (!pattern.IsIdentifier()) { |
| 524 ReportUnexpectedToken(next); |
| 525 *ok = false; |
| 526 return Statement::Default(); |
| 527 } |
| 528 } |
| 517 Scanner::Location variable_loc = scanner()->location(); | 529 Scanner::Location variable_loc = scanner()->location(); |
| 518 nvars++; | 530 nvars++; |
| 519 if (peek() == Token::ASSIGN || require_initializer || | 531 if (peek() == Token::ASSIGN || require_initializer || |
| 520 // require initializers for multiple consts. | 532 // require initializers for multiple consts. |
| 521 (is_strict_const && peek() == Token::COMMA)) { | 533 (is_strict_const && peek() == Token::COMMA)) { |
| 522 Expect(Token::ASSIGN, CHECK_OK); | 534 Expect(Token::ASSIGN, CHECK_OK); |
| 523 ExpressionClassifier classifier; | 535 ExpressionClassifier classifier; |
| 524 ParseAssignmentExpression(var_context != kForStatement, &classifier, | 536 ParseAssignmentExpression(var_context != kForStatement, &classifier, |
| 525 CHECK_OK); | 537 CHECK_OK); |
| 526 // TODO(dslomov): report error if not valid expression. | 538 ValidateExpression(&classifier, CHECK_OK); |
| 527 | 539 |
| 528 variable_loc.end_pos = scanner()->location().end_pos; | 540 variable_loc.end_pos = scanner()->location().end_pos; |
| 529 if (first_initializer_loc && !first_initializer_loc->IsValid()) { | 541 if (first_initializer_loc && !first_initializer_loc->IsValid()) { |
| 530 *first_initializer_loc = variable_loc; | 542 *first_initializer_loc = variable_loc; |
| 531 } | 543 } |
| 532 } | 544 } |
| 533 } while (peek() == Token::COMMA); | 545 } while (peek() == Token::COMMA); |
| 534 | 546 |
| 535 if (bindings_loc) { | 547 if (bindings_loc) { |
| 536 *bindings_loc = | 548 *bindings_loc = |
| (...skipping 24 matching lines...) Expand all Loading... |
| 561 if (is_strong(language_mode()) && | 573 if (is_strong(language_mode()) && |
| 562 i::IsConstructor(function_state_->kind())) { | 574 i::IsConstructor(function_state_->kind())) { |
| 563 bool is_this = peek() == Token::THIS; | 575 bool is_this = peek() == Token::THIS; |
| 564 Expression expr = Expression::Default(); | 576 Expression expr = Expression::Default(); |
| 565 ExpressionClassifier classifier; | 577 ExpressionClassifier classifier; |
| 566 if (is_this) { | 578 if (is_this) { |
| 567 expr = ParseStrongInitializationExpression(&classifier, CHECK_OK); | 579 expr = ParseStrongInitializationExpression(&classifier, CHECK_OK); |
| 568 } else { | 580 } else { |
| 569 expr = ParseStrongSuperCallExpression(&classifier, CHECK_OK); | 581 expr = ParseStrongSuperCallExpression(&classifier, CHECK_OK); |
| 570 } | 582 } |
| 571 // TODO(dslomov): report error if not a valid expression. | 583 ValidateExpression(&classifier, CHECK_OK); |
| 572 switch (peek()) { | 584 switch (peek()) { |
| 573 case Token::SEMICOLON: | 585 case Token::SEMICOLON: |
| 574 Consume(Token::SEMICOLON); | 586 Consume(Token::SEMICOLON); |
| 575 break; | 587 break; |
| 576 case Token::RBRACE: | 588 case Token::RBRACE: |
| 577 case Token::EOS: | 589 case Token::EOS: |
| 578 break; | 590 break; |
| 579 default: | 591 default: |
| 580 if (!scanner()->HasAnyLineTerminatorBeforeNext()) { | 592 if (!scanner()->HasAnyLineTerminatorBeforeNext()) { |
| 581 ReportMessageAt(function_state_->this_location(), | 593 ReportMessageAt(function_state_->this_location(), |
| (...skipping 10 matching lines...) Expand all Loading... |
| 592 // TODO(arv): Handle `let [` | 604 // TODO(arv): Handle `let [` |
| 593 // https://code.google.com/p/v8/issues/detail?id=3847 | 605 // https://code.google.com/p/v8/issues/detail?id=3847 |
| 594 | 606 |
| 595 default: | 607 default: |
| 596 break; | 608 break; |
| 597 } | 609 } |
| 598 | 610 |
| 599 bool starts_with_identifier = peek_any_identifier(); | 611 bool starts_with_identifier = peek_any_identifier(); |
| 600 ExpressionClassifier classifier; | 612 ExpressionClassifier classifier; |
| 601 Expression expr = ParseExpression(true, &classifier, CHECK_OK); | 613 Expression expr = ParseExpression(true, &classifier, CHECK_OK); |
| 602 // TODO(dslomov): report error if not a valid expression. | 614 ValidateExpression(&classifier, CHECK_OK); |
| 603 | 615 |
| 604 // Even if the expression starts with an identifier, it is not necessarily an | 616 // Even if the expression starts with an identifier, it is not necessarily an |
| 605 // identifier. For example, "foo + bar" starts with an identifier but is not | 617 // identifier. For example, "foo + bar" starts with an identifier but is not |
| 606 // an identifier. | 618 // an identifier. |
| 607 if (starts_with_identifier && expr.IsIdentifier() && peek() == Token::COLON) { | 619 if (starts_with_identifier && expr.IsIdentifier() && peek() == Token::COLON) { |
| 608 // Expression is a single identifier, and not, e.g., a parenthesized | 620 // Expression is a single identifier, and not, e.g., a parenthesized |
| 609 // identifier. | 621 // identifier. |
| 610 DCHECK(!expr.AsIdentifier().IsFutureReserved()); | 622 DCHECK(!expr.AsIdentifier().IsFutureReserved()); |
| 611 DCHECK(is_sloppy(language_mode()) || | 623 DCHECK(is_sloppy(language_mode()) || |
| 612 !IsFutureStrictReserved(expr.AsIdentifier())); | 624 !IsFutureStrictReserved(expr.AsIdentifier())); |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1084 BlockState block_state(&scope_, scope); | 1096 BlockState block_state(&scope_, scope); |
| 1085 scope_->SetLanguageMode( | 1097 scope_->SetLanguageMode( |
| 1086 static_cast<LanguageMode>(class_language_mode | STRICT_BIT)); | 1098 static_cast<LanguageMode>(class_language_mode | STRICT_BIT)); |
| 1087 // TODO(marja): Make PreParser use scope names too. | 1099 // TODO(marja): Make PreParser use scope names too. |
| 1088 // scope_->SetScopeName(name); | 1100 // scope_->SetScopeName(name); |
| 1089 | 1101 |
| 1090 bool has_extends = Check(Token::EXTENDS); | 1102 bool has_extends = Check(Token::EXTENDS); |
| 1091 if (has_extends) { | 1103 if (has_extends) { |
| 1092 ExpressionClassifier classifier; | 1104 ExpressionClassifier classifier; |
| 1093 ParseLeftHandSideExpression(&classifier, CHECK_OK); | 1105 ParseLeftHandSideExpression(&classifier, CHECK_OK); |
| 1094 // TODO(dslomov): report error if not a valid expression. | 1106 ValidateExpression(&classifier, CHECK_OK); |
| 1095 } | 1107 } |
| 1096 | 1108 |
| 1097 ClassLiteralChecker checker(this); | 1109 ClassLiteralChecker checker(this); |
| 1098 bool has_seen_constructor = false; | 1110 bool has_seen_constructor = false; |
| 1099 | 1111 |
| 1100 Expect(Token::LBRACE, CHECK_OK); | 1112 Expect(Token::LBRACE, CHECK_OK); |
| 1101 while (peek() != Token::RBRACE) { | 1113 while (peek() != Token::RBRACE) { |
| 1102 if (Check(Token::SEMICOLON)) continue; | 1114 if (Check(Token::SEMICOLON)) continue; |
| 1103 const bool in_class = true; | 1115 const bool in_class = true; |
| 1104 const bool is_static = false; | 1116 const bool is_static = false; |
| 1105 bool is_computed_name = false; // Classes do not care about computed | 1117 bool is_computed_name = false; // Classes do not care about computed |
| 1106 // property names here. | 1118 // property names here. |
| 1107 ExpressionClassifier classifier; | 1119 ExpressionClassifier classifier; |
| 1108 ParsePropertyDefinition(&checker, in_class, has_extends, is_static, | 1120 ParsePropertyDefinition(&checker, in_class, has_extends, is_static, |
| 1109 &is_computed_name, &has_seen_constructor, | 1121 &is_computed_name, &has_seen_constructor, |
| 1110 &classifier, CHECK_OK); | 1122 &classifier, CHECK_OK); |
| 1111 // TODO(dslomov): report error if not a valid expression. | 1123 ValidateExpression(&classifier, CHECK_OK); |
| 1112 } | 1124 } |
| 1113 | 1125 |
| 1114 Expect(Token::RBRACE, CHECK_OK); | 1126 Expect(Token::RBRACE, CHECK_OK); |
| 1115 | 1127 |
| 1116 return Expression::Default(); | 1128 return Expression::Default(); |
| 1117 } | 1129 } |
| 1118 | 1130 |
| 1119 | 1131 |
| 1120 PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) { | 1132 PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) { |
| 1121 // CallRuntime :: | 1133 // CallRuntime :: |
| 1122 // '%' Identifier Arguments | 1134 // '%' Identifier Arguments |
| 1123 Expect(Token::MOD, CHECK_OK); | 1135 Expect(Token::MOD, CHECK_OK); |
| 1124 if (!allow_natives()) { | 1136 if (!allow_natives()) { |
| 1125 *ok = false; | 1137 *ok = false; |
| 1126 return Expression::Default(); | 1138 return Expression::Default(); |
| 1127 } | 1139 } |
| 1128 // Allow "eval" or "arguments" for backward compatibility. | 1140 // Allow "eval" or "arguments" for backward compatibility. |
| 1129 ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); | 1141 ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
| 1130 Scanner::Location spread_pos; | 1142 Scanner::Location spread_pos; |
| 1131 ExpressionClassifier classifier; | 1143 ExpressionClassifier classifier; |
| 1132 ParseArguments(&spread_pos, &classifier, ok); | 1144 ParseArguments(&spread_pos, &classifier, ok); |
| 1133 // TODO(dslomov): report error if not a valid expression. | 1145 ValidateExpression(&classifier, CHECK_OK); |
| 1134 | 1146 |
| 1135 DCHECK(!spread_pos.IsValid()); | 1147 DCHECK(!spread_pos.IsValid()); |
| 1136 | 1148 |
| 1137 return Expression::Default(); | 1149 return Expression::Default(); |
| 1138 } | 1150 } |
| 1139 | 1151 |
| 1140 #undef CHECK_OK | 1152 #undef CHECK_OK |
| 1141 | 1153 |
| 1142 | 1154 |
| 1143 } } // v8::internal | 1155 } } // v8::internal |
| OLD | NEW |