OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/ast.h" | 8 #include "src/ast.h" |
9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
629 } | 629 } |
630 // ...and one more time for '~foo' => 'foo^(~0)'. | 630 // ...and one more time for '~foo' => 'foo^(~0)'. |
631 if (op == Token::BIT_NOT) { | 631 if (op == Token::BIT_NOT) { |
632 return factory->NewBinaryOperation( | 632 return factory->NewBinaryOperation( |
633 Token::BIT_XOR, expression, factory->NewNumberLiteral(~0, pos), pos); | 633 Token::BIT_XOR, expression, factory->NewNumberLiteral(~0, pos), pos); |
634 } | 634 } |
635 return factory->NewUnaryOperation(op, expression, pos); | 635 return factory->NewUnaryOperation(op, expression, pos); |
636 } | 636 } |
637 | 637 |
638 | 638 |
639 Expression* ParserTraits::NewThrowReferenceError(const char* message, int pos) { | 639 Expression* ParserTraits::NewThrowReferenceError( |
| 640 MessageTemplate::Template message, int pos) { |
640 return NewThrowError( | 641 return NewThrowError( |
641 parser_->ast_value_factory()->make_reference_error_string(), message, | 642 parser_->ast_value_factory()->make_reference_error_string(), message, |
642 parser_->ast_value_factory()->empty_string(), pos); | 643 parser_->ast_value_factory()->empty_string(), pos); |
643 } | 644 } |
644 | 645 |
645 | 646 |
646 Expression* ParserTraits::NewThrowSyntaxError( | 647 Expression* ParserTraits::NewThrowSyntaxError(MessageTemplate::Template message, |
647 const char* message, const AstRawString* arg, int pos) { | 648 const AstRawString* arg, |
| 649 int pos) { |
648 return NewThrowError(parser_->ast_value_factory()->make_syntax_error_string(), | 650 return NewThrowError(parser_->ast_value_factory()->make_syntax_error_string(), |
649 message, arg, pos); | 651 message, arg, pos); |
650 } | 652 } |
651 | 653 |
652 | 654 |
653 Expression* ParserTraits::NewThrowTypeError( | 655 Expression* ParserTraits::NewThrowTypeError(MessageTemplate::Template message, |
654 const char* message, const AstRawString* arg, int pos) { | 656 const AstRawString* arg, int pos) { |
655 return NewThrowError(parser_->ast_value_factory()->make_type_error_string(), | 657 return NewThrowError(parser_->ast_value_factory()->make_type_error_string(), |
656 message, arg, pos); | 658 message, arg, pos); |
657 } | 659 } |
658 | 660 |
659 | 661 |
660 Expression* ParserTraits::NewThrowError( | 662 Expression* ParserTraits::NewThrowError(const AstRawString* constructor, |
661 const AstRawString* constructor, const char* message, | 663 MessageTemplate::Template message, |
662 const AstRawString* arg, int pos) { | 664 const AstRawString* arg, int pos) { |
663 Zone* zone = parser_->zone(); | 665 Zone* zone = parser_->zone(); |
664 const AstRawString* type = | |
665 parser_->ast_value_factory()->GetOneByteString(message); | |
666 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(2, zone); | 666 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(2, zone); |
667 args->Add(parser_->factory()->NewStringLiteral(type, pos), zone); | 667 args->Add(parser_->factory()->NewSmiLiteral(message, pos), zone); |
668 args->Add(parser_->factory()->NewStringLiteral(arg, pos), zone); | 668 args->Add(parser_->factory()->NewStringLiteral(arg, pos), zone); |
669 CallRuntime* call_constructor = | 669 CallRuntime* call_constructor = |
670 parser_->factory()->NewCallRuntime(constructor, NULL, args, pos); | 670 parser_->factory()->NewCallRuntime(constructor, NULL, args, pos); |
671 return parser_->factory()->NewThrow(call_constructor, pos); | 671 return parser_->factory()->NewThrow(call_constructor, pos); |
672 } | 672 } |
673 | 673 |
674 | 674 |
675 void ParserTraits::ReportMessageAt(Scanner::Location source_location, | 675 void ParserTraits::ReportMessageAt(Scanner::Location source_location, |
676 const char* message, const char* arg, | 676 MessageTemplate::Template message, |
677 ParseErrorType error_type) { | 677 const char* arg, ParseErrorType error_type) { |
678 if (parser_->stack_overflow()) { | 678 if (parser_->stack_overflow()) { |
679 // Suppress the error message (syntax error or such) in the presence of a | 679 // Suppress the error message (syntax error or such) in the presence of a |
680 // stack overflow. The isolate allows only one pending exception at at time | 680 // stack overflow. The isolate allows only one pending exception at at time |
681 // and we want to report the stack overflow later. | 681 // and we want to report the stack overflow later. |
682 return; | 682 return; |
683 } | 683 } |
684 parser_->pending_error_handler_.ReportMessageAt(source_location.beg_pos, | 684 parser_->pending_error_handler_.ReportMessageAt(source_location.beg_pos, |
685 source_location.end_pos, | 685 source_location.end_pos, |
686 message, arg, error_type); | 686 message, arg, error_type); |
687 } | 687 } |
688 | 688 |
689 | 689 |
690 void ParserTraits::ReportMessage(const char* message, const char* arg, | 690 void ParserTraits::ReportMessage(MessageTemplate::Template message, |
691 ParseErrorType error_type) { | 691 const char* arg, ParseErrorType error_type) { |
692 Scanner::Location source_location = parser_->scanner()->location(); | 692 Scanner::Location source_location = parser_->scanner()->location(); |
693 ReportMessageAt(source_location, message, arg, error_type); | 693 ReportMessageAt(source_location, message, arg, error_type); |
694 } | 694 } |
695 | 695 |
696 | 696 |
697 void ParserTraits::ReportMessage(const char* message, const AstRawString* arg, | 697 void ParserTraits::ReportMessage(MessageTemplate::Template message, |
| 698 const AstRawString* arg, |
698 ParseErrorType error_type) { | 699 ParseErrorType error_type) { |
699 Scanner::Location source_location = parser_->scanner()->location(); | 700 Scanner::Location source_location = parser_->scanner()->location(); |
700 ReportMessageAt(source_location, message, arg, error_type); | 701 ReportMessageAt(source_location, message, arg, error_type); |
701 } | 702 } |
702 | 703 |
703 | 704 |
704 void ParserTraits::ReportMessageAt(Scanner::Location source_location, | 705 void ParserTraits::ReportMessageAt(Scanner::Location source_location, |
705 const char* message, const AstRawString* arg, | 706 MessageTemplate::Template message, |
| 707 const AstRawString* arg, |
706 ParseErrorType error_type) { | 708 ParseErrorType error_type) { |
707 if (parser_->stack_overflow()) { | 709 if (parser_->stack_overflow()) { |
708 // Suppress the error message (syntax error or such) in the presence of a | 710 // Suppress the error message (syntax error or such) in the presence of a |
709 // stack overflow. The isolate allows only one pending exception at at time | 711 // stack overflow. The isolate allows only one pending exception at at time |
710 // and we want to report the stack overflow later. | 712 // and we want to report the stack overflow later. |
711 return; | 713 return; |
712 } | 714 } |
713 parser_->pending_error_handler_.ReportMessageAt(source_location.beg_pos, | 715 parser_->pending_error_handler_.ReportMessageAt(source_location.beg_pos, |
714 source_location.end_pos, | 716 source_location.end_pos, |
715 message, arg, error_type); | 717 message, arg, error_type); |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1015 if (ok && is_strict(language_mode())) { | 1017 if (ok && is_strict(language_mode())) { |
1016 CheckStrictOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); | 1018 CheckStrictOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); |
1017 CheckConflictingVarDeclarations(scope_, &ok); | 1019 CheckConflictingVarDeclarations(scope_, &ok); |
1018 } | 1020 } |
1019 | 1021 |
1020 if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) { | 1022 if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) { |
1021 if (body->length() != 1 || | 1023 if (body->length() != 1 || |
1022 !body->at(0)->IsExpressionStatement() || | 1024 !body->at(0)->IsExpressionStatement() || |
1023 !body->at(0)->AsExpressionStatement()-> | 1025 !body->at(0)->AsExpressionStatement()-> |
1024 expression()->IsFunctionLiteral()) { | 1026 expression()->IsFunctionLiteral()) { |
1025 ReportMessage("single_function_literal"); | 1027 ReportMessage(MessageTemplate::kSingleFunctionLiteral); |
1026 ok = false; | 1028 ok = false; |
1027 } | 1029 } |
1028 } | 1030 } |
1029 | 1031 |
1030 if (ok) { | 1032 if (ok) { |
1031 result = factory()->NewFunctionLiteral( | 1033 result = factory()->NewFunctionLiteral( |
1032 ast_value_factory()->empty_string(), ast_value_factory(), scope_, | 1034 ast_value_factory()->empty_string(), ast_value_factory(), scope_, |
1033 body, function_state.materialized_literal_count(), | 1035 body, function_state.materialized_literal_count(), |
1034 function_state.expected_property_count(), | 1036 function_state.expected_property_count(), |
1035 function_state.handler_count(), 0, | 1037 function_state.handler_count(), 0, |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1213 Scanner::Location old_super_loc = function_state_->super_location(); | 1215 Scanner::Location old_super_loc = function_state_->super_location(); |
1214 Statement* stat = ParseStatementListItem(CHECK_OK); | 1216 Statement* stat = ParseStatementListItem(CHECK_OK); |
1215 | 1217 |
1216 if (is_strong(language_mode()) && | 1218 if (is_strong(language_mode()) && |
1217 scope_->is_function_scope() && | 1219 scope_->is_function_scope() && |
1218 i::IsConstructor(function_state_->kind())) { | 1220 i::IsConstructor(function_state_->kind())) { |
1219 Scanner::Location this_loc = function_state_->this_location(); | 1221 Scanner::Location this_loc = function_state_->this_location(); |
1220 Scanner::Location super_loc = function_state_->super_location(); | 1222 Scanner::Location super_loc = function_state_->super_location(); |
1221 if (this_loc.beg_pos != old_this_loc.beg_pos && | 1223 if (this_loc.beg_pos != old_this_loc.beg_pos && |
1222 this_loc.beg_pos != token_loc.beg_pos) { | 1224 this_loc.beg_pos != token_loc.beg_pos) { |
1223 ReportMessageAt(this_loc, "strong_constructor_this"); | 1225 ReportMessageAt(this_loc, MessageTemplate::kStrongConstructorThis); |
1224 *ok = false; | 1226 *ok = false; |
1225 return nullptr; | 1227 return nullptr; |
1226 } | 1228 } |
1227 if (super_loc.beg_pos != old_super_loc.beg_pos && | 1229 if (super_loc.beg_pos != old_super_loc.beg_pos && |
1228 super_loc.beg_pos != token_loc.beg_pos) { | 1230 super_loc.beg_pos != token_loc.beg_pos) { |
1229 ReportMessageAt(super_loc, "strong_constructor_super"); | 1231 ReportMessageAt(super_loc, MessageTemplate::kStrongConstructorSuper); |
1230 *ok = false; | 1232 *ok = false; |
1231 return nullptr; | 1233 return nullptr; |
1232 } | 1234 } |
1233 } | 1235 } |
1234 | 1236 |
1235 if (stat == NULL || stat->IsEmpty()) { | 1237 if (stat == NULL || stat->IsEmpty()) { |
1236 directive_prologue = false; // End of directive prologue. | 1238 directive_prologue = false; // End of directive prologue. |
1237 continue; | 1239 continue; |
1238 } | 1240 } |
1239 | 1241 |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1373 } | 1375 } |
1374 | 1376 |
1375 // Check that all exports are bound. | 1377 // Check that all exports are bound. |
1376 ModuleDescriptor* descriptor = scope_->module(); | 1378 ModuleDescriptor* descriptor = scope_->module(); |
1377 for (ModuleDescriptor::Iterator it = descriptor->iterator(); !it.done(); | 1379 for (ModuleDescriptor::Iterator it = descriptor->iterator(); !it.done(); |
1378 it.Advance()) { | 1380 it.Advance()) { |
1379 if (scope_->LookupLocal(it.local_name()) == NULL) { | 1381 if (scope_->LookupLocal(it.local_name()) == NULL) { |
1380 // TODO(adamk): Pass both local_name and export_name once ParserTraits | 1382 // TODO(adamk): Pass both local_name and export_name once ParserTraits |
1381 // supports multiple arg error messages. | 1383 // supports multiple arg error messages. |
1382 // Also try to report this at a better location. | 1384 // Also try to report this at a better location. |
1383 ParserTraits::ReportMessage("module_export_undefined", it.local_name()); | 1385 ParserTraits::ReportMessage(MessageTemplate::kModuleExportUndefined, |
| 1386 it.local_name()); |
1384 *ok = false; | 1387 *ok = false; |
1385 return NULL; | 1388 return NULL; |
1386 } | 1389 } |
1387 } | 1390 } |
1388 | 1391 |
1389 scope_->module()->Freeze(); | 1392 scope_->module()->Freeze(); |
1390 return NULL; | 1393 return NULL; |
1391 } | 1394 } |
1392 | 1395 |
1393 | 1396 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1470 const AstRawString* import_name = ParseIdentifierName(CHECK_OK); | 1473 const AstRawString* import_name = ParseIdentifierName(CHECK_OK); |
1471 const AstRawString* local_name = import_name; | 1474 const AstRawString* local_name = import_name; |
1472 // In the presence of 'as', the left-side of the 'as' can | 1475 // In the presence of 'as', the left-side of the 'as' can |
1473 // be any IdentifierName. But without 'as', it must be a valid | 1476 // be any IdentifierName. But without 'as', it must be a valid |
1474 // BindingIdentifier. | 1477 // BindingIdentifier. |
1475 if (CheckContextualKeyword(CStrVector("as"))) { | 1478 if (CheckContextualKeyword(CStrVector("as"))) { |
1476 local_name = ParseIdentifierName(CHECK_OK); | 1479 local_name = ParseIdentifierName(CHECK_OK); |
1477 } | 1480 } |
1478 if (!Token::IsIdentifier(scanner()->current_token(), STRICT, false)) { | 1481 if (!Token::IsIdentifier(scanner()->current_token(), STRICT, false)) { |
1479 *ok = false; | 1482 *ok = false; |
1480 ReportMessage("unexpected_reserved"); | 1483 ReportMessage(MessageTemplate::kUnexpectedReserved); |
1481 return NULL; | 1484 return NULL; |
1482 } else if (IsEvalOrArguments(local_name)) { | 1485 } else if (IsEvalOrArguments(local_name)) { |
1483 *ok = false; | 1486 *ok = false; |
1484 ReportMessage("strict_eval_arguments"); | 1487 ReportMessage(MessageTemplate::kStrictEvalArguments); |
1485 return NULL; | 1488 return NULL; |
1486 } else if (is_strong(language_mode()) && IsUndefined(local_name)) { | 1489 } else if (is_strong(language_mode()) && IsUndefined(local_name)) { |
1487 *ok = false; | 1490 *ok = false; |
1488 ReportMessage("strong_undefined"); | 1491 ReportMessage(MessageTemplate::kStrongUndefined); |
1489 return NULL; | 1492 return NULL; |
1490 } | 1493 } |
1491 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); | 1494 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); |
1492 ImportDeclaration* declaration = | 1495 ImportDeclaration* declaration = |
1493 factory()->NewImportDeclaration(proxy, import_name, NULL, scope_, pos); | 1496 factory()->NewImportDeclaration(proxy, import_name, NULL, scope_, pos); |
1494 Declare(declaration, true, CHECK_OK); | 1497 Declare(declaration, true, CHECK_OK); |
1495 result->Add(declaration, zone()); | 1498 result->Add(declaration, zone()); |
1496 if (peek() == Token::RBRACE) break; | 1499 if (peek() == Token::RBRACE) break; |
1497 Expect(Token::COMMA, CHECK_OK); | 1500 Expect(Token::COMMA, CHECK_OK); |
1498 } | 1501 } |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1622 break; | 1625 break; |
1623 } | 1626 } |
1624 } | 1627 } |
1625 | 1628 |
1626 const AstRawString* default_string = ast_value_factory()->default_string(); | 1629 const AstRawString* default_string = ast_value_factory()->default_string(); |
1627 | 1630 |
1628 DCHECK_LE(names.length(), 1); | 1631 DCHECK_LE(names.length(), 1); |
1629 if (names.length() == 1) { | 1632 if (names.length() == 1) { |
1630 scope_->module()->AddLocalExport(default_string, names.first(), zone(), ok); | 1633 scope_->module()->AddLocalExport(default_string, names.first(), zone(), ok); |
1631 if (!*ok) { | 1634 if (!*ok) { |
1632 ParserTraits::ReportMessageAt(default_loc, "duplicate_export", | 1635 ParserTraits::ReportMessageAt( |
1633 default_string); | 1636 default_loc, MessageTemplate::kDuplicateExport, default_string); |
1634 return NULL; | 1637 return NULL; |
1635 } | 1638 } |
1636 } else { | 1639 } else { |
1637 // TODO(ES6): Assign result to a const binding with the name "*default*" | 1640 // TODO(ES6): Assign result to a const binding with the name "*default*" |
1638 // and add an export entry with "*default*" as the local name. | 1641 // and add an export entry with "*default*" as the local name. |
1639 } | 1642 } |
1640 | 1643 |
1641 return result; | 1644 return result; |
1642 } | 1645 } |
1643 | 1646 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1686 ZoneList<Scanner::Location> export_locations(1, zone()); | 1689 ZoneList<Scanner::Location> export_locations(1, zone()); |
1687 ZoneList<const AstRawString*> local_names(1, zone()); | 1690 ZoneList<const AstRawString*> local_names(1, zone()); |
1688 ParseExportClause(&export_names, &export_locations, &local_names, | 1691 ParseExportClause(&export_names, &export_locations, &local_names, |
1689 &reserved_loc, CHECK_OK); | 1692 &reserved_loc, CHECK_OK); |
1690 const AstRawString* indirect_export_module_specifier = NULL; | 1693 const AstRawString* indirect_export_module_specifier = NULL; |
1691 if (CheckContextualKeyword(CStrVector("from"))) { | 1694 if (CheckContextualKeyword(CStrVector("from"))) { |
1692 indirect_export_module_specifier = ParseModuleSpecifier(CHECK_OK); | 1695 indirect_export_module_specifier = ParseModuleSpecifier(CHECK_OK); |
1693 } else if (reserved_loc.IsValid()) { | 1696 } else if (reserved_loc.IsValid()) { |
1694 // No FromClause, so reserved words are invalid in ExportClause. | 1697 // No FromClause, so reserved words are invalid in ExportClause. |
1695 *ok = false; | 1698 *ok = false; |
1696 ReportMessageAt(reserved_loc, "unexpected_reserved"); | 1699 ReportMessageAt(reserved_loc, MessageTemplate::kUnexpectedReserved); |
1697 return NULL; | 1700 return NULL; |
1698 } | 1701 } |
1699 ExpectSemicolon(CHECK_OK); | 1702 ExpectSemicolon(CHECK_OK); |
1700 const int length = export_names.length(); | 1703 const int length = export_names.length(); |
1701 DCHECK_EQ(length, local_names.length()); | 1704 DCHECK_EQ(length, local_names.length()); |
1702 DCHECK_EQ(length, export_locations.length()); | 1705 DCHECK_EQ(length, export_locations.length()); |
1703 if (indirect_export_module_specifier == NULL) { | 1706 if (indirect_export_module_specifier == NULL) { |
1704 for (int i = 0; i < length; ++i) { | 1707 for (int i = 0; i < length; ++i) { |
1705 scope_->module()->AddLocalExport(export_names[i], local_names[i], | 1708 scope_->module()->AddLocalExport(export_names[i], local_names[i], |
1706 zone(), ok); | 1709 zone(), ok); |
1707 if (!*ok) { | 1710 if (!*ok) { |
1708 ParserTraits::ReportMessageAt(export_locations[i], | 1711 ParserTraits::ReportMessageAt(export_locations[i], |
1709 "duplicate_export", export_names[i]); | 1712 MessageTemplate::kDuplicateExport, |
| 1713 export_names[i]); |
1710 return NULL; | 1714 return NULL; |
1711 } | 1715 } |
1712 } | 1716 } |
1713 } else { | 1717 } else { |
1714 scope_->module()->AddModuleRequest(indirect_export_module_specifier, | 1718 scope_->module()->AddModuleRequest(indirect_export_module_specifier, |
1715 zone()); | 1719 zone()); |
1716 for (int i = 0; i < length; ++i) { | 1720 for (int i = 0; i < length; ++i) { |
1717 // TODO(ES6): scope_->module()->AddIndirectExport(...);( | 1721 // TODO(ES6): scope_->module()->AddIndirectExport(...);( |
1718 } | 1722 } |
1719 } | 1723 } |
(...skipping 19 matching lines...) Expand all Loading... |
1739 ReportUnexpectedToken(scanner()->current_token()); | 1743 ReportUnexpectedToken(scanner()->current_token()); |
1740 return NULL; | 1744 return NULL; |
1741 } | 1745 } |
1742 | 1746 |
1743 // Extract declared names into export declarations. | 1747 // Extract declared names into export declarations. |
1744 ModuleDescriptor* descriptor = scope_->module(); | 1748 ModuleDescriptor* descriptor = scope_->module(); |
1745 for (int i = 0; i < names.length(); ++i) { | 1749 for (int i = 0; i < names.length(); ++i) { |
1746 descriptor->AddLocalExport(names[i], names[i], zone(), ok); | 1750 descriptor->AddLocalExport(names[i], names[i], zone(), ok); |
1747 if (!*ok) { | 1751 if (!*ok) { |
1748 // TODO(adamk): Possibly report this error at the right place. | 1752 // TODO(adamk): Possibly report this error at the right place. |
1749 ParserTraits::ReportMessage("duplicate_export", names[i]); | 1753 ParserTraits::ReportMessage(MessageTemplate::kDuplicateExport, names[i]); |
1750 return NULL; | 1754 return NULL; |
1751 } | 1755 } |
1752 } | 1756 } |
1753 | 1757 |
1754 DCHECK_NOT_NULL(result); | 1758 DCHECK_NOT_NULL(result); |
1755 return result; | 1759 return result; |
1756 } | 1760 } |
1757 | 1761 |
1758 | 1762 |
1759 Statement* Parser::ParseStatement(ZoneList<const AstRawString*>* labels, | 1763 Statement* Parser::ParseStatement(ZoneList<const AstRawString*>* labels, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1794 // iterations or 'switch' statements (i.e., BreakableStatements), | 1798 // iterations or 'switch' statements (i.e., BreakableStatements), |
1795 // labels can be simply ignored in all other cases; except for | 1799 // labels can be simply ignored in all other cases; except for |
1796 // trivial labeled break statements 'label: break label' which is | 1800 // trivial labeled break statements 'label: break label' which is |
1797 // parsed into an empty statement. | 1801 // parsed into an empty statement. |
1798 switch (peek()) { | 1802 switch (peek()) { |
1799 case Token::LBRACE: | 1803 case Token::LBRACE: |
1800 return ParseBlock(labels, ok); | 1804 return ParseBlock(labels, ok); |
1801 | 1805 |
1802 case Token::SEMICOLON: | 1806 case Token::SEMICOLON: |
1803 if (is_strong(language_mode())) { | 1807 if (is_strong(language_mode())) { |
1804 ReportMessageAt(scanner()->peek_location(), "strong_empty"); | 1808 ReportMessageAt(scanner()->peek_location(), |
| 1809 MessageTemplate::kStrongEmpty); |
1805 *ok = false; | 1810 *ok = false; |
1806 return NULL; | 1811 return NULL; |
1807 } | 1812 } |
1808 Next(); | 1813 Next(); |
1809 return factory()->NewEmptyStatement(RelocInfo::kNoPosition); | 1814 return factory()->NewEmptyStatement(RelocInfo::kNoPosition); |
1810 | 1815 |
1811 case Token::IF: | 1816 case Token::IF: |
1812 return ParseIfStatement(labels, ok); | 1817 return ParseIfStatement(labels, ok); |
1813 | 1818 |
1814 case Token::DO: | 1819 case Token::DO: |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1851 // SourceElement: | 1856 // SourceElement: |
1852 // Statement | 1857 // Statement |
1853 // FunctionDeclaration | 1858 // FunctionDeclaration |
1854 // Common language extension is to allow function declaration in place | 1859 // Common language extension is to allow function declaration in place |
1855 // of any statement. This language extension is disabled in strict mode. | 1860 // of any statement. This language extension is disabled in strict mode. |
1856 // | 1861 // |
1857 // In Harmony mode, this case also handles the extension: | 1862 // In Harmony mode, this case also handles the extension: |
1858 // Statement: | 1863 // Statement: |
1859 // GeneratorDeclaration | 1864 // GeneratorDeclaration |
1860 if (is_strict(language_mode())) { | 1865 if (is_strict(language_mode())) { |
1861 ReportMessageAt(scanner()->peek_location(), "strict_function"); | 1866 ReportMessageAt(scanner()->peek_location(), |
| 1867 MessageTemplate::kStrictFunction); |
1862 *ok = false; | 1868 *ok = false; |
1863 return NULL; | 1869 return NULL; |
1864 } | 1870 } |
1865 return ParseFunctionDeclaration(NULL, ok); | 1871 return ParseFunctionDeclaration(NULL, ok); |
1866 } | 1872 } |
1867 | 1873 |
1868 case Token::DEBUGGER: | 1874 case Token::DEBUGGER: |
1869 return ParseDebuggerStatement(ok); | 1875 return ParseDebuggerStatement(ok); |
1870 | 1876 |
1871 case Token::VAR: | 1877 case Token::VAR: |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1975 // the special case | 1981 // the special case |
1976 // | 1982 // |
1977 // function () { let x; { var x; } } | 1983 // function () { let x; { var x; } } |
1978 // | 1984 // |
1979 // because the var declaration is hoisted to the function scope where 'x' | 1985 // because the var declaration is hoisted to the function scope where 'x' |
1980 // is already bound. | 1986 // is already bound. |
1981 DCHECK(IsDeclaredVariableMode(var->mode())); | 1987 DCHECK(IsDeclaredVariableMode(var->mode())); |
1982 if (is_strict(language_mode())) { | 1988 if (is_strict(language_mode())) { |
1983 // In harmony we treat re-declarations as early errors. See | 1989 // In harmony we treat re-declarations as early errors. See |
1984 // ES5 16 for a definition of early errors. | 1990 // ES5 16 for a definition of early errors. |
1985 ParserTraits::ReportMessage("var_redeclaration", name); | 1991 ParserTraits::ReportMessage(MessageTemplate::kVarRedeclaration, name); |
1986 *ok = false; | 1992 *ok = false; |
1987 return nullptr; | 1993 return nullptr; |
1988 } | 1994 } |
1989 Expression* expression = NewThrowTypeError( | 1995 Expression* expression = NewThrowTypeError( |
1990 "var_redeclaration", name, declaration->position()); | 1996 MessageTemplate::kVarRedeclaration, name, declaration->position()); |
1991 declaration_scope->SetIllegalRedeclaration(expression); | 1997 declaration_scope->SetIllegalRedeclaration(expression); |
1992 } else if (mode == VAR) { | 1998 } else if (mode == VAR) { |
1993 var->set_maybe_assigned(); | 1999 var->set_maybe_assigned(); |
1994 } | 2000 } |
1995 } | 2001 } |
1996 | 2002 |
1997 // We add a declaration node for every declaration. The compiler | 2003 // We add a declaration node for every declaration. The compiler |
1998 // will only generate code if necessary. In particular, declarations | 2004 // will only generate code if necessary. In particular, declarations |
1999 // for inner local variables that do not represent functions won't | 2005 // for inner local variables that do not represent functions won't |
2000 // result in any generated code. | 2006 // result in any generated code. |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2157 // class C { ... } | 2163 // class C { ... } |
2158 // | 2164 // |
2159 // has the same semantics as: | 2165 // has the same semantics as: |
2160 // | 2166 // |
2161 // let C = class C { ... }; | 2167 // let C = class C { ... }; |
2162 // | 2168 // |
2163 // so rewrite it as such. | 2169 // so rewrite it as such. |
2164 | 2170 |
2165 Expect(Token::CLASS, CHECK_OK); | 2171 Expect(Token::CLASS, CHECK_OK); |
2166 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { | 2172 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { |
2167 ReportMessage("sloppy_lexical"); | 2173 ReportMessage(MessageTemplate::kSloppyLexical); |
2168 *ok = false; | 2174 *ok = false; |
2169 return NULL; | 2175 return NULL; |
2170 } | 2176 } |
2171 | 2177 |
2172 int pos = position(); | 2178 int pos = position(); |
2173 bool is_strict_reserved = false; | 2179 bool is_strict_reserved = false; |
2174 const AstRawString* name = | 2180 const AstRawString* name = |
2175 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 2181 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
2176 ClassLiteral* value = ParseClassLiteral(name, scanner()->location(), | 2182 ClassLiteral* value = ParseClassLiteral(name, scanner()->location(), |
2177 is_strict_reserved, pos, CHECK_OK); | 2183 is_strict_reserved, pos, CHECK_OK); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2343 // True if the binding needs initialization. 'let' and 'const' declared | 2349 // True if the binding needs initialization. 'let' and 'const' declared |
2344 // bindings are created uninitialized by their declaration nodes and | 2350 // bindings are created uninitialized by their declaration nodes and |
2345 // need initialization. 'var' declared bindings are always initialized | 2351 // need initialization. 'var' declared bindings are always initialized |
2346 // immediately by their declaration nodes. | 2352 // immediately by their declaration nodes. |
2347 parsing_result->descriptor.needs_init = false; | 2353 parsing_result->descriptor.needs_init = false; |
2348 parsing_result->descriptor.is_const = false; | 2354 parsing_result->descriptor.is_const = false; |
2349 parsing_result->descriptor.init_op = Token::INIT_VAR; | 2355 parsing_result->descriptor.init_op = Token::INIT_VAR; |
2350 if (peek() == Token::VAR) { | 2356 if (peek() == Token::VAR) { |
2351 if (is_strong(language_mode())) { | 2357 if (is_strong(language_mode())) { |
2352 Scanner::Location location = scanner()->peek_location(); | 2358 Scanner::Location location = scanner()->peek_location(); |
2353 ReportMessageAt(location, "strong_var"); | 2359 ReportMessageAt(location, MessageTemplate::kStrongVar); |
2354 *ok = false; | 2360 *ok = false; |
2355 return; | 2361 return; |
2356 } | 2362 } |
2357 Consume(Token::VAR); | 2363 Consume(Token::VAR); |
2358 } else if (peek() == Token::CONST) { | 2364 } else if (peek() == Token::CONST) { |
2359 Consume(Token::CONST); | 2365 Consume(Token::CONST); |
2360 if (is_sloppy(language_mode())) { | 2366 if (is_sloppy(language_mode())) { |
2361 parsing_result->descriptor.mode = CONST_LEGACY; | 2367 parsing_result->descriptor.mode = CONST_LEGACY; |
2362 parsing_result->descriptor.init_op = Token::INIT_CONST_LEGACY; | 2368 parsing_result->descriptor.init_op = Token::INIT_CONST_LEGACY; |
2363 ++use_counts_[v8::Isolate::kLegacyConst]; | 2369 ++use_counts_[v8::Isolate::kLegacyConst]; |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2523 switch (peek()) { | 2529 switch (peek()) { |
2524 case Token::SEMICOLON: | 2530 case Token::SEMICOLON: |
2525 Consume(Token::SEMICOLON); | 2531 Consume(Token::SEMICOLON); |
2526 break; | 2532 break; |
2527 case Token::RBRACE: | 2533 case Token::RBRACE: |
2528 case Token::EOS: | 2534 case Token::EOS: |
2529 break; | 2535 break; |
2530 default: | 2536 default: |
2531 if (!scanner()->HasAnyLineTerminatorBeforeNext()) { | 2537 if (!scanner()->HasAnyLineTerminatorBeforeNext()) { |
2532 ReportMessageAt(function_state_->this_location(), | 2538 ReportMessageAt(function_state_->this_location(), |
2533 is_this ? "strong_constructor_this" | 2539 is_this |
2534 : "strong_constructor_super"); | 2540 ? MessageTemplate::kStrongConstructorThis |
| 2541 : MessageTemplate::kStrongConstructorSuper); |
2535 *ok = false; | 2542 *ok = false; |
2536 return nullptr; | 2543 return nullptr; |
2537 } | 2544 } |
2538 } | 2545 } |
2539 return factory()->NewExpressionStatement(expr, pos); | 2546 return factory()->NewExpressionStatement(expr, pos); |
2540 } | 2547 } |
2541 break; | 2548 break; |
2542 | 2549 |
2543 // TODO(arv): Handle `let [` | 2550 // TODO(arv): Handle `let [` |
2544 // https://code.google.com/p/v8/issues/detail?id=3847 | 2551 // https://code.google.com/p/v8/issues/detail?id=3847 |
(...skipping 10 matching lines...) Expand all Loading... |
2555 // Expression is a single identifier, and not, e.g., a parenthesized | 2562 // Expression is a single identifier, and not, e.g., a parenthesized |
2556 // identifier. | 2563 // identifier. |
2557 VariableProxy* var = expr->AsVariableProxy(); | 2564 VariableProxy* var = expr->AsVariableProxy(); |
2558 const AstRawString* label = var->raw_name(); | 2565 const AstRawString* label = var->raw_name(); |
2559 // TODO(1240780): We don't check for redeclaration of labels | 2566 // TODO(1240780): We don't check for redeclaration of labels |
2560 // during preparsing since keeping track of the set of active | 2567 // during preparsing since keeping track of the set of active |
2561 // labels requires nontrivial changes to the way scopes are | 2568 // labels requires nontrivial changes to the way scopes are |
2562 // structured. However, these are probably changes we want to | 2569 // structured. However, these are probably changes we want to |
2563 // make later anyway so we should go back and fix this then. | 2570 // make later anyway so we should go back and fix this then. |
2564 if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) { | 2571 if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) { |
2565 ParserTraits::ReportMessage("label_redeclaration", label); | 2572 ParserTraits::ReportMessage(MessageTemplate::kLabelRedeclaration, label); |
2566 *ok = false; | 2573 *ok = false; |
2567 return NULL; | 2574 return NULL; |
2568 } | 2575 } |
2569 if (labels == NULL) { | 2576 if (labels == NULL) { |
2570 labels = new(zone()) ZoneList<const AstRawString*>(4, zone()); | 2577 labels = new(zone()) ZoneList<const AstRawString*>(4, zone()); |
2571 } | 2578 } |
2572 labels->Add(label, zone()); | 2579 labels->Add(label, zone()); |
2573 // Remove the "ghost" variable that turned out to be a label | 2580 // Remove the "ghost" variable that turned out to be a label |
2574 // from the top scope. This way, we don't try to resolve it | 2581 // from the top scope. This way, we don't try to resolve it |
2575 // during the scope processing. | 2582 // during the scope processing. |
(...skipping 12 matching lines...) Expand all Loading... |
2588 ast_value_factory()->native_string() && | 2595 ast_value_factory()->native_string() && |
2589 !scanner()->literal_contains_escapes()) { | 2596 !scanner()->literal_contains_escapes()) { |
2590 return ParseNativeDeclaration(ok); | 2597 return ParseNativeDeclaration(ok); |
2591 } | 2598 } |
2592 | 2599 |
2593 // Parsed expression statement, followed by semicolon. | 2600 // Parsed expression statement, followed by semicolon. |
2594 // Detect attempts at 'let' declarations in sloppy mode. | 2601 // Detect attempts at 'let' declarations in sloppy mode. |
2595 if (peek() == Token::IDENTIFIER && expr->AsVariableProxy() != NULL && | 2602 if (peek() == Token::IDENTIFIER && expr->AsVariableProxy() != NULL && |
2596 expr->AsVariableProxy()->raw_name() == | 2603 expr->AsVariableProxy()->raw_name() == |
2597 ast_value_factory()->let_string()) { | 2604 ast_value_factory()->let_string()) { |
2598 ReportMessage("sloppy_lexical", NULL); | 2605 ReportMessage(MessageTemplate::kSloppyLexical, NULL); |
2599 *ok = false; | 2606 *ok = false; |
2600 return NULL; | 2607 return NULL; |
2601 } | 2608 } |
2602 ExpectSemicolon(CHECK_OK); | 2609 ExpectSemicolon(CHECK_OK); |
2603 return factory()->NewExpressionStatement(expr, pos); | 2610 return factory()->NewExpressionStatement(expr, pos); |
2604 } | 2611 } |
2605 | 2612 |
2606 | 2613 |
2607 IfStatement* Parser::ParseIfStatement(ZoneList<const AstRawString*>* labels, | 2614 IfStatement* Parser::ParseIfStatement(ZoneList<const AstRawString*>* labels, |
2608 bool* ok) { | 2615 bool* ok) { |
(...skipping 27 matching lines...) Expand all Loading... |
2636 const AstRawString* label = NULL; | 2643 const AstRawString* label = NULL; |
2637 Token::Value tok = peek(); | 2644 Token::Value tok = peek(); |
2638 if (!scanner()->HasAnyLineTerminatorBeforeNext() && | 2645 if (!scanner()->HasAnyLineTerminatorBeforeNext() && |
2639 tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) { | 2646 tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) { |
2640 // ECMA allows "eval" or "arguments" as labels even in strict mode. | 2647 // ECMA allows "eval" or "arguments" as labels even in strict mode. |
2641 label = ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); | 2648 label = ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
2642 } | 2649 } |
2643 IterationStatement* target = LookupContinueTarget(label, CHECK_OK); | 2650 IterationStatement* target = LookupContinueTarget(label, CHECK_OK); |
2644 if (target == NULL) { | 2651 if (target == NULL) { |
2645 // Illegal continue statement. | 2652 // Illegal continue statement. |
2646 const char* message = "illegal_continue"; | 2653 MessageTemplate::Template message = MessageTemplate::kIllegalContinue; |
2647 if (label != NULL) { | 2654 if (label != NULL) { |
2648 message = "unknown_label"; | 2655 message = MessageTemplate::kUnknownLabel; |
2649 } | 2656 } |
2650 ParserTraits::ReportMessage(message, label); | 2657 ParserTraits::ReportMessage(message, label); |
2651 *ok = false; | 2658 *ok = false; |
2652 return NULL; | 2659 return NULL; |
2653 } | 2660 } |
2654 ExpectSemicolon(CHECK_OK); | 2661 ExpectSemicolon(CHECK_OK); |
2655 return factory()->NewContinueStatement(target, pos); | 2662 return factory()->NewContinueStatement(target, pos); |
2656 } | 2663 } |
2657 | 2664 |
2658 | 2665 |
(...skipping 14 matching lines...) Expand all Loading... |
2673 // Parse labeled break statements that target themselves into | 2680 // Parse labeled break statements that target themselves into |
2674 // empty statements, e.g. 'l1: l2: l3: break l2;' | 2681 // empty statements, e.g. 'l1: l2: l3: break l2;' |
2675 if (label != NULL && ContainsLabel(labels, label)) { | 2682 if (label != NULL && ContainsLabel(labels, label)) { |
2676 ExpectSemicolon(CHECK_OK); | 2683 ExpectSemicolon(CHECK_OK); |
2677 return factory()->NewEmptyStatement(pos); | 2684 return factory()->NewEmptyStatement(pos); |
2678 } | 2685 } |
2679 BreakableStatement* target = NULL; | 2686 BreakableStatement* target = NULL; |
2680 target = LookupBreakTarget(label, CHECK_OK); | 2687 target = LookupBreakTarget(label, CHECK_OK); |
2681 if (target == NULL) { | 2688 if (target == NULL) { |
2682 // Illegal break statement. | 2689 // Illegal break statement. |
2683 const char* message = "illegal_break"; | 2690 MessageTemplate::Template message = MessageTemplate::kIllegalBreak; |
2684 if (label != NULL) { | 2691 if (label != NULL) { |
2685 message = "unknown_label"; | 2692 message = MessageTemplate::kUnknownLabel; |
2686 } | 2693 } |
2687 ParserTraits::ReportMessage(message, label); | 2694 ParserTraits::ReportMessage(message, label); |
2688 *ok = false; | 2695 *ok = false; |
2689 return NULL; | 2696 return NULL; |
2690 } | 2697 } |
2691 ExpectSemicolon(CHECK_OK); | 2698 ExpectSemicolon(CHECK_OK); |
2692 return factory()->NewBreakStatement(target, pos); | 2699 return factory()->NewBreakStatement(target, pos); |
2693 } | 2700 } |
2694 | 2701 |
2695 | 2702 |
(...skipping 18 matching lines...) Expand all Loading... |
2714 if (IsSubclassConstructor(function_state_->kind())) { | 2721 if (IsSubclassConstructor(function_state_->kind())) { |
2715 return_value = ThisExpression(scope_, factory(), loc.beg_pos); | 2722 return_value = ThisExpression(scope_, factory(), loc.beg_pos); |
2716 } else { | 2723 } else { |
2717 return_value = GetLiteralUndefined(position()); | 2724 return_value = GetLiteralUndefined(position()); |
2718 } | 2725 } |
2719 } else { | 2726 } else { |
2720 if (is_strong(language_mode()) && | 2727 if (is_strong(language_mode()) && |
2721 i::IsConstructor(function_state_->kind())) { | 2728 i::IsConstructor(function_state_->kind())) { |
2722 int pos = peek_position(); | 2729 int pos = peek_position(); |
2723 ReportMessageAt(Scanner::Location(pos, pos + 1), | 2730 ReportMessageAt(Scanner::Location(pos, pos + 1), |
2724 "strong_constructor_return_value"); | 2731 MessageTemplate::kStrongConstructorReturnValue); |
2725 *ok = false; | 2732 *ok = false; |
2726 return NULL; | 2733 return NULL; |
2727 } | 2734 } |
2728 | 2735 |
2729 int pos = peek_position(); | 2736 int pos = peek_position(); |
2730 return_value = ParseExpression(true, CHECK_OK); | 2737 return_value = ParseExpression(true, CHECK_OK); |
2731 | 2738 |
2732 if (IsSubclassConstructor(function_state_->kind())) { | 2739 if (IsSubclassConstructor(function_state_->kind())) { |
2733 // For subclass constructors we need to return this in case of undefined | 2740 // For subclass constructors we need to return this in case of undefined |
2734 // and throw an exception in case of a non object. | 2741 // and throw an exception in case of a non object. |
2735 // | 2742 // |
2736 // return expr; | 2743 // return expr; |
2737 // | 2744 // |
2738 // Is rewritten as: | 2745 // Is rewritten as: |
2739 // | 2746 // |
2740 // return (temp = expr) === undefined ? this : | 2747 // return (temp = expr) === undefined ? this : |
2741 // %_IsSpecObject(temp) ? temp : throw new TypeError(...); | 2748 // %_IsSpecObject(temp) ? temp : throw new TypeError(...); |
2742 Variable* temp = scope_->DeclarationScope()->NewTemporary( | 2749 Variable* temp = scope_->DeclarationScope()->NewTemporary( |
2743 ast_value_factory()->empty_string()); | 2750 ast_value_factory()->empty_string()); |
2744 Assignment* assign = factory()->NewAssignment( | 2751 Assignment* assign = factory()->NewAssignment( |
2745 Token::ASSIGN, factory()->NewVariableProxy(temp), return_value, pos); | 2752 Token::ASSIGN, factory()->NewVariableProxy(temp), return_value, pos); |
2746 | 2753 |
2747 Expression* throw_expression = | 2754 Expression* throw_expression = |
2748 NewThrowTypeError("derived_constructor_return", | 2755 NewThrowTypeError(MessageTemplate::kDerivedConstructorReturn, |
2749 ast_value_factory()->empty_string(), pos); | 2756 ast_value_factory()->empty_string(), pos); |
2750 | 2757 |
2751 // %_IsSpecObject(temp) | 2758 // %_IsSpecObject(temp) |
2752 ZoneList<Expression*>* is_spec_object_args = | 2759 ZoneList<Expression*>* is_spec_object_args = |
2753 new (zone()) ZoneList<Expression*>(1, zone()); | 2760 new (zone()) ZoneList<Expression*>(1, zone()); |
2754 is_spec_object_args->Add(factory()->NewVariableProxy(temp), zone()); | 2761 is_spec_object_args->Add(factory()->NewVariableProxy(temp), zone()); |
2755 Expression* is_spec_object_call = factory()->NewCallRuntime( | 2762 Expression* is_spec_object_call = factory()->NewCallRuntime( |
2756 ast_value_factory()->is_spec_object_string(), | 2763 ast_value_factory()->is_spec_object_string(), |
2757 Runtime::FunctionForId(Runtime::kInlineIsSpecObject), | 2764 Runtime::FunctionForId(Runtime::kInlineIsSpecObject), |
2758 is_spec_object_args, pos); | 2765 is_spec_object_args, pos); |
(...skipping 21 matching lines...) Expand all Loading... |
2780 function_state_->generator_object_variable()); | 2787 function_state_->generator_object_variable()); |
2781 Expression* yield = factory()->NewYield( | 2788 Expression* yield = factory()->NewYield( |
2782 generator, return_value, Yield::kFinal, loc.beg_pos); | 2789 generator, return_value, Yield::kFinal, loc.beg_pos); |
2783 result = factory()->NewExpressionStatement(yield, loc.beg_pos); | 2790 result = factory()->NewExpressionStatement(yield, loc.beg_pos); |
2784 } else { | 2791 } else { |
2785 result = factory()->NewReturnStatement(return_value, loc.beg_pos); | 2792 result = factory()->NewReturnStatement(return_value, loc.beg_pos); |
2786 } | 2793 } |
2787 | 2794 |
2788 Scope* decl_scope = scope_->DeclarationScope(); | 2795 Scope* decl_scope = scope_->DeclarationScope(); |
2789 if (decl_scope->is_script_scope() || decl_scope->is_eval_scope()) { | 2796 if (decl_scope->is_script_scope() || decl_scope->is_eval_scope()) { |
2790 ReportMessageAt(loc, "illegal_return"); | 2797 ReportMessageAt(loc, MessageTemplate::kIllegalReturn); |
2791 *ok = false; | 2798 *ok = false; |
2792 return NULL; | 2799 return NULL; |
2793 } | 2800 } |
2794 return result; | 2801 return result; |
2795 } | 2802 } |
2796 | 2803 |
2797 | 2804 |
2798 Statement* Parser::ParseWithStatement(ZoneList<const AstRawString*>* labels, | 2805 Statement* Parser::ParseWithStatement(ZoneList<const AstRawString*>* labels, |
2799 bool* ok) { | 2806 bool* ok) { |
2800 // WithStatement :: | 2807 // WithStatement :: |
2801 // 'with' '(' Expression ')' Statement | 2808 // 'with' '(' Expression ')' Statement |
2802 | 2809 |
2803 Expect(Token::WITH, CHECK_OK); | 2810 Expect(Token::WITH, CHECK_OK); |
2804 int pos = position(); | 2811 int pos = position(); |
2805 | 2812 |
2806 if (is_strict(language_mode())) { | 2813 if (is_strict(language_mode())) { |
2807 ReportMessage("strict_mode_with"); | 2814 ReportMessage(MessageTemplate::kStrictWith); |
2808 *ok = false; | 2815 *ok = false; |
2809 return NULL; | 2816 return NULL; |
2810 } | 2817 } |
2811 | 2818 |
2812 Expect(Token::LPAREN, CHECK_OK); | 2819 Expect(Token::LPAREN, CHECK_OK); |
2813 Expression* expr = ParseExpression(true, CHECK_OK); | 2820 Expression* expr = ParseExpression(true, CHECK_OK); |
2814 Expect(Token::RPAREN, CHECK_OK); | 2821 Expect(Token::RPAREN, CHECK_OK); |
2815 | 2822 |
2816 scope_->DeclarationScope()->RecordWithStatement(); | 2823 scope_->DeclarationScope()->RecordWithStatement(); |
2817 Scope* with_scope = NewScope(scope_, WITH_SCOPE); | 2824 Scope* with_scope = NewScope(scope_, WITH_SCOPE); |
(...skipping 12 matching lines...) Expand all Loading... |
2830 // 'case' Expression ':' StatementList | 2837 // 'case' Expression ':' StatementList |
2831 // 'default' ':' StatementList | 2838 // 'default' ':' StatementList |
2832 | 2839 |
2833 Expression* label = NULL; // NULL expression indicates default case | 2840 Expression* label = NULL; // NULL expression indicates default case |
2834 if (peek() == Token::CASE) { | 2841 if (peek() == Token::CASE) { |
2835 Expect(Token::CASE, CHECK_OK); | 2842 Expect(Token::CASE, CHECK_OK); |
2836 label = ParseExpression(true, CHECK_OK); | 2843 label = ParseExpression(true, CHECK_OK); |
2837 } else { | 2844 } else { |
2838 Expect(Token::DEFAULT, CHECK_OK); | 2845 Expect(Token::DEFAULT, CHECK_OK); |
2839 if (*default_seen_ptr) { | 2846 if (*default_seen_ptr) { |
2840 ReportMessage("multiple_defaults_in_switch"); | 2847 ReportMessage(MessageTemplate::kMultipleDefaultsInSwitch); |
2841 *ok = false; | 2848 *ok = false; |
2842 return NULL; | 2849 return NULL; |
2843 } | 2850 } |
2844 *default_seen_ptr = true; | 2851 *default_seen_ptr = true; |
2845 } | 2852 } |
2846 Expect(Token::COLON, CHECK_OK); | 2853 Expect(Token::COLON, CHECK_OK); |
2847 int pos = position(); | 2854 int pos = position(); |
2848 ZoneList<Statement*>* statements = | 2855 ZoneList<Statement*>* statements = |
2849 new(zone()) ZoneList<Statement*>(5, zone()); | 2856 new(zone()) ZoneList<Statement*>(5, zone()); |
2850 Statement* stat = NULL; | 2857 Statement* stat = NULL; |
2851 while (peek() != Token::CASE && | 2858 while (peek() != Token::CASE && |
2852 peek() != Token::DEFAULT && | 2859 peek() != Token::DEFAULT && |
2853 peek() != Token::RBRACE) { | 2860 peek() != Token::RBRACE) { |
2854 stat = ParseStatementListItem(CHECK_OK); | 2861 stat = ParseStatementListItem(CHECK_OK); |
2855 statements->Add(stat, zone()); | 2862 statements->Add(stat, zone()); |
2856 } | 2863 } |
2857 if (is_strong(language_mode()) && stat != NULL && !stat->IsJump() && | 2864 if (is_strong(language_mode()) && stat != NULL && !stat->IsJump() && |
2858 peek() != Token::RBRACE) { | 2865 peek() != Token::RBRACE) { |
2859 ReportMessageAt(scanner()->location(), "strong_switch_fallthrough"); | 2866 ReportMessageAt(scanner()->location(), |
| 2867 MessageTemplate::kStrongSwitchFallthrough); |
2860 *ok = false; | 2868 *ok = false; |
2861 return NULL; | 2869 return NULL; |
2862 } | 2870 } |
2863 return factory()->NewCaseClause(label, statements, pos); | 2871 return factory()->NewCaseClause(label, statements, pos); |
2864 } | 2872 } |
2865 | 2873 |
2866 | 2874 |
2867 SwitchStatement* Parser::ParseSwitchStatement( | 2875 SwitchStatement* Parser::ParseSwitchStatement( |
2868 ZoneList<const AstRawString*>* labels, bool* ok) { | 2876 ZoneList<const AstRawString*>* labels, bool* ok) { |
2869 // SwitchStatement :: | 2877 // SwitchStatement :: |
(...skipping 22 matching lines...) Expand all Loading... |
2892 } | 2900 } |
2893 | 2901 |
2894 | 2902 |
2895 Statement* Parser::ParseThrowStatement(bool* ok) { | 2903 Statement* Parser::ParseThrowStatement(bool* ok) { |
2896 // ThrowStatement :: | 2904 // ThrowStatement :: |
2897 // 'throw' Expression ';' | 2905 // 'throw' Expression ';' |
2898 | 2906 |
2899 Expect(Token::THROW, CHECK_OK); | 2907 Expect(Token::THROW, CHECK_OK); |
2900 int pos = position(); | 2908 int pos = position(); |
2901 if (scanner()->HasAnyLineTerminatorBeforeNext()) { | 2909 if (scanner()->HasAnyLineTerminatorBeforeNext()) { |
2902 ReportMessage("newline_after_throw"); | 2910 ReportMessage(MessageTemplate::kNewlineAfterThrow); |
2903 *ok = false; | 2911 *ok = false; |
2904 return NULL; | 2912 return NULL; |
2905 } | 2913 } |
2906 Expression* exception = ParseExpression(true, CHECK_OK); | 2914 Expression* exception = ParseExpression(true, CHECK_OK); |
2907 ExpectSemicolon(CHECK_OK); | 2915 ExpectSemicolon(CHECK_OK); |
2908 | 2916 |
2909 return factory()->NewExpressionStatement( | 2917 return factory()->NewExpressionStatement( |
2910 factory()->NewThrow(exception, pos), pos); | 2918 factory()->NewThrow(exception, pos), pos); |
2911 } | 2919 } |
2912 | 2920 |
(...skipping 10 matching lines...) Expand all Loading... |
2923 // Finally :: | 2931 // Finally :: |
2924 // 'finally' Block | 2932 // 'finally' Block |
2925 | 2933 |
2926 Expect(Token::TRY, CHECK_OK); | 2934 Expect(Token::TRY, CHECK_OK); |
2927 int pos = position(); | 2935 int pos = position(); |
2928 | 2936 |
2929 Block* try_block = ParseBlock(NULL, CHECK_OK); | 2937 Block* try_block = ParseBlock(NULL, CHECK_OK); |
2930 | 2938 |
2931 Token::Value tok = peek(); | 2939 Token::Value tok = peek(); |
2932 if (tok != Token::CATCH && tok != Token::FINALLY) { | 2940 if (tok != Token::CATCH && tok != Token::FINALLY) { |
2933 ReportMessage("no_catch_or_finally"); | 2941 ReportMessage(MessageTemplate::kNoCatchOrFinally); |
2934 *ok = false; | 2942 *ok = false; |
2935 return NULL; | 2943 return NULL; |
2936 } | 2944 } |
2937 | 2945 |
2938 Scope* catch_scope = NULL; | 2946 Scope* catch_scope = NULL; |
2939 Variable* catch_variable = NULL; | 2947 Variable* catch_variable = NULL; |
2940 Block* catch_block = NULL; | 2948 Block* catch_block = NULL; |
2941 const AstRawString* name = NULL; | 2949 const AstRawString* name = NULL; |
2942 if (tok == Token::CATCH) { | 2950 if (tok == Token::CATCH) { |
2943 Consume(Token::CATCH); | 2951 Consume(Token::CATCH); |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3405 bool accept_OF = true; | 3413 bool accept_OF = true; |
3406 ForEachStatement::VisitMode mode; | 3414 ForEachStatement::VisitMode mode; |
3407 int each_beg_pos = scanner()->location().beg_pos; | 3415 int each_beg_pos = scanner()->location().beg_pos; |
3408 int each_end_pos = scanner()->location().end_pos; | 3416 int each_end_pos = scanner()->location().end_pos; |
3409 | 3417 |
3410 if (accept_IN && CheckInOrOf(accept_OF, &mode, ok)) { | 3418 if (accept_IN && CheckInOrOf(accept_OF, &mode, ok)) { |
3411 if (!*ok) return nullptr; | 3419 if (!*ok) return nullptr; |
3412 if (num_decl != 1) { | 3420 if (num_decl != 1) { |
3413 const char* loop_type = | 3421 const char* loop_type = |
3414 mode == ForEachStatement::ITERATE ? "for-of" : "for-in"; | 3422 mode == ForEachStatement::ITERATE ? "for-of" : "for-in"; |
3415 ParserTraits::ReportMessageAt(parsing_result.bindings_loc, | 3423 ParserTraits::ReportMessageAt( |
3416 "for_inof_loop_multi_bindings", | 3424 parsing_result.bindings_loc, |
3417 loop_type); | 3425 MessageTemplate::kForInOfLoopMultiBindings, loop_type); |
3418 *ok = false; | 3426 *ok = false; |
3419 return nullptr; | 3427 return nullptr; |
3420 } | 3428 } |
3421 if (parsing_result.first_initializer_loc.IsValid() && | 3429 if (parsing_result.first_initializer_loc.IsValid() && |
3422 (is_strict(language_mode()) || mode == ForEachStatement::ITERATE)) { | 3430 (is_strict(language_mode()) || mode == ForEachStatement::ITERATE)) { |
3423 if (mode == ForEachStatement::ITERATE) { | 3431 if (mode == ForEachStatement::ITERATE) { |
3424 ReportMessageAt(parsing_result.first_initializer_loc, | 3432 ReportMessageAt(parsing_result.first_initializer_loc, |
3425 "for_of_loop_initializer"); | 3433 MessageTemplate::kForOfLoopInitializer); |
3426 } else { | 3434 } else { |
3427 // TODO(caitp): This should be an error in sloppy mode too. | 3435 // TODO(caitp): This should be an error in sloppy mode too. |
3428 ReportMessageAt(parsing_result.first_initializer_loc, | 3436 ReportMessageAt(parsing_result.first_initializer_loc, |
3429 "for_in_loop_initializer"); | 3437 MessageTemplate::kForInLoopInitializer); |
3430 } | 3438 } |
3431 *ok = false; | 3439 *ok = false; |
3432 return nullptr; | 3440 return nullptr; |
3433 } | 3441 } |
3434 ForEachStatement* loop = | 3442 ForEachStatement* loop = |
3435 factory()->NewForEachStatement(mode, labels, stmt_pos); | 3443 factory()->NewForEachStatement(mode, labels, stmt_pos); |
3436 Target target(&this->target_stack_, loop); | 3444 Target target(&this->target_stack_, loop); |
3437 | 3445 |
3438 Expression* enumerable = ParseExpression(true, CHECK_OK); | 3446 Expression* enumerable = ParseExpression(true, CHECK_OK); |
3439 Expect(Token::RPAREN, CHECK_OK); | 3447 Expect(Token::RPAREN, CHECK_OK); |
(...skipping 28 matching lines...) Expand all Loading... |
3468 bool accept_OF = true; | 3476 bool accept_OF = true; |
3469 ForEachStatement::VisitMode mode; | 3477 ForEachStatement::VisitMode mode; |
3470 int each_beg_pos = scanner()->location().beg_pos; | 3478 int each_beg_pos = scanner()->location().beg_pos; |
3471 int each_end_pos = scanner()->location().end_pos; | 3479 int each_end_pos = scanner()->location().end_pos; |
3472 | 3480 |
3473 if (accept_IN && CheckInOrOf(accept_OF, &mode, ok)) { | 3481 if (accept_IN && CheckInOrOf(accept_OF, &mode, ok)) { |
3474 if (!*ok) return nullptr; | 3482 if (!*ok) return nullptr; |
3475 if (num_decl != 1) { | 3483 if (num_decl != 1) { |
3476 const char* loop_type = | 3484 const char* loop_type = |
3477 mode == ForEachStatement::ITERATE ? "for-of" : "for-in"; | 3485 mode == ForEachStatement::ITERATE ? "for-of" : "for-in"; |
3478 ParserTraits::ReportMessageAt(parsing_result.bindings_loc, | 3486 ParserTraits::ReportMessageAt( |
3479 "for_inof_loop_multi_bindings", | 3487 parsing_result.bindings_loc, |
3480 loop_type); | 3488 MessageTemplate::kForInOfLoopMultiBindings, loop_type); |
3481 *ok = false; | 3489 *ok = false; |
3482 return nullptr; | 3490 return nullptr; |
3483 } | 3491 } |
3484 if (parsing_result.first_initializer_loc.IsValid() && | 3492 if (parsing_result.first_initializer_loc.IsValid() && |
3485 (is_strict(language_mode()) || mode == ForEachStatement::ITERATE)) { | 3493 (is_strict(language_mode()) || mode == ForEachStatement::ITERATE)) { |
3486 if (mode == ForEachStatement::ITERATE) { | 3494 if (mode == ForEachStatement::ITERATE) { |
3487 ReportMessageAt(parsing_result.first_initializer_loc, | 3495 ReportMessageAt(parsing_result.first_initializer_loc, |
3488 "for_of_loop_initializer"); | 3496 MessageTemplate::kForOfLoopInitializer); |
3489 } else { | 3497 } else { |
3490 ReportMessageAt(parsing_result.first_initializer_loc, | 3498 ReportMessageAt(parsing_result.first_initializer_loc, |
3491 "for_in_loop_initializer"); | 3499 MessageTemplate::kForInLoopInitializer); |
3492 } | 3500 } |
3493 *ok = false; | 3501 *ok = false; |
3494 return nullptr; | 3502 return nullptr; |
3495 } | 3503 } |
3496 // Rewrite a for-in statement of the form | 3504 // Rewrite a for-in statement of the form |
3497 // | 3505 // |
3498 // for (let/const x in e) b | 3506 // for (let/const x in e) b |
3499 // | 3507 // |
3500 // into | 3508 // into |
3501 // | 3509 // |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3552 ForEachStatement::VisitMode mode; | 3560 ForEachStatement::VisitMode mode; |
3553 bool accept_OF = expression->IsVariableProxy(); | 3561 bool accept_OF = expression->IsVariableProxy(); |
3554 is_let_identifier_expression = | 3562 is_let_identifier_expression = |
3555 expression->IsVariableProxy() && | 3563 expression->IsVariableProxy() && |
3556 expression->AsVariableProxy()->raw_name() == | 3564 expression->AsVariableProxy()->raw_name() == |
3557 ast_value_factory()->let_string(); | 3565 ast_value_factory()->let_string(); |
3558 | 3566 |
3559 if (CheckInOrOf(accept_OF, &mode, ok)) { | 3567 if (CheckInOrOf(accept_OF, &mode, ok)) { |
3560 if (!*ok) return nullptr; | 3568 if (!*ok) return nullptr; |
3561 expression = this->CheckAndRewriteReferenceExpression( | 3569 expression = this->CheckAndRewriteReferenceExpression( |
3562 expression, lhs_location, "invalid_lhs_in_for", CHECK_OK); | 3570 expression, lhs_location, MessageTemplate::kInvalidLhsInFor, |
| 3571 CHECK_OK); |
3563 | 3572 |
3564 ForEachStatement* loop = | 3573 ForEachStatement* loop = |
3565 factory()->NewForEachStatement(mode, labels, stmt_pos); | 3574 factory()->NewForEachStatement(mode, labels, stmt_pos); |
3566 Target target(&this->target_stack_, loop); | 3575 Target target(&this->target_stack_, loop); |
3567 | 3576 |
3568 Expression* enumerable = ParseExpression(true, CHECK_OK); | 3577 Expression* enumerable = ParseExpression(true, CHECK_OK); |
3569 Expect(Token::RPAREN, CHECK_OK); | 3578 Expect(Token::RPAREN, CHECK_OK); |
3570 | 3579 |
3571 Statement* body = ParseSubStatement(NULL, CHECK_OK); | 3580 Statement* body = ParseSubStatement(NULL, CHECK_OK); |
3572 InitializeForEachStatement(loop, expression, enumerable, body); | 3581 InitializeForEachStatement(loop, expression, enumerable, body); |
(...skipping 11 matching lines...) Expand all Loading... |
3584 } | 3593 } |
3585 | 3594 |
3586 // Standard 'for' loop | 3595 // Standard 'for' loop |
3587 ForStatement* loop = factory()->NewForStatement(labels, stmt_pos); | 3596 ForStatement* loop = factory()->NewForStatement(labels, stmt_pos); |
3588 Target target(&this->target_stack_, loop); | 3597 Target target(&this->target_stack_, loop); |
3589 | 3598 |
3590 // Parsed initializer at this point. | 3599 // Parsed initializer at this point. |
3591 // Detect attempts at 'let' declarations in sloppy mode. | 3600 // Detect attempts at 'let' declarations in sloppy mode. |
3592 if (peek() == Token::IDENTIFIER && is_sloppy(language_mode()) && | 3601 if (peek() == Token::IDENTIFIER && is_sloppy(language_mode()) && |
3593 is_let_identifier_expression) { | 3602 is_let_identifier_expression) { |
3594 ReportMessage("sloppy_lexical", NULL); | 3603 ReportMessage(MessageTemplate::kSloppyLexical, NULL); |
3595 *ok = false; | 3604 *ok = false; |
3596 return NULL; | 3605 return NULL; |
3597 } | 3606 } |
3598 Expect(Token::SEMICOLON, CHECK_OK); | 3607 Expect(Token::SEMICOLON, CHECK_OK); |
3599 | 3608 |
3600 // If there are let bindings, then condition and the next statement of the | 3609 // If there are let bindings, then condition and the next statement of the |
3601 // for loop must be parsed in a new scope. | 3610 // for loop must be parsed in a new scope. |
3602 Scope* inner_scope = NULL; | 3611 Scope* inner_scope = NULL; |
3603 if (lexical_bindings.length() > 0) { | 3612 if (lexical_bindings.length() > 0) { |
3604 inner_scope = NewScope(for_scope, BLOCK_SCOPE); | 3613 inner_scope = NewScope(for_scope, BLOCK_SCOPE); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3715 | 3724 |
3716 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { | 3725 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { |
3717 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); | 3726 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); |
3718 } | 3727 } |
3719 | 3728 |
3720 | 3729 |
3721 void ParserTraits::DeclareArrowFunctionParameters( | 3730 void ParserTraits::DeclareArrowFunctionParameters( |
3722 Scope* scope, Expression* expr, const Scanner::Location& params_loc, | 3731 Scope* scope, Expression* expr, const Scanner::Location& params_loc, |
3723 Scanner::Location* duplicate_loc, bool* ok) { | 3732 Scanner::Location* duplicate_loc, bool* ok) { |
3724 if (scope->num_parameters() >= Code::kMaxArguments) { | 3733 if (scope->num_parameters() >= Code::kMaxArguments) { |
3725 ReportMessageAt(params_loc, "malformed_arrow_function_parameter_list"); | 3734 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); |
3726 *ok = false; | 3735 *ok = false; |
3727 return; | 3736 return; |
3728 } | 3737 } |
3729 | 3738 |
3730 // ArrowFunctionFormals :: | 3739 // ArrowFunctionFormals :: |
3731 // Binary(Token::COMMA, ArrowFunctionFormals, VariableProxy) | 3740 // Binary(Token::COMMA, ArrowFunctionFormals, VariableProxy) |
3732 // VariableProxy | 3741 // VariableProxy |
3733 // | 3742 // |
3734 // As we need to visit the parameters in left-to-right order, we recurse on | 3743 // As we need to visit the parameters in left-to-right order, we recurse on |
3735 // the left-hand side of comma expressions. | 3744 // the left-hand side of comma expressions. |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3982 if (!is_lazily_parsed) { | 3991 if (!is_lazily_parsed) { |
3983 body = ParseEagerFunctionBody(function_name, pos, fvar, fvar_init_op, | 3992 body = ParseEagerFunctionBody(function_name, pos, fvar, fvar_init_op, |
3984 kind, CHECK_OK); | 3993 kind, CHECK_OK); |
3985 materialized_literal_count = function_state.materialized_literal_count(); | 3994 materialized_literal_count = function_state.materialized_literal_count(); |
3986 expected_property_count = function_state.expected_property_count(); | 3995 expected_property_count = function_state.expected_property_count(); |
3987 handler_count = function_state.handler_count(); | 3996 handler_count = function_state.handler_count(); |
3988 | 3997 |
3989 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { | 3998 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { |
3990 if (!function_state.super_location().IsValid()) { | 3999 if (!function_state.super_location().IsValid()) { |
3991 ReportMessageAt(function_name_location, | 4000 ReportMessageAt(function_name_location, |
3992 "strong_super_call_missing", kReferenceError); | 4001 MessageTemplate::kStrongSuperCallMissing, |
| 4002 kReferenceError); |
3993 *ok = false; | 4003 *ok = false; |
3994 return nullptr; | 4004 return nullptr; |
3995 } | 4005 } |
3996 } | 4006 } |
3997 } | 4007 } |
3998 | 4008 |
3999 // Validate name and parameter names. We can do this only after parsing the | 4009 // Validate name and parameter names. We can do this only after parsing the |
4000 // function, since the function can declare itself strict. | 4010 // function, since the function can declare itself strict. |
4001 CheckFunctionName(language_mode(), kind, function_name, | 4011 CheckFunctionName(language_mode(), kind, function_name, |
4002 name_is_strict_reserved, function_name_location, | 4012 name_is_strict_reserved, function_name_location, |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4246 return result; | 4256 return result; |
4247 } | 4257 } |
4248 | 4258 |
4249 | 4259 |
4250 ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, | 4260 ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, |
4251 Scanner::Location class_name_location, | 4261 Scanner::Location class_name_location, |
4252 bool name_is_strict_reserved, int pos, | 4262 bool name_is_strict_reserved, int pos, |
4253 bool* ok) { | 4263 bool* ok) { |
4254 // All parts of a ClassDeclaration and ClassExpression are strict code. | 4264 // All parts of a ClassDeclaration and ClassExpression are strict code. |
4255 if (name_is_strict_reserved) { | 4265 if (name_is_strict_reserved) { |
4256 ReportMessageAt(class_name_location, "unexpected_strict_reserved"); | 4266 ReportMessageAt(class_name_location, |
| 4267 MessageTemplate::kUnexpectedStrictReserved); |
4257 *ok = false; | 4268 *ok = false; |
4258 return NULL; | 4269 return NULL; |
4259 } | 4270 } |
4260 if (IsEvalOrArguments(name)) { | 4271 if (IsEvalOrArguments(name)) { |
4261 ReportMessageAt(class_name_location, "strict_eval_arguments"); | 4272 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); |
4262 *ok = false; | 4273 *ok = false; |
4263 return NULL; | 4274 return NULL; |
4264 } | 4275 } |
4265 if (is_strong(language_mode()) && IsUndefined(name)) { | 4276 if (is_strong(language_mode()) && IsUndefined(name)) { |
4266 ReportMessageAt(class_name_location, "strong_undefined"); | 4277 ReportMessageAt(class_name_location, MessageTemplate::kStrongUndefined); |
4267 *ok = false; | 4278 *ok = false; |
4268 return NULL; | 4279 return NULL; |
4269 } | 4280 } |
4270 | 4281 |
4271 // Create a block scope which is additionally tagged as class scope; this is | 4282 // Create a block scope which is additionally tagged as class scope; this is |
4272 // important for resolving variable references to the class name in the strong | 4283 // important for resolving variable references to the class name in the strong |
4273 // mode. | 4284 // mode. |
4274 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE); | 4285 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE); |
4275 block_scope->tag_as_class_scope(); | 4286 block_scope->tag_as_class_scope(); |
4276 BlockState block_state(&scope_, block_scope); | 4287 BlockState block_state(&scope_, block_scope); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4385 // Check for built-in IS_VAR macro. | 4396 // Check for built-in IS_VAR macro. |
4386 if (function != NULL && | 4397 if (function != NULL && |
4387 function->intrinsic_type == Runtime::RUNTIME && | 4398 function->intrinsic_type == Runtime::RUNTIME && |
4388 function->function_id == Runtime::kIS_VAR) { | 4399 function->function_id == Runtime::kIS_VAR) { |
4389 // %IS_VAR(x) evaluates to x if x is a variable, | 4400 // %IS_VAR(x) evaluates to x if x is a variable, |
4390 // leads to a parse error otherwise. Could be implemented as an | 4401 // leads to a parse error otherwise. Could be implemented as an |
4391 // inline function %_IS_VAR(x) to eliminate this special case. | 4402 // inline function %_IS_VAR(x) to eliminate this special case. |
4392 if (args->length() == 1 && args->at(0)->AsVariableProxy() != NULL) { | 4403 if (args->length() == 1 && args->at(0)->AsVariableProxy() != NULL) { |
4393 return args->at(0); | 4404 return args->at(0); |
4394 } else { | 4405 } else { |
4395 ReportMessage("not_isvar"); | 4406 ReportMessage(MessageTemplate::kNotIsvar); |
4396 *ok = false; | 4407 *ok = false; |
4397 return NULL; | 4408 return NULL; |
4398 } | 4409 } |
4399 } | 4410 } |
4400 | 4411 |
4401 // Check that the expected number of arguments are being passed. | 4412 // Check that the expected number of arguments are being passed. |
4402 if (function != NULL && | 4413 if (function != NULL && |
4403 function->nargs != -1 && | 4414 function->nargs != -1 && |
4404 function->nargs != args->length()) { | 4415 function->nargs != args->length()) { |
4405 ReportMessage("illegal_access"); | 4416 ReportMessage(MessageTemplate::kIllegalAccess); |
4406 *ok = false; | 4417 *ok = false; |
4407 return NULL; | 4418 return NULL; |
4408 } | 4419 } |
4409 | 4420 |
4410 // Check that the function is defined if it's an inline runtime call. | 4421 // Check that the function is defined if it's an inline runtime call. |
4411 if (function == NULL && name->FirstCharacter() == '_') { | 4422 if (function == NULL && name->FirstCharacter() == '_') { |
4412 ParserTraits::ReportMessage("not_defined", name); | 4423 ParserTraits::ReportMessage(MessageTemplate::kNotDefined, name); |
4413 *ok = false; | 4424 *ok = false; |
4414 return NULL; | 4425 return NULL; |
4415 } | 4426 } |
4416 | 4427 |
4417 // We have a valid intrinsics call or a call to a builtin. | 4428 // We have a valid intrinsics call or a call to a builtin. |
4418 return factory()->NewCallRuntime(name, function, args, pos); | 4429 return factory()->NewCallRuntime(name, function, args, pos); |
4419 } | 4430 } |
4420 | 4431 |
4421 | 4432 |
4422 Literal* Parser::GetLiteralUndefined(int position) { | 4433 Literal* Parser::GetLiteralUndefined(int position) { |
4423 return factory()->NewUndefinedLiteral(position); | 4434 return factory()->NewUndefinedLiteral(position); |
4424 } | 4435 } |
4425 | 4436 |
4426 | 4437 |
4427 void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) { | 4438 void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) { |
4428 Declaration* decl = scope->CheckConflictingVarDeclarations(); | 4439 Declaration* decl = scope->CheckConflictingVarDeclarations(); |
4429 if (decl != NULL) { | 4440 if (decl != NULL) { |
4430 // In harmony mode we treat conflicting variable bindinds as early | 4441 // In harmony mode we treat conflicting variable bindinds as early |
4431 // errors. See ES5 16 for a definition of early errors. | 4442 // errors. See ES5 16 for a definition of early errors. |
4432 const AstRawString* name = decl->proxy()->raw_name(); | 4443 const AstRawString* name = decl->proxy()->raw_name(); |
4433 int position = decl->proxy()->position(); | 4444 int position = decl->proxy()->position(); |
4434 Scanner::Location location = position == RelocInfo::kNoPosition | 4445 Scanner::Location location = position == RelocInfo::kNoPosition |
4435 ? Scanner::Location::invalid() | 4446 ? Scanner::Location::invalid() |
4436 : Scanner::Location(position, position + 1); | 4447 : Scanner::Location(position, position + 1); |
4437 ParserTraits::ReportMessageAt(location, "var_redeclaration", name); | 4448 ParserTraits::ReportMessageAt(location, MessageTemplate::kVarRedeclaration, |
| 4449 name); |
4438 *ok = false; | 4450 *ok = false; |
4439 } | 4451 } |
4440 } | 4452 } |
4441 | 4453 |
4442 | 4454 |
4443 // ---------------------------------------------------------------------------- | 4455 // ---------------------------------------------------------------------------- |
4444 // Parser support | 4456 // Parser support |
4445 | 4457 |
4446 bool Parser::TargetStackContainsLabel(const AstRawString* label) { | 4458 bool Parser::TargetStackContainsLabel(const AstRawString* label) { |
4447 for (Target* t = target_stack_; t != NULL; t = t->previous()) { | 4459 for (Target* t = target_stack_; t != NULL; t = t->previous()) { |
(...skipping 1300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5748 | 5760 |
5749 Expression* Parser::SpreadCallNew(Expression* function, | 5761 Expression* Parser::SpreadCallNew(Expression* function, |
5750 ZoneList<v8::internal::Expression*>* args, | 5762 ZoneList<v8::internal::Expression*>* args, |
5751 int pos) { | 5763 int pos) { |
5752 args->InsertAt(0, function, zone()); | 5764 args->InsertAt(0, function, zone()); |
5753 | 5765 |
5754 return factory()->NewCallRuntime( | 5766 return factory()->NewCallRuntime( |
5755 ast_value_factory()->reflect_construct_string(), NULL, args, pos); | 5767 ast_value_factory()->reflect_construct_string(), NULL, args, pos); |
5756 } | 5768 } |
5757 } } // namespace v8::internal | 5769 } } // namespace v8::internal |
OLD | NEW |