| 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/parsing/parser.h" | 5 #include "src/parsing/parser.h" |
| 6 | 6 |
| 7 #include "src/api.h" | 7 #include "src/api.h" |
| 8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
| 9 #include "src/ast/ast-expression-rewriter.h" | 9 #include "src/ast/ast-expression-rewriter.h" |
| 10 #include "src/ast/ast-expression-visitor.h" | 10 #include "src/ast/ast-expression-visitor.h" |
| (...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 752 int function_token_position, FunctionLiteral::FunctionType type, | 752 int function_token_position, FunctionLiteral::FunctionType type, |
| 753 LanguageMode language_mode, typesystem::TypeFlags type_flags, bool* ok) { | 753 LanguageMode language_mode, typesystem::TypeFlags type_flags, bool* ok) { |
| 754 return parser_->ParseFunctionLiteral( | 754 return parser_->ParseFunctionLiteral( |
| 755 name, function_name_location, function_name_validity, kind, | 755 name, function_name_location, function_name_validity, kind, |
| 756 function_token_position, type, language_mode, type_flags, ok); | 756 function_token_position, type, language_mode, type_flags, ok); |
| 757 } | 757 } |
| 758 | 758 |
| 759 | 759 |
| 760 ClassLiteral* ParserTraits::ParseClassLiteral( | 760 ClassLiteral* ParserTraits::ParseClassLiteral( |
| 761 const AstRawString* name, Scanner::Location class_name_location, | 761 const AstRawString* name, Scanner::Location class_name_location, |
| 762 bool name_is_strict_reserved, int pos, bool* ok) { | 762 bool name_is_strict_reserved, int pos, bool ambient, bool* ok) { |
| 763 return parser_->ParseClassLiteral(name, class_name_location, | 763 return parser_->ParseClassLiteral(name, class_name_location, |
| 764 name_is_strict_reserved, pos, ok); | 764 name_is_strict_reserved, pos, ambient, ok); |
| 765 } | 765 } |
| 766 | 766 |
| 767 | 767 |
| 768 Parser::Parser(ParseInfo* info) | 768 Parser::Parser(ParseInfo* info) |
| 769 : ParserBase<ParserTraits>(info->zone(), &scanner_, info->stack_limit(), | 769 : ParserBase<ParserTraits>(info->zone(), &scanner_, info->stack_limit(), |
| 770 info->extension(), info->ast_value_factory(), | 770 info->extension(), info->ast_value_factory(), |
| 771 NULL, this), | 771 NULL, this), |
| 772 scanner_(info->unicode_cache()), | 772 scanner_(info->unicode_cache()), |
| 773 reusable_preparser_(NULL), | 773 reusable_preparser_(NULL), |
| 774 original_scope_(NULL), | 774 original_scope_(NULL), |
| (...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1265 return 0; | 1265 return 0; |
| 1266 } | 1266 } |
| 1267 | 1267 |
| 1268 | 1268 |
| 1269 Statement* Parser::ParseStatementListItem(bool* ok) { | 1269 Statement* Parser::ParseStatementListItem(bool* ok) { |
| 1270 // (Ecma 262 6th Edition, 13.1): | 1270 // (Ecma 262 6th Edition, 13.1): |
| 1271 // StatementListItem: | 1271 // StatementListItem: |
| 1272 // Statement | 1272 // Statement |
| 1273 // Declaration | 1273 // Declaration |
| 1274 | 1274 |
| 1275 // Allow ambient variable, function, and class declarations. |
| 1276 bool ambient = |
| 1277 scope_->typed() && CheckContextualKeyword(CStrVector("declare")); |
| 1278 if (ambient && !scope_->is_toplevel_scope()) { |
| 1279 *ok = false; |
| 1280 ReportMessage(MessageTemplate::kIllegalDeclare); |
| 1281 return nullptr; |
| 1282 } |
| 1275 switch (peek()) { | 1283 switch (peek()) { |
| 1276 case Token::FUNCTION: | 1284 case Token::FUNCTION: |
| 1277 return ParseFunctionDeclaration(NULL, ok); | 1285 return ParseFunctionDeclaration(NULL, ambient, ok); |
| 1278 case Token::CLASS: | 1286 case Token::CLASS: |
| 1279 Consume(Token::CLASS); | 1287 Consume(Token::CLASS); |
| 1280 return ParseClassDeclaration(NULL, ok); | 1288 return ParseClassDeclaration(NULL, ambient, ok); |
| 1281 case Token::CONST: | 1289 case Token::CONST: |
| 1282 if (allow_const()) { | 1290 if (allow_const()) { |
| 1283 return ParseVariableStatement(kStatementListItem, NULL, ok); | 1291 return ParseVariableStatement(kStatementListItem, NULL, ambient, ok); |
| 1284 } | 1292 } |
| 1285 break; | 1293 break; |
| 1286 case Token::VAR: | 1294 case Token::VAR: |
| 1287 return ParseVariableStatement(kStatementListItem, NULL, ok); | 1295 return ParseVariableStatement(kStatementListItem, NULL, ambient, ok); |
| 1288 case Token::LET: | 1296 case Token::LET: |
| 1289 if (IsNextLetKeyword()) { | 1297 if (IsNextLetKeyword()) { |
| 1290 return ParseVariableStatement(kStatementListItem, NULL, ok); | 1298 return ParseVariableStatement(kStatementListItem, NULL, ambient, ok); |
| 1291 } | 1299 } |
| 1292 break; | 1300 break; |
| 1293 case Token::IDENTIFIER: | 1301 case Token::IDENTIFIER: |
| 1294 case Token::FUTURE_STRICT_RESERVED_WORD: { | 1302 case Token::FUTURE_STRICT_RESERVED_WORD: { |
| 1295 if (!scope_->typed()) break; | 1303 if (!scope_->typed() || ambient) break; |
| 1296 int pos = peek_position(); | 1304 int pos = peek_position(); |
| 1297 if (CheckContextualKeyword(CStrVector("type"))) { | 1305 if (CheckContextualKeyword(CStrVector("type"))) { |
| 1298 return ParseTypeAliasDeclaration(pos, ok); | 1306 return ParseTypeAliasDeclaration(pos, ok); |
| 1299 } else if (CheckContextualKeyword(CStrVector("interface"))) { | 1307 } else if (CheckContextualKeyword(CStrVector("interface"))) { |
| 1300 return ParseInterfaceDeclaration(pos, ok); | 1308 return ParseInterfaceDeclaration(pos, ok); |
| 1301 } | 1309 } |
| 1302 break; | 1310 break; |
| 1303 } | 1311 } |
| 1304 // TODO(nikolaos): ambient | |
| 1305 default: | 1312 default: |
| 1306 break; | 1313 break; |
| 1307 } | 1314 } |
| 1315 if (ambient) { |
| 1316 *ok = false; |
| 1317 ReportMessageAt(scanner()->peek_location(), |
| 1318 MessageTemplate::kBadAmbientDeclaration); |
| 1319 return nullptr; |
| 1320 } |
| 1308 return ParseStatement(NULL, kAllowLabelledFunctionStatement, ok); | 1321 return ParseStatement(NULL, kAllowLabelledFunctionStatement, ok); |
| 1309 } | 1322 } |
| 1310 | 1323 |
| 1311 | 1324 |
| 1312 Statement* Parser::ParseModuleItem(bool* ok) { | 1325 Statement* Parser::ParseModuleItem(bool* ok) { |
| 1313 // (Ecma 262 6th Edition, 15.2): | 1326 // (Ecma 262 6th Edition, 15.2): |
| 1314 // ModuleItem : | 1327 // ModuleItem : |
| 1315 // ImportDeclaration | 1328 // ImportDeclaration |
| 1316 // ExportDeclaration | 1329 // ExportDeclaration |
| 1317 // StatementListItem | 1330 // StatementListItem |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1606 // 'export' 'default' ClassDeclaration | 1619 // 'export' 'default' ClassDeclaration |
| 1607 // 'export' 'default' AssignmentExpression[In] ';' | 1620 // 'export' 'default' AssignmentExpression[In] ';' |
| 1608 | 1621 |
| 1609 Expect(Token::DEFAULT, CHECK_OK); | 1622 Expect(Token::DEFAULT, CHECK_OK); |
| 1610 Scanner::Location default_loc = scanner()->location(); | 1623 Scanner::Location default_loc = scanner()->location(); |
| 1611 | 1624 |
| 1612 const AstRawString* default_string = ast_value_factory()->default_string(); | 1625 const AstRawString* default_string = ast_value_factory()->default_string(); |
| 1613 ZoneList<const AstRawString*> names(1, zone()); | 1626 ZoneList<const AstRawString*> names(1, zone()); |
| 1614 Statement* result = nullptr; | 1627 Statement* result = nullptr; |
| 1615 Expression* default_export = nullptr; | 1628 Expression* default_export = nullptr; |
| 1629 |
| 1630 // Allow ambient function and class declarations to be exported as default. |
| 1631 int ambient_pos = peek_position(); |
| 1632 bool ambient = |
| 1633 scope_->typed() && CheckContextualKeyword(CStrVector("declare")); |
| 1634 |
| 1616 switch (peek()) { | 1635 switch (peek()) { |
| 1617 case Token::FUNCTION: { | 1636 case Token::FUNCTION: { |
| 1618 Consume(Token::FUNCTION); | 1637 Consume(Token::FUNCTION); |
| 1619 int pos = position(); | 1638 int pos = position(); |
| 1620 bool is_generator = Check(Token::MUL); | 1639 bool is_generator = Check(Token::MUL); |
| 1621 if (peek() == Token::LPAREN || (scope_->typed() && Check(Token::LT))) { | 1640 if (peek() == Token::LPAREN || (scope_->typed() && peek() == Token::LT)) { |
| 1622 // FunctionDeclaration[+Default] :: | 1641 // FunctionDeclaration[+Default] :: |
| 1623 // 'function' '(' FormalParameters ')' '{' FunctionBody '}' | 1642 // 'function' '(' FormalParameters ')' '{' FunctionBody '}' |
| 1624 // | 1643 // |
| 1625 // GeneratorDeclaration[+Default] :: | 1644 // GeneratorDeclaration[+Default] :: |
| 1626 // 'function' '*' '(' FormalParameters ')' '{' FunctionBody '}' | 1645 // 'function' '*' '(' FormalParameters ')' '{' FunctionBody '}' |
| 1627 default_export = ParseFunctionLiteral( | 1646 typesystem::TypeFlags type_flags = |
| 1628 default_string, Scanner::Location::invalid(), | 1647 ambient ? typesystem::kAmbient : typesystem::kAllowSignature; |
| 1629 kSkipFunctionNameCheck, | 1648 default_export = |
| 1630 is_generator ? FunctionKind::kGeneratorFunction | 1649 ParseFunctionLiteral(default_string, Scanner::Location::invalid(), |
| 1631 : FunctionKind::kNormalFunction, | 1650 kSkipFunctionNameCheck, |
| 1632 pos, FunctionLiteral::kDeclaration, language_mode(), | 1651 is_generator ? FunctionKind::kGeneratorFunction |
| 1633 typesystem::kAllowSignature, CHECK_OK); | 1652 : FunctionKind::kNormalFunction, |
| 1653 pos, FunctionLiteral::kDeclaration, |
| 1654 language_mode(), type_flags, CHECK_OK); |
| 1634 result = factory()->NewEmptyStatement(RelocInfo::kNoPosition); | 1655 result = factory()->NewEmptyStatement(RelocInfo::kNoPosition); |
| 1635 } else { | 1656 } else { |
| 1636 result = ParseFunctionDeclaration(pos, is_generator, &names, CHECK_OK); | 1657 result = ParseFunctionDeclaration(pos, is_generator, &names, ambient, |
| 1658 CHECK_OK); |
| 1637 } | 1659 } |
| 1638 break; | 1660 break; |
| 1639 } | 1661 } |
| 1640 | 1662 |
| 1641 case Token::CLASS: | 1663 case Token::CLASS: |
| 1642 Consume(Token::CLASS); | 1664 Consume(Token::CLASS); |
| 1643 if (peek() == Token::EXTENDS || peek() == Token::LBRACE) { | 1665 if (peek() == Token::EXTENDS || peek() == Token::LBRACE) { |
| 1644 // ClassDeclaration[+Default] :: | 1666 // ClassDeclaration[+Default] :: |
| 1645 // 'class' ('extends' LeftHandExpression)? '{' ClassBody '}' | 1667 // 'class' ('extends' LeftHandExpression)? '{' ClassBody '}' |
| 1646 default_export = | 1668 default_export = |
| 1647 ParseClassLiteral(default_string, Scanner::Location::invalid(), | 1669 ParseClassLiteral(default_string, Scanner::Location::invalid(), |
| 1648 false, position(), CHECK_OK); | 1670 false, position(), ambient, CHECK_OK); |
| 1649 result = factory()->NewEmptyStatement(RelocInfo::kNoPosition); | 1671 result = factory()->NewEmptyStatement(RelocInfo::kNoPosition); |
| 1650 } else { | 1672 } else { |
| 1651 result = ParseClassDeclaration(&names, CHECK_OK); | 1673 result = ParseClassDeclaration(&names, ambient, CHECK_OK); |
| 1652 } | 1674 } |
| 1653 break; | 1675 break; |
| 1654 | 1676 |
| 1655 default: { | 1677 default: { |
| 1678 if (ambient) { |
| 1679 *ok = false; |
| 1680 ReportMessageAt(scanner()->peek_location(), |
| 1681 MessageTemplate::kBadAmbientDeclaration); |
| 1682 return nullptr; |
| 1683 } |
| 1684 |
| 1656 int pos = peek_position(); | 1685 int pos = peek_position(); |
| 1657 ExpressionClassifier classifier(this); | 1686 ExpressionClassifier classifier(this); |
| 1658 Expression* expr = ParseAssignmentExpression(true, &classifier, CHECK_OK); | 1687 Expression* expr = ParseAssignmentExpression(true, &classifier, CHECK_OK); |
| 1659 RewriteNonPattern(&classifier, CHECK_OK); | 1688 RewriteNonPattern(&classifier, CHECK_OK); |
| 1660 | 1689 |
| 1661 ExpectSemicolon(CHECK_OK); | 1690 ExpectSemicolon(CHECK_OK); |
| 1662 result = factory()->NewExpressionStatement(expr, pos); | 1691 result = factory()->NewExpressionStatement(expr, pos); |
| 1663 break; | 1692 break; |
| 1664 } | 1693 } |
| 1665 } | 1694 } |
| 1666 | 1695 |
| 1696 // Exported ambients are not checked. |
| 1697 if (ambient) return factory()->NewEmptyStatement(ambient_pos); |
| 1698 |
| 1667 DCHECK_LE(names.length(), 1); | 1699 DCHECK_LE(names.length(), 1); |
| 1668 if (names.length() == 1) { | 1700 if (names.length() == 1) { |
| 1669 scope_->module()->AddLocalExport(default_string, names.first(), zone(), ok); | 1701 scope_->module()->AddLocalExport(default_string, names.first(), zone(), ok); |
| 1670 if (!*ok) { | 1702 if (!*ok) { |
| 1671 ParserTraits::ReportMessageAt( | 1703 ParserTraits::ReportMessageAt( |
| 1672 default_loc, MessageTemplate::kDuplicateExport, default_string); | 1704 default_loc, MessageTemplate::kDuplicateExport, default_string); |
| 1673 return nullptr; | 1705 return nullptr; |
| 1674 } | 1706 } |
| 1675 } else { | 1707 } else { |
| 1676 // TODO(ES6): Assign result to a const binding with the name "*default*" | 1708 // TODO(ES6): Assign result to a const binding with the name "*default*" |
| 1677 // and add an export entry with "*default*" as the local name. | 1709 // and add an export entry with "*default*" as the local name. |
| 1678 USE(default_export); | 1710 USE(default_export); |
| 1679 } | 1711 } |
| 1680 | 1712 |
| 1681 return result; | 1713 return result; |
| 1682 } | 1714 } |
| 1683 | 1715 |
| 1684 | 1716 |
| 1685 Statement* Parser::ParseExportDeclaration(bool* ok) { | 1717 Statement* Parser::ParseExportDeclaration(bool* ok) { |
| 1686 // ExportDeclaration: | 1718 // ExportDeclaration: |
| 1687 // 'export' '*' 'from' ModuleSpecifier ';' | 1719 // 'export' '*' 'from' ModuleSpecifier ';' |
| 1688 // 'export' ExportClause ('from' ModuleSpecifier)? ';' | 1720 // 'export' ExportClause ('from' ModuleSpecifier)? ';' |
| 1689 // 'export' VariableStatement | 1721 // 'export' VariableStatement |
| 1690 // 'export' Declaration | 1722 // 'export' Declaration |
| 1691 // 'export' 'default' ... (handled in ParseExportDefault) | 1723 // 'export' 'default' ... (handled in ParseExportDefault) |
| 1692 | 1724 |
| 1693 int pos = peek_position(); | 1725 int pos = peek_position(); |
| 1694 Expect(Token::EXPORT, CHECK_OK); | 1726 Expect(Token::EXPORT, CHECK_OK); |
| 1695 | 1727 |
| 1728 // Allow exported ambient variable, function, and class declarations. |
| 1729 bool ambient = |
| 1730 scope_->typed() && CheckContextualKeyword(CStrVector("declare")); |
| 1731 |
| 1696 Statement* result = NULL; | 1732 Statement* result = NULL; |
| 1697 ZoneList<const AstRawString*> names(1, zone()); | 1733 ZoneList<const AstRawString*> names(1, zone()); |
| 1734 if (ambient && (peek() == Token::DEFAULT || peek() == Token::MUL || |
| 1735 peek() == Token::LBRACE)) { |
| 1736 *ok = false; |
| 1737 ReportMessageAt(scanner()->peek_location(), |
| 1738 MessageTemplate::kBadAmbientDeclaration); |
| 1739 return nullptr; |
| 1740 } |
| 1698 switch (peek()) { | 1741 switch (peek()) { |
| 1699 case Token::DEFAULT: | 1742 case Token::DEFAULT: |
| 1700 return ParseExportDefault(ok); | 1743 return ParseExportDefault(ok); |
| 1701 | 1744 |
| 1702 case Token::MUL: { | 1745 case Token::MUL: { |
| 1703 Consume(Token::MUL); | 1746 Consume(Token::MUL); |
| 1704 ExpectContextualKeyword(CStrVector("from"), CHECK_OK); | 1747 ExpectContextualKeyword(CStrVector("from"), CHECK_OK); |
| 1705 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK); | 1748 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK); |
| 1706 scope_->module()->AddModuleRequest(module_specifier, zone()); | 1749 scope_->module()->AddModuleRequest(module_specifier, zone()); |
| 1707 // TODO(ES6): scope_->module()->AddStarExport(...) | 1750 // TODO(ES6): scope_->module()->AddStarExport(...) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1755 scope_->module()->AddModuleRequest(indirect_export_module_specifier, | 1798 scope_->module()->AddModuleRequest(indirect_export_module_specifier, |
| 1756 zone()); | 1799 zone()); |
| 1757 for (int i = 0; i < length; ++i) { | 1800 for (int i = 0; i < length; ++i) { |
| 1758 // TODO(ES6): scope_->module()->AddIndirectExport(...);( | 1801 // TODO(ES6): scope_->module()->AddIndirectExport(...);( |
| 1759 } | 1802 } |
| 1760 } | 1803 } |
| 1761 return factory()->NewEmptyStatement(pos); | 1804 return factory()->NewEmptyStatement(pos); |
| 1762 } | 1805 } |
| 1763 | 1806 |
| 1764 case Token::FUNCTION: | 1807 case Token::FUNCTION: |
| 1765 result = ParseFunctionDeclaration(&names, CHECK_OK); | 1808 result = ParseFunctionDeclaration(&names, ambient, CHECK_OK); |
| 1766 break; | 1809 break; |
| 1767 | 1810 |
| 1768 case Token::CLASS: | 1811 case Token::CLASS: |
| 1769 Consume(Token::CLASS); | 1812 Consume(Token::CLASS); |
| 1770 result = ParseClassDeclaration(&names, CHECK_OK); | 1813 result = ParseClassDeclaration(&names, ambient, CHECK_OK); |
| 1771 break; | 1814 break; |
| 1772 | 1815 |
| 1773 case Token::VAR: | 1816 case Token::VAR: |
| 1774 case Token::LET: | 1817 case Token::LET: |
| 1775 case Token::CONST: | 1818 case Token::CONST: |
| 1776 result = ParseVariableStatement(kStatementListItem, &names, CHECK_OK); | 1819 result = |
| 1820 ParseVariableStatement(kStatementListItem, &names, ambient, CHECK_OK); |
| 1777 break; | 1821 break; |
| 1778 | 1822 |
| 1779 default: | 1823 default: |
| 1780 *ok = false; | 1824 *ok = false; |
| 1781 ReportUnexpectedToken(scanner()->current_token()); | 1825 ReportUnexpectedToken(scanner()->current_token()); |
| 1782 return NULL; | 1826 return NULL; |
| 1783 } | 1827 } |
| 1784 | 1828 |
| 1829 // Exported ambients are not checked. |
| 1830 if (ambient) return factory()->NewEmptyStatement(pos); |
| 1831 |
| 1785 // Extract declared names into export declarations. | 1832 // Extract declared names into export declarations. |
| 1786 ModuleDescriptor* descriptor = scope_->module(); | 1833 ModuleDescriptor* descriptor = scope_->module(); |
| 1787 for (int i = 0; i < names.length(); ++i) { | 1834 for (int i = 0; i < names.length(); ++i) { |
| 1788 descriptor->AddLocalExport(names[i], names[i], zone(), ok); | 1835 descriptor->AddLocalExport(names[i], names[i], zone(), ok); |
| 1789 if (!*ok) { | 1836 if (!*ok) { |
| 1790 // TODO(adamk): Possibly report this error at the right place. | 1837 // TODO(adamk): Possibly report this error at the right place. |
| 1791 ParserTraits::ReportMessage(MessageTemplate::kDuplicateExport, names[i]); | 1838 ParserTraits::ReportMessage(MessageTemplate::kDuplicateExport, names[i]); |
| 1792 return NULL; | 1839 return NULL; |
| 1793 } | 1840 } |
| 1794 } | 1841 } |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1892 is_strict(language_mode()) | 1939 is_strict(language_mode()) |
| 1893 ? MessageTemplate::kStrictFunction | 1940 ? MessageTemplate::kStrictFunction |
| 1894 : MessageTemplate::kSloppyFunction); | 1941 : MessageTemplate::kSloppyFunction); |
| 1895 *ok = false; | 1942 *ok = false; |
| 1896 return nullptr; | 1943 return nullptr; |
| 1897 | 1944 |
| 1898 case Token::DEBUGGER: | 1945 case Token::DEBUGGER: |
| 1899 return ParseDebuggerStatement(ok); | 1946 return ParseDebuggerStatement(ok); |
| 1900 | 1947 |
| 1901 case Token::VAR: | 1948 case Token::VAR: |
| 1902 return ParseVariableStatement(kStatement, NULL, ok); | 1949 return ParseVariableStatement(kStatement, NULL, false, ok); |
| 1903 | 1950 |
| 1904 default: | 1951 default: |
| 1905 return ParseExpressionOrLabelledStatement(labels, allow_function, ok); | 1952 return ParseExpressionOrLabelledStatement(labels, allow_function, ok); |
| 1906 } | 1953 } |
| 1907 } | 1954 } |
| 1908 | 1955 |
| 1909 Statement* Parser::ParseStatementAsUnlabelled( | 1956 Statement* Parser::ParseStatementAsUnlabelled( |
| 1910 ZoneList<const AstRawString*>* labels, bool* ok) { | 1957 ZoneList<const AstRawString*>* labels, bool* ok) { |
| 1911 switch (peek()) { | 1958 switch (peek()) { |
| 1912 case Token::CONTINUE: | 1959 case Token::CONTINUE: |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2135 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); | 2182 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); |
| 2136 NativeFunctionLiteral* lit = factory()->NewNativeFunctionLiteral( | 2183 NativeFunctionLiteral* lit = factory()->NewNativeFunctionLiteral( |
| 2137 name, extension_, RelocInfo::kNoPosition); | 2184 name, extension_, RelocInfo::kNoPosition); |
| 2138 return factory()->NewExpressionStatement( | 2185 return factory()->NewExpressionStatement( |
| 2139 factory()->NewAssignment(Token::INIT, proxy, lit, RelocInfo::kNoPosition), | 2186 factory()->NewAssignment(Token::INIT, proxy, lit, RelocInfo::kNoPosition), |
| 2140 pos); | 2187 pos); |
| 2141 } | 2188 } |
| 2142 | 2189 |
| 2143 | 2190 |
| 2144 Statement* Parser::ParseFunctionDeclaration( | 2191 Statement* Parser::ParseFunctionDeclaration( |
| 2145 ZoneList<const AstRawString*>* names, bool* ok) { | 2192 ZoneList<const AstRawString*>* names, bool ambient, bool* ok) { |
| 2146 Expect(Token::FUNCTION, CHECK_OK); | 2193 Expect(Token::FUNCTION, CHECK_OK); |
| 2147 int pos = position(); | 2194 int pos = position(); |
| 2148 bool is_generator = Check(Token::MUL); | 2195 bool is_generator = Check(Token::MUL); |
| 2149 return ParseFunctionDeclaration(pos, is_generator, names, ok); | 2196 return ParseFunctionDeclaration(pos, is_generator, names, ambient, ok); |
| 2150 } | 2197 } |
| 2151 | 2198 |
| 2152 | 2199 |
| 2153 Statement* Parser::ParseFunctionDeclaration( | 2200 Statement* Parser::ParseFunctionDeclaration( |
| 2154 int pos, bool is_generator, ZoneList<const AstRawString*>* names, | 2201 int pos, bool is_generator, ZoneList<const AstRawString*>* names, |
| 2155 bool* ok) { | 2202 bool ambient, bool* ok) { |
| 2156 // FunctionDeclaration :: | 2203 // FunctionDeclaration :: |
| 2157 // 'function' Identifier '(' FormalParameters ')' '{' FunctionBody '}' | 2204 // 'function' Identifier '(' FormalParameters ')' '{' FunctionBody '}' |
| 2158 // GeneratorDeclaration :: | 2205 // GeneratorDeclaration :: |
| 2159 // 'function' '*' Identifier '(' FormalParameters ')' '{' FunctionBody '}' | 2206 // 'function' '*' Identifier '(' FormalParameters ')' '{' FunctionBody '}' |
| 2160 // | 2207 // |
| 2161 // 'function' and '*' (if present) have been consumed by the caller. | 2208 // 'function' and '*' (if present) have been consumed by the caller. |
| 2162 bool is_strict_reserved = false; | 2209 bool is_strict_reserved = false; |
| 2163 const AstRawString* name = ParseIdentifierOrStrictReservedWord( | 2210 const AstRawString* name = ParseIdentifierOrStrictReservedWord( |
| 2164 &is_strict_reserved, CHECK_OK); | 2211 &is_strict_reserved, CHECK_OK); |
| 2165 | 2212 |
| 2166 FuncNameInferrer::State fni_state(fni_); | 2213 FuncNameInferrer::State fni_state(fni_); |
| 2167 if (fni_ != NULL) fni_->PushEnclosingName(name); | 2214 if (fni_ != NULL) fni_->PushEnclosingName(name); |
| 2215 typesystem::TypeFlags type_flags = |
| 2216 ambient ? typesystem::kAmbient : typesystem::kAllowSignature; |
| 2168 FunctionLiteral* fun = | 2217 FunctionLiteral* fun = |
| 2169 ParseFunctionLiteral(name, scanner()->location(), | 2218 ParseFunctionLiteral(name, scanner()->location(), |
| 2170 is_strict_reserved ? kFunctionNameIsStrictReserved | 2219 is_strict_reserved ? kFunctionNameIsStrictReserved |
| 2171 : kFunctionNameValidityUnknown, | 2220 : kFunctionNameValidityUnknown, |
| 2172 is_generator ? FunctionKind::kGeneratorFunction | 2221 is_generator ? FunctionKind::kGeneratorFunction |
| 2173 : FunctionKind::kNormalFunction, | 2222 : FunctionKind::kNormalFunction, |
| 2174 pos, FunctionLiteral::kDeclaration, language_mode(), | 2223 pos, FunctionLiteral::kDeclaration, language_mode(), |
| 2175 typesystem::kAllowSignature, CHECK_OK); | 2224 type_flags, CHECK_OK); |
| 2176 // Return no function declaration if just the signature was given. | 2225 // Return no function declaration if just the signature was given. |
| 2177 EmptyStatement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition); | 2226 EmptyStatement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition); |
| 2178 if (fun == nullptr) return empty; | 2227 if (fun == nullptr) return empty; |
| 2179 | 2228 |
| 2180 // Even if we're not at the top-level of the global or a function | 2229 // Even if we're not at the top-level of the global or a function |
| 2181 // scope, we treat it as such and introduce the function with its | 2230 // scope, we treat it as such and introduce the function with its |
| 2182 // initial value upon entering the corresponding scope. | 2231 // initial value upon entering the corresponding scope. |
| 2183 // In ES6, a function behaves as a lexical binding, except in | 2232 // In ES6, a function behaves as a lexical binding, except in |
| 2184 // a script scope, or the initial scope of eval or another function. | 2233 // a script scope, or the initial scope of eval or another function. |
| 2185 VariableMode mode = | 2234 VariableMode mode = |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2198 factory()->NewSloppyBlockFunctionStatement(empty, scope_); | 2247 factory()->NewSloppyBlockFunctionStatement(empty, scope_); |
| 2199 scope_->DeclarationScope()->sloppy_block_function_map()->Declare(name, | 2248 scope_->DeclarationScope()->sloppy_block_function_map()->Declare(name, |
| 2200 delegate); | 2249 delegate); |
| 2201 return delegate; | 2250 return delegate; |
| 2202 } | 2251 } |
| 2203 return empty; | 2252 return empty; |
| 2204 } | 2253 } |
| 2205 | 2254 |
| 2206 | 2255 |
| 2207 Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names, | 2256 Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names, |
| 2208 bool* ok) { | 2257 bool ambient, bool* ok) { |
| 2209 // ClassDeclaration :: | 2258 // ClassDeclaration :: |
| 2210 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}' | 2259 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}' |
| 2211 // | 2260 // |
| 2212 // 'class' is expected to be consumed by the caller. | 2261 // 'class' is expected to be consumed by the caller. |
| 2213 // | 2262 // |
| 2214 // A ClassDeclaration | 2263 // A ClassDeclaration |
| 2215 // | 2264 // |
| 2216 // class C { ... } | 2265 // class C { ... } |
| 2217 // | 2266 // |
| 2218 // has the same semantics as: | 2267 // has the same semantics as: |
| 2219 // | 2268 // |
| 2220 // let C = class C { ... }; | 2269 // let C = class C { ... }; |
| 2221 // | 2270 // |
| 2222 // so rewrite it as such. | 2271 // so rewrite it as such. |
| 2223 | 2272 |
| 2224 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { | 2273 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { |
| 2225 ReportMessage(MessageTemplate::kSloppyLexical); | 2274 ReportMessage(MessageTemplate::kSloppyLexical); |
| 2226 *ok = false; | 2275 *ok = false; |
| 2227 return NULL; | 2276 return NULL; |
| 2228 } | 2277 } |
| 2229 | 2278 |
| 2230 int pos = position(); | 2279 int pos = position(); |
| 2231 bool is_strict_reserved = false; | 2280 bool is_strict_reserved = false; |
| 2232 const AstRawString* name = | 2281 const AstRawString* name = |
| 2233 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 2282 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
| 2234 ClassLiteral* value = ParseClassLiteral(name, scanner()->location(), | 2283 ClassLiteral* value = ParseClassLiteral( |
| 2235 is_strict_reserved, pos, CHECK_OK); | 2284 name, scanner()->location(), is_strict_reserved, pos, ambient, CHECK_OK); |
| 2285 // Return no class declaration in case of an ambient. |
| 2286 if (ambient) return factory()->NewEmptyStatement(RelocInfo::kNoPosition); |
| 2236 | 2287 |
| 2237 VariableProxy* proxy = NewUnresolved(name, LET); | 2288 VariableProxy* proxy = NewUnresolved(name, LET); |
| 2238 Declaration* declaration = | 2289 Declaration* declaration = |
| 2239 factory()->NewVariableDeclaration(proxy, LET, scope_, pos); | 2290 factory()->NewVariableDeclaration(proxy, LET, scope_, pos); |
| 2240 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); | 2291 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); |
| 2241 proxy->var()->set_initializer_position(position()); | 2292 proxy->var()->set_initializer_position(position()); |
| 2242 Assignment* assignment = | 2293 Assignment* assignment = |
| 2243 factory()->NewAssignment(Token::INIT, proxy, value, pos); | 2294 factory()->NewAssignment(Token::INIT, proxy, value, pos); |
| 2244 Statement* assignment_statement = | 2295 Statement* assignment_statement = |
| 2245 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); | 2296 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2295 for (auto declaration : declarations) { | 2346 for (auto declaration : declarations) { |
| 2296 PatternRewriter::DeclareAndInitializeVariables( | 2347 PatternRewriter::DeclareAndInitializeVariables( |
| 2297 result, &descriptor, &declaration, names, CHECK_OK); | 2348 result, &descriptor, &declaration, names, CHECK_OK); |
| 2298 } | 2349 } |
| 2299 return result; | 2350 return result; |
| 2300 } | 2351 } |
| 2301 | 2352 |
| 2302 | 2353 |
| 2303 Block* Parser::ParseVariableStatement(VariableDeclarationContext var_context, | 2354 Block* Parser::ParseVariableStatement(VariableDeclarationContext var_context, |
| 2304 ZoneList<const AstRawString*>* names, | 2355 ZoneList<const AstRawString*>* names, |
| 2305 bool* ok) { | 2356 bool ambient, bool* ok) { |
| 2306 // VariableStatement :: | 2357 // VariableStatement :: |
| 2307 // VariableDeclarations ';' | 2358 // VariableDeclarations ';' |
| 2308 | 2359 |
| 2309 // The scope of a var/const declared variable anywhere inside a function | 2360 // The scope of a var/const declared variable anywhere inside a function |
| 2310 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). Thus we can | 2361 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). Thus we can |
| 2311 // transform a source-level var/const declaration into a (Function) | 2362 // transform a source-level var/const declaration into a (Function) |
| 2312 // Scope declaration, and rewrite the source-level initialization into an | 2363 // Scope declaration, and rewrite the source-level initialization into an |
| 2313 // assignment statement. We use a block to collect multiple assignments. | 2364 // assignment statement. We use a block to collect multiple assignments. |
| 2314 // | 2365 // |
| 2315 // We mark the block as initializer block because we don't want the | 2366 // We mark the block as initializer block because we don't want the |
| 2316 // rewriter to add a '.result' assignment to such a block (to get compliant | 2367 // rewriter to add a '.result' assignment to such a block (to get compliant |
| 2317 // behavior for code such as print(eval('var x = 7')), and for cosmetic | 2368 // behavior for code such as print(eval('var x = 7')), and for cosmetic |
| 2318 // reasons when pretty-printing. Also, unless an assignment (initialization) | 2369 // reasons when pretty-printing. Also, unless an assignment (initialization) |
| 2319 // is inside an initializer block, it is ignored. | 2370 // is inside an initializer block, it is ignored. |
| 2320 | 2371 |
| 2321 DeclarationParsingResult parsing_result; | 2372 DeclarationParsingResult parsing_result; |
| 2322 Block* result = | 2373 Block* result = ParseVariableDeclarations(var_context, &parsing_result, names, |
| 2323 ParseVariableDeclarations(var_context, &parsing_result, names, CHECK_OK); | 2374 ambient, CHECK_OK); |
| 2324 ExpectSemicolon(CHECK_OK); | 2375 ExpectSemicolon(CHECK_OK); |
| 2325 return result; | 2376 return result; |
| 2326 } | 2377 } |
| 2327 | 2378 |
| 2328 Block* Parser::ParseVariableDeclarations( | 2379 Block* Parser::ParseVariableDeclarations( |
| 2329 VariableDeclarationContext var_context, | 2380 VariableDeclarationContext var_context, |
| 2330 DeclarationParsingResult* parsing_result, | 2381 DeclarationParsingResult* parsing_result, |
| 2331 ZoneList<const AstRawString*>* names, bool* ok) { | 2382 ZoneList<const AstRawString*>* names, bool ambient, bool* ok) { |
| 2332 // VariableDeclarations :: | 2383 // VariableDeclarations :: |
| 2333 // ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[','] | 2384 // ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[','] |
| 2334 // | 2385 // |
| 2335 // The ES6 Draft Rev3 specifies the following grammar for const declarations | 2386 // The ES6 Draft Rev3 specifies the following grammar for const declarations |
| 2336 // | 2387 // |
| 2337 // ConstDeclaration :: | 2388 // ConstDeclaration :: |
| 2338 // const ConstBinding (',' ConstBinding)* ';' | 2389 // const ConstBinding (',' ConstBinding)* ';' |
| 2339 // ConstBinding :: | 2390 // ConstBinding :: |
| 2340 // Identifier '=' AssignmentExpression | 2391 // Identifier '=' AssignmentExpression |
| 2341 // | 2392 // |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2393 } | 2444 } |
| 2394 } | 2445 } |
| 2395 | 2446 |
| 2396 // Parse optional type annotation. | 2447 // Parse optional type annotation. |
| 2397 typename TypeSystem::Type type = this->EmptyType(); | 2448 typename TypeSystem::Type type = this->EmptyType(); |
| 2398 if (scope_->typed() && Check(Token::COLON)) { // Braces required here. | 2449 if (scope_->typed() && Check(Token::COLON)) { // Braces required here. |
| 2399 type = ParseValidType(CHECK_OK); | 2450 type = ParseValidType(CHECK_OK); |
| 2400 } | 2451 } |
| 2401 USE(type); // TODO(nikolaos): really use it! | 2452 USE(type); // TODO(nikolaos): really use it! |
| 2402 | 2453 |
| 2454 // Skip initializers, for ambient declarations. |
| 2455 if (ambient) { |
| 2456 first_declaration = false; |
| 2457 continue; |
| 2458 } |
| 2459 |
| 2403 Scanner::Location variable_loc = scanner()->location(); | 2460 Scanner::Location variable_loc = scanner()->location(); |
| 2404 const AstRawString* single_name = | 2461 const AstRawString* single_name = |
| 2405 pattern->IsVariableProxy() ? pattern->AsVariableProxy()->raw_name() | 2462 pattern->IsVariableProxy() ? pattern->AsVariableProxy()->raw_name() |
| 2406 : nullptr; | 2463 : nullptr; |
| 2407 if (single_name != nullptr) { | 2464 if (single_name != nullptr) { |
| 2408 if (fni_ != NULL) fni_->PushVariableName(single_name); | 2465 if (fni_ != NULL) fni_->PushVariableName(single_name); |
| 2409 } | 2466 } |
| 2410 | 2467 |
| 2411 Expression* value = NULL; | 2468 Expression* value = NULL; |
| 2412 int initializer_position = RelocInfo::kNoPosition; | 2469 int initializer_position = RelocInfo::kNoPosition; |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2550 } | 2607 } |
| 2551 labels->Add(label, zone()); | 2608 labels->Add(label, zone()); |
| 2552 // Remove the "ghost" variable that turned out to be a label | 2609 // Remove the "ghost" variable that turned out to be a label |
| 2553 // from the top scope. This way, we don't try to resolve it | 2610 // from the top scope. This way, we don't try to resolve it |
| 2554 // during the scope processing. | 2611 // during the scope processing. |
| 2555 scope_->RemoveUnresolved(var); | 2612 scope_->RemoveUnresolved(var); |
| 2556 Expect(Token::COLON, CHECK_OK); | 2613 Expect(Token::COLON, CHECK_OK); |
| 2557 // ES#sec-labelled-function-declarations Labelled Function Declarations | 2614 // ES#sec-labelled-function-declarations Labelled Function Declarations |
| 2558 if (peek() == Token::FUNCTION && is_sloppy(language_mode())) { | 2615 if (peek() == Token::FUNCTION && is_sloppy(language_mode())) { |
| 2559 if (allow_function == kAllowLabelledFunctionStatement) { | 2616 if (allow_function == kAllowLabelledFunctionStatement) { |
| 2560 return ParseFunctionDeclaration(labels, ok); | 2617 return ParseFunctionDeclaration(labels, false, ok); |
| 2561 } else { | 2618 } else { |
| 2562 return ParseScopedStatement(labels, true, ok); | 2619 return ParseScopedStatement(labels, true, ok); |
| 2563 } | 2620 } |
| 2564 } | 2621 } |
| 2565 return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok); | 2622 return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok); |
| 2566 } | 2623 } |
| 2567 | 2624 |
| 2568 // If we have an extension, we allow a native function declaration. | 2625 // If we have an extension, we allow a native function declaration. |
| 2569 // A native function declaration starts with "native function" with | 2626 // A native function declaration starts with "native function" with |
| 2570 // no line-terminator between the two words. | 2627 // no line-terminator between the two words. |
| (...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3553 return ParseSubStatement(labels, kDisallowLabelledFunctionStatement, ok); | 3610 return ParseSubStatement(labels, kDisallowLabelledFunctionStatement, ok); |
| 3554 } else { | 3611 } else { |
| 3555 if (legacy) { | 3612 if (legacy) { |
| 3556 ++use_counts_[v8::Isolate::kLegacyFunctionDeclaration]; | 3613 ++use_counts_[v8::Isolate::kLegacyFunctionDeclaration]; |
| 3557 } | 3614 } |
| 3558 // Make a block around the statement for a lexical binding | 3615 // Make a block around the statement for a lexical binding |
| 3559 // is introduced by a FunctionDeclaration. | 3616 // is introduced by a FunctionDeclaration. |
| 3560 Scope* body_scope = NewScope(scope_, BLOCK_SCOPE); | 3617 Scope* body_scope = NewScope(scope_, BLOCK_SCOPE); |
| 3561 BlockState block_state(&scope_, body_scope); | 3618 BlockState block_state(&scope_, body_scope); |
| 3562 Block* block = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); | 3619 Block* block = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); |
| 3563 Statement* body = ParseFunctionDeclaration(NULL, CHECK_OK); | 3620 Statement* body = ParseFunctionDeclaration(NULL, false, CHECK_OK); |
| 3564 block->statements()->Add(body, zone()); | 3621 block->statements()->Add(body, zone()); |
| 3565 body_scope->set_end_position(scanner()->location().end_pos); | 3622 body_scope->set_end_position(scanner()->location().end_pos); |
| 3566 body_scope = body_scope->FinalizeBlockScope(); | 3623 body_scope = body_scope->FinalizeBlockScope(); |
| 3567 block->set_scope(body_scope); | 3624 block->set_scope(body_scope); |
| 3568 return block; | 3625 return block; |
| 3569 } | 3626 } |
| 3570 } | 3627 } |
| 3571 | 3628 |
| 3572 Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, | 3629 Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
| 3573 bool* ok) { | 3630 bool* ok) { |
| 3574 int stmt_pos = peek_position(); | 3631 int stmt_pos = peek_position(); |
| 3575 Statement* init = NULL; | 3632 Statement* init = NULL; |
| 3576 ZoneList<const AstRawString*> lexical_bindings(1, zone()); | 3633 ZoneList<const AstRawString*> lexical_bindings(1, zone()); |
| 3577 | 3634 |
| 3578 // Create an in-between scope for let-bound iteration variables. | 3635 // Create an in-between scope for let-bound iteration variables. |
| 3579 Scope* for_scope = NewScope(scope_, BLOCK_SCOPE); | 3636 Scope* for_scope = NewScope(scope_, BLOCK_SCOPE); |
| 3580 | 3637 |
| 3581 BlockState block_state(&scope_, for_scope); | 3638 BlockState block_state(&scope_, for_scope); |
| 3582 Expect(Token::FOR, CHECK_OK); | 3639 Expect(Token::FOR, CHECK_OK); |
| 3583 Expect(Token::LPAREN, CHECK_OK); | 3640 Expect(Token::LPAREN, CHECK_OK); |
| 3584 for_scope->set_start_position(scanner()->location().beg_pos); | 3641 for_scope->set_start_position(scanner()->location().beg_pos); |
| 3585 bool is_let_identifier_expression = false; | 3642 bool is_let_identifier_expression = false; |
| 3586 DeclarationParsingResult parsing_result; | 3643 DeclarationParsingResult parsing_result; |
| 3587 if (peek() != Token::SEMICOLON) { | 3644 if (peek() != Token::SEMICOLON) { |
| 3588 if (peek() == Token::VAR || (peek() == Token::CONST && allow_const()) || | 3645 if (peek() == Token::VAR || (peek() == Token::CONST && allow_const()) || |
| 3589 (peek() == Token::LET && IsNextLetKeyword())) { | 3646 (peek() == Token::LET && IsNextLetKeyword())) { |
| 3590 ParseVariableDeclarations(kForStatement, &parsing_result, nullptr, | 3647 ParseVariableDeclarations(kForStatement, &parsing_result, nullptr, false, |
| 3591 CHECK_OK); | 3648 CHECK_OK); |
| 3592 | 3649 |
| 3593 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE; | 3650 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE; |
| 3594 int each_beg_pos = scanner()->location().beg_pos; | 3651 int each_beg_pos = scanner()->location().beg_pos; |
| 3595 int each_end_pos = scanner()->location().end_pos; | 3652 int each_end_pos = scanner()->location().end_pos; |
| 3596 | 3653 |
| 3597 if (CheckInOrOf(&mode, ok)) { | 3654 if (CheckInOrOf(&mode, ok)) { |
| 3598 if (!*ok) return nullptr; | 3655 if (!*ok) return nullptr; |
| 3599 if (parsing_result.declarations.length() != 1) { | 3656 if (parsing_result.declarations.length() != 1) { |
| 3600 ParserTraits::ReportMessageAt( | 3657 ParserTraits::ReportMessageAt( |
| (...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4218 | 4275 |
| 4219 // Parse optional type annotation. | 4276 // Parse optional type annotation. |
| 4220 typename TypeSystem::Type result_type = this->EmptyType(); | 4277 typename TypeSystem::Type result_type = this->EmptyType(); |
| 4221 if (scope_->typed() && | 4278 if (scope_->typed() && |
| 4222 !(type_flags & typesystem::kDisallowTypeAnnotation) && | 4279 !(type_flags & typesystem::kDisallowTypeAnnotation) && |
| 4223 Check(Token::COLON)) { // Braces required here. | 4280 Check(Token::COLON)) { // Braces required here. |
| 4224 result_type = ParseValidType(CHECK_OK); | 4281 result_type = ParseValidType(CHECK_OK); |
| 4225 } | 4282 } |
| 4226 USE(result_type); // TODO(nikolaos): really use it! | 4283 USE(result_type); // TODO(nikolaos): really use it! |
| 4227 | 4284 |
| 4228 // Allow for a function signature (i.e., a literal without body). | 4285 // Allow or even enforce a function signature (i.e., literal without body), |
| 4229 // In that case, return a nullptr instead of a function literal. | 4286 // In that case, return a nullptr instead of a function literal. |
| 4230 if (peek() != Token::LBRACE && scope_->typed() && | 4287 if ((type_flags & typesystem::kDisallowBody) || |
| 4231 (type_flags & typesystem::kAllowSignature)) { | 4288 (peek() != Token::LBRACE && scope_->typed() && |
| 4289 (type_flags & typesystem::kAllowSignature))) { |
| 4232 ExpectSemicolon(CHECK_OK); | 4290 ExpectSemicolon(CHECK_OK); |
| 4233 return nullptr; | 4291 return nullptr; |
| 4234 } | 4292 } |
| 4235 | 4293 |
| 4236 Expect(Token::LBRACE, CHECK_OK); | 4294 Expect(Token::LBRACE, CHECK_OK); |
| 4237 | 4295 |
| 4238 // Don't include the rest parameter into the function's formal parameter | 4296 // Don't include the rest parameter into the function's formal parameter |
| 4239 // count (esp. the SharedFunctionInfo::internal_formal_parameter_count, | 4297 // count (esp. the SharedFunctionInfo::internal_formal_parameter_count, |
| 4240 // which says whether we need to create an arguments adaptor frame). | 4298 // which says whether we need to create an arguments adaptor frame). |
| 4241 if (formals.has_rest) arity--; | 4299 if (formals.has_rest) arity--; |
| (...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4800 if (pre_parse_timer_ != NULL) { | 4858 if (pre_parse_timer_ != NULL) { |
| 4801 pre_parse_timer_->Stop(); | 4859 pre_parse_timer_->Stop(); |
| 4802 } | 4860 } |
| 4803 return result; | 4861 return result; |
| 4804 } | 4862 } |
| 4805 | 4863 |
| 4806 | 4864 |
| 4807 ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, | 4865 ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, |
| 4808 Scanner::Location class_name_location, | 4866 Scanner::Location class_name_location, |
| 4809 bool name_is_strict_reserved, int pos, | 4867 bool name_is_strict_reserved, int pos, |
| 4810 bool* ok) { | 4868 bool ambient, bool* ok) { |
| 4811 // All parts of a ClassDeclaration and ClassExpression are strict code. | 4869 // All parts of a ClassDeclaration and ClassExpression are strict code. |
| 4812 if (name_is_strict_reserved) { | 4870 if (name_is_strict_reserved) { |
| 4813 ReportMessageAt(class_name_location, | 4871 ReportMessageAt(class_name_location, |
| 4814 MessageTemplate::kUnexpectedStrictReserved); | 4872 MessageTemplate::kUnexpectedStrictReserved); |
| 4815 *ok = false; | 4873 *ok = false; |
| 4816 return NULL; | 4874 return NULL; |
| 4817 } | 4875 } |
| 4818 if (IsEvalOrArguments(name)) { | 4876 if (IsEvalOrArguments(name)) { |
| 4819 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); | 4877 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); |
| 4820 *ok = false; | 4878 *ok = false; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4887 if (Check(Token::SEMICOLON)) continue; | 4945 if (Check(Token::SEMICOLON)) continue; |
| 4888 FuncNameInferrer::State fni_state(fni_); | 4946 FuncNameInferrer::State fni_state(fni_); |
| 4889 const bool in_class = true; | 4947 const bool in_class = true; |
| 4890 const bool is_static = false; | 4948 const bool is_static = false; |
| 4891 bool is_computed_name = false; // Classes do not care about computed | 4949 bool is_computed_name = false; // Classes do not care about computed |
| 4892 // property names here. | 4950 // property names here. |
| 4893 ExpressionClassifier classifier(this); | 4951 ExpressionClassifier classifier(this); |
| 4894 const AstRawString* property_name = nullptr; | 4952 const AstRawString* property_name = nullptr; |
| 4895 ObjectLiteral::Property* property = ParsePropertyDefinition( | 4953 ObjectLiteral::Property* property = ParsePropertyDefinition( |
| 4896 &checker, in_class, has_extends, is_static, &is_computed_name, | 4954 &checker, in_class, has_extends, is_static, &is_computed_name, |
| 4897 &has_seen_constructor, &classifier, &property_name, CHECK_OK); | 4955 &has_seen_constructor, &classifier, &property_name, ambient, CHECK_OK); |
| 4898 // Ignore member variable declarations in typed mode. | 4956 // Ignore member variable declarations, method signatures and members of |
| 4957 // ambients in typed mode. |
| 4899 if (property == nullptr) continue; | 4958 if (property == nullptr) continue; |
| 4900 RewriteNonPattern(&classifier, CHECK_OK); | 4959 RewriteNonPattern(&classifier, CHECK_OK); |
| 4901 | 4960 |
| 4902 if (has_seen_constructor && constructor == NULL) { | 4961 if (has_seen_constructor && constructor == NULL) { |
| 4903 constructor = GetPropertyValue(property)->AsFunctionLiteral(); | 4962 constructor = GetPropertyValue(property)->AsFunctionLiteral(); |
| 4904 DCHECK_NOT_NULL(constructor); | 4963 DCHECK_NOT_NULL(constructor); |
| 4905 constructor->set_raw_name( | 4964 constructor->set_raw_name( |
| 4906 name != nullptr ? name : ast_value_factory()->empty_string()); | 4965 name != nullptr ? name : ast_value_factory()->empty_string()); |
| 4907 } else { | 4966 } else { |
| 4908 properties->Add(property, zone()); | 4967 properties->Add(property, zone()); |
| (...skipping 2098 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7007 try_block, target); | 7066 try_block, target); |
| 7008 final_loop = target; | 7067 final_loop = target; |
| 7009 } | 7068 } |
| 7010 | 7069 |
| 7011 return final_loop; | 7070 return final_loop; |
| 7012 } | 7071 } |
| 7013 | 7072 |
| 7014 | 7073 |
| 7015 } // namespace internal | 7074 } // namespace internal |
| 7016 } // namespace v8 | 7075 } // namespace v8 |
| OLD | NEW |