OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1525 parser->set_allow_harmony_sloppy_let(flags.Contains(kAllowHarmonySloppyLet)); | 1525 parser->set_allow_harmony_sloppy_let(flags.Contains(kAllowHarmonySloppyLet)); |
1526 parser->set_allow_harmony_destructuring( | 1526 parser->set_allow_harmony_destructuring( |
1527 flags.Contains(kAllowHarmonyDestructuring)); | 1527 flags.Contains(kAllowHarmonyDestructuring)); |
1528 parser->set_allow_strong_mode(flags.Contains(kAllowStrongMode)); | 1528 parser->set_allow_strong_mode(flags.Contains(kAllowStrongMode)); |
1529 parser->set_allow_legacy_const(!flags.Contains(kNoLegacyConst)); | 1529 parser->set_allow_legacy_const(!flags.Contains(kNoLegacyConst)); |
1530 } | 1530 } |
1531 | 1531 |
1532 | 1532 |
1533 void TestParserSyncWithFlags(i::Handle<i::String> source, | 1533 void TestParserSyncWithFlags(i::Handle<i::String> source, |
1534 i::EnumSet<ParserFlag> flags, | 1534 i::EnumSet<ParserFlag> flags, |
1535 ParserSyncTestResult result) { | 1535 ParserSyncTestResult result, |
1536 bool is_module = false) { | |
1536 i::Isolate* isolate = CcTest::i_isolate(); | 1537 i::Isolate* isolate = CcTest::i_isolate(); |
1537 i::Factory* factory = isolate->factory(); | 1538 i::Factory* factory = isolate->factory(); |
1538 | 1539 |
1539 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); | 1540 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); |
1540 int preparser_materialized_literals = -1; | 1541 int preparser_materialized_literals = -1; |
1541 int parser_materialized_literals = -2; | 1542 int parser_materialized_literals = -2; |
1542 | 1543 |
1543 // Preparse the data. | 1544 // Preparse the data. |
1544 i::CompleteParserRecorder log; | 1545 i::CompleteParserRecorder log; |
1545 { | 1546 if (!is_module) { |
adamk
2015/11/04 23:42:02
Please add something of this form to make this cle
caitp (gmail)
2015/11/06 19:08:06
Done.
| |
1546 i::Scanner scanner(isolate->unicode_cache()); | 1547 i::Scanner scanner(isolate->unicode_cache()); |
1547 i::GenericStringUtf16CharacterStream stream(source, 0, source->length()); | 1548 i::GenericStringUtf16CharacterStream stream(source, 0, source->length()); |
1548 i::Zone zone; | 1549 i::Zone zone; |
1549 i::AstValueFactory ast_value_factory( | 1550 i::AstValueFactory ast_value_factory( |
1550 &zone, CcTest::i_isolate()->heap()->HashSeed()); | 1551 &zone, CcTest::i_isolate()->heap()->HashSeed()); |
1551 i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log, | 1552 i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log, |
1552 stack_limit); | 1553 stack_limit); |
1553 SetParserFlags(&preparser, flags); | 1554 SetParserFlags(&preparser, flags); |
1554 scanner.Initialize(&stream); | 1555 scanner.Initialize(&stream); |
1555 i::PreParser::PreParseResult result = preparser.PreParseProgram( | 1556 i::PreParser::PreParseResult result = preparser.PreParseProgram( |
1556 &preparser_materialized_literals); | 1557 &preparser_materialized_literals); |
1557 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 1558 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
1558 } | 1559 } |
1559 | |
1560 bool preparse_error = log.HasError(); | 1560 bool preparse_error = log.HasError(); |
1561 | 1561 |
1562 // Parse the data | 1562 // Parse the data |
1563 i::FunctionLiteral* function; | 1563 i::FunctionLiteral* function; |
1564 { | 1564 { |
1565 i::Handle<i::Script> script = factory->NewScript(source); | 1565 i::Handle<i::Script> script = factory->NewScript(source); |
1566 i::Zone zone; | 1566 i::Zone zone; |
1567 i::ParseInfo info(&zone, script); | 1567 i::ParseInfo info(&zone, script); |
1568 i::Parser parser(&info); | 1568 i::Parser parser(&info); |
1569 SetParserFlags(&parser, flags); | 1569 SetParserFlags(&parser, flags); |
1570 info.set_global(); | 1570 if (is_module) { |
1571 info.set_module(); | |
1572 } else { | |
1573 info.set_global(); | |
1574 } | |
1571 parser.Parse(&info); | 1575 parser.Parse(&info); |
1572 function = info.literal(); | 1576 function = info.literal(); |
1573 if (function) { | 1577 if (function) { |
1574 parser_materialized_literals = function->materialized_literal_count(); | 1578 parser_materialized_literals = function->materialized_literal_count(); |
1575 } | 1579 } |
1576 } | 1580 } |
1577 | 1581 |
1578 // Check that preparsing fails iff parsing fails. | 1582 // Check that preparsing fails iff parsing fails. |
1579 if (function == NULL) { | 1583 if (function == NULL) { |
1580 // Extract exception from the parser. | 1584 // Extract exception from the parser. |
1581 CHECK(isolate->has_pending_exception()); | 1585 CHECK(isolate->has_pending_exception()); |
1582 i::Handle<i::JSObject> exception_handle( | 1586 i::Handle<i::JSObject> exception_handle( |
1583 i::JSObject::cast(isolate->pending_exception())); | 1587 i::JSObject::cast(isolate->pending_exception())); |
1584 i::Handle<i::String> message_string = | 1588 i::Handle<i::String> message_string = |
1585 i::Handle<i::String>::cast(i::Object::GetProperty( | 1589 i::Handle<i::String>::cast(i::Object::GetProperty( |
1586 isolate, exception_handle, "message").ToHandleChecked()); | 1590 isolate, exception_handle, "message").ToHandleChecked()); |
1587 | 1591 |
1588 if (result == kSuccess) { | 1592 if (result == kSuccess) { |
1589 v8::base::OS::Print( | 1593 v8::base::OS::Print( |
1590 "Parser failed on:\n" | 1594 "Parser failed on:\n" |
1591 "\t%s\n" | 1595 "\t%s\n" |
1592 "with error:\n" | 1596 "with error:\n" |
1593 "\t%s\n" | 1597 "\t%s\n" |
1594 "However, we expected no error.", | 1598 "However, we expected no error.", |
1595 source->ToCString().get(), message_string->ToCString().get()); | 1599 source->ToCString().get(), message_string->ToCString().get()); |
1596 CHECK(false); | 1600 CHECK(false); |
1597 } | 1601 } |
1598 | 1602 |
1599 if (!preparse_error) { | 1603 if (!is_module && !preparse_error) { |
adamk
2015/11/04 23:42:02
and then use it here too
| |
1600 v8::base::OS::Print( | 1604 v8::base::OS::Print( |
1601 "Parser failed on:\n" | 1605 "Parser failed on:\n" |
1602 "\t%s\n" | 1606 "\t%s\n" |
1603 "with error:\n" | 1607 "with error:\n" |
1604 "\t%s\n" | 1608 "\t%s\n" |
1605 "However, the preparser succeeded", | 1609 "However, the preparser succeeded", |
1606 source->ToCString().get(), message_string->ToCString().get()); | 1610 source->ToCString().get(), message_string->ToCString().get()); |
1607 CHECK(false); | 1611 CHECK(false); |
1608 } | 1612 } |
1609 // Check that preparser and parser produce the same error. | 1613 // Check that preparser and parser produce the same error. |
1610 i::Handle<i::String> preparser_message = | 1614 if (!is_module) { |
adamk
2015/11/04 23:42:02
and here
| |
1611 FormatMessage(log.ErrorMessageData()); | 1615 i::Handle<i::String> preparser_message = |
1612 if (!i::String::Equals(message_string, preparser_message)) { | 1616 FormatMessage(log.ErrorMessageData()); |
1613 v8::base::OS::Print( | 1617 if (!i::String::Equals(message_string, preparser_message)) { |
1614 "Expected parser and preparser to produce the same error on:\n" | 1618 v8::base::OS::Print( |
1615 "\t%s\n" | 1619 "Expected parser and preparser to produce the same error on:\n" |
1616 "However, found the following error messages\n" | 1620 "\t%s\n" |
1617 "\tparser: %s\n" | 1621 "However, found the following error messages\n" |
1618 "\tpreparser: %s\n", | 1622 "\tparser: %s\n" |
1619 source->ToCString().get(), | 1623 "\tpreparser: %s\n", |
1620 message_string->ToCString().get(), | 1624 source->ToCString().get(), message_string->ToCString().get(), |
1621 preparser_message->ToCString().get()); | 1625 preparser_message->ToCString().get()); |
1622 CHECK(false); | 1626 CHECK(false); |
1627 } | |
1623 } | 1628 } |
1624 } else if (preparse_error) { | 1629 } else if (!is_module && preparse_error) { |
adamk
2015/11/04 23:42:02
and here
| |
1625 v8::base::OS::Print( | 1630 v8::base::OS::Print( |
1626 "Preparser failed on:\n" | 1631 "Preparser failed on:\n" |
1627 "\t%s\n" | 1632 "\t%s\n" |
1628 "with error:\n" | 1633 "with error:\n" |
1629 "\t%s\n" | 1634 "\t%s\n" |
1630 "However, the parser succeeded", | 1635 "However, the parser succeeded", |
1631 source->ToCString().get(), | 1636 source->ToCString().get(), |
1632 FormatMessage(log.ErrorMessageData())->ToCString().get()); | 1637 FormatMessage(log.ErrorMessageData())->ToCString().get()); |
1633 CHECK(false); | 1638 CHECK(false); |
1634 } else if (result == kError) { | 1639 } else if (result == kError) { |
1635 v8::base::OS::Print( | 1640 v8::base::OS::Print( |
1636 "Expected error on:\n" | 1641 "Expected error on:\n" |
1637 "\t%s\n" | 1642 "\t%s\n" |
1638 "However, parser and preparser succeeded", | 1643 "However, parser and preparser succeeded", |
1639 source->ToCString().get()); | 1644 source->ToCString().get()); |
1640 CHECK(false); | 1645 CHECK(false); |
1641 } else if (preparser_materialized_literals != parser_materialized_literals) { | 1646 } else if (!is_module && |
adamk
2015/11/04 23:42:02
and here
| |
1647 preparser_materialized_literals != parser_materialized_literals) { | |
1642 v8::base::OS::Print( | 1648 v8::base::OS::Print( |
1643 "Preparser materialized literals (%d) differ from Parser materialized " | 1649 "Preparser materialized literals (%d) differ from Parser materialized " |
1644 "literals (%d) on:\n" | 1650 "literals (%d) on:\n" |
1645 "\t%s\n" | 1651 "\t%s\n" |
1646 "However, parser and preparser succeeded", | 1652 "However, parser and preparser succeeded", |
1647 preparser_materialized_literals, parser_materialized_literals, | 1653 preparser_materialized_literals, parser_materialized_literals, |
1648 source->ToCString().get()); | 1654 source->ToCString().get()); |
1649 CHECK(false); | 1655 CHECK(false); |
1650 } | 1656 } |
1651 } | 1657 } |
1652 | 1658 |
1653 | 1659 |
1654 void TestParserSync(const char* source, | 1660 void TestParserSync(const char* source, const ParserFlag* varying_flags, |
1655 const ParserFlag* varying_flags, | |
1656 size_t varying_flags_length, | 1661 size_t varying_flags_length, |
1657 ParserSyncTestResult result = kSuccessOrError, | 1662 ParserSyncTestResult result = kSuccessOrError, |
1658 const ParserFlag* always_true_flags = NULL, | 1663 const ParserFlag* always_true_flags = NULL, |
1659 size_t always_true_flags_length = 0, | 1664 size_t always_true_flags_length = 0, |
1660 const ParserFlag* always_false_flags = NULL, | 1665 const ParserFlag* always_false_flags = NULL, |
1661 size_t always_false_flags_length = 0) { | 1666 size_t always_false_flags_length = 0, |
1667 bool is_module = false) { | |
1662 i::Handle<i::String> str = | 1668 i::Handle<i::String> str = |
1663 CcTest::i_isolate()->factory()->NewStringFromAsciiChecked(source); | 1669 CcTest::i_isolate()->factory()->NewStringFromAsciiChecked(source); |
1664 for (int bits = 0; bits < (1 << varying_flags_length); bits++) { | 1670 for (int bits = 0; bits < (1 << varying_flags_length); bits++) { |
1665 i::EnumSet<ParserFlag> flags; | 1671 i::EnumSet<ParserFlag> flags; |
1666 for (size_t flag_index = 0; flag_index < varying_flags_length; | 1672 for (size_t flag_index = 0; flag_index < varying_flags_length; |
1667 ++flag_index) { | 1673 ++flag_index) { |
1668 if ((bits & (1 << flag_index)) != 0) flags.Add(varying_flags[flag_index]); | 1674 if ((bits & (1 << flag_index)) != 0) flags.Add(varying_flags[flag_index]); |
1669 } | 1675 } |
1670 for (size_t flag_index = 0; flag_index < always_true_flags_length; | 1676 for (size_t flag_index = 0; flag_index < always_true_flags_length; |
1671 ++flag_index) { | 1677 ++flag_index) { |
1672 flags.Add(always_true_flags[flag_index]); | 1678 flags.Add(always_true_flags[flag_index]); |
1673 } | 1679 } |
1674 for (size_t flag_index = 0; flag_index < always_false_flags_length; | 1680 for (size_t flag_index = 0; flag_index < always_false_flags_length; |
1675 ++flag_index) { | 1681 ++flag_index) { |
1676 flags.Remove(always_false_flags[flag_index]); | 1682 flags.Remove(always_false_flags[flag_index]); |
1677 } | 1683 } |
1678 TestParserSyncWithFlags(str, flags, result); | 1684 TestParserSyncWithFlags(str, flags, result, is_module); |
1679 } | 1685 } |
1680 } | 1686 } |
1681 | 1687 |
1682 | 1688 |
1683 TEST(ParserSync) { | 1689 TEST(ParserSync) { |
1684 const char* context_data[][2] = { | 1690 const char* context_data[][2] = { |
1685 { "", "" }, | 1691 { "", "" }, |
1686 { "{", "}" }, | 1692 { "{", "}" }, |
1687 { "if (true) ", " else {}" }, | 1693 { "if (true) ", " else {}" }, |
1688 { "if (true) {} else ", "" }, | 1694 { "if (true) {} else ", "" }, |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1812 v8::String::Utf8Value exception(try_catch.Exception()); | 1818 v8::String::Utf8Value exception(try_catch.Exception()); |
1813 CHECK_EQ(0, | 1819 CHECK_EQ(0, |
1814 strcmp("SyntaxError: Octal literals are not allowed in strict mode.", | 1820 strcmp("SyntaxError: Octal literals are not allowed in strict mode.", |
1815 *exception)); | 1821 *exception)); |
1816 } | 1822 } |
1817 | 1823 |
1818 | 1824 |
1819 void RunParserSyncTest(const char* context_data[][2], | 1825 void RunParserSyncTest(const char* context_data[][2], |
1820 const char* statement_data[], | 1826 const char* statement_data[], |
1821 ParserSyncTestResult result, | 1827 ParserSyncTestResult result, |
1822 const ParserFlag* flags = NULL, | 1828 const ParserFlag* flags = NULL, int flags_len = 0, |
1823 int flags_len = 0, | |
1824 const ParserFlag* always_true_flags = NULL, | 1829 const ParserFlag* always_true_flags = NULL, |
1825 int always_true_len = 0, | 1830 int always_true_len = 0, |
1826 const ParserFlag* always_false_flags = NULL, | 1831 const ParserFlag* always_false_flags = NULL, |
1827 int always_false_len = 0) { | 1832 int always_false_len = 0, bool is_module = false) { |
1828 v8::HandleScope handles(CcTest::isolate()); | 1833 v8::HandleScope handles(CcTest::isolate()); |
1829 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate()); | 1834 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate()); |
1830 v8::Context::Scope context_scope(context); | 1835 v8::Context::Scope context_scope(context); |
1831 | 1836 |
1832 CcTest::i_isolate()->stack_guard()->SetStackLimit( | 1837 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
1833 i::GetCurrentStackPosition() - 128 * 1024); | 1838 i::GetCurrentStackPosition() - 128 * 1024); |
1834 | 1839 |
1835 // Experimental feature flags should not go here; pass the flags as | 1840 // Experimental feature flags should not go here; pass the flags as |
1836 // always_true_flags if the test needs them. | 1841 // always_true_flags if the test needs them. |
1837 static const ParserFlag default_flags[] = { | 1842 static const ParserFlag default_flags[] = { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1870 int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; | 1875 int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; |
1871 | 1876 |
1872 // Plug the source code pieces together. | 1877 // Plug the source code pieces together. |
1873 i::ScopedVector<char> program(kProgramSize + 1); | 1878 i::ScopedVector<char> program(kProgramSize + 1); |
1874 int length = i::SNPrintF(program, | 1879 int length = i::SNPrintF(program, |
1875 "%s%s%s", | 1880 "%s%s%s", |
1876 context_data[i][0], | 1881 context_data[i][0], |
1877 statement_data[j], | 1882 statement_data[j], |
1878 context_data[i][1]); | 1883 context_data[i][1]); |
1879 CHECK(length == kProgramSize); | 1884 CHECK(length == kProgramSize); |
1880 TestParserSync(program.start(), | 1885 TestParserSync(program.start(), flags, flags_len, result, |
1881 flags, | 1886 always_true_flags, always_true_len, always_false_flags, |
1882 flags_len, | 1887 always_false_len, is_module); |
1883 result, | |
1884 always_true_flags, | |
1885 always_true_len, | |
1886 always_false_flags, | |
1887 always_false_len); | |
1888 } | 1888 } |
1889 } | 1889 } |
1890 delete[] generated_flags; | 1890 delete[] generated_flags; |
1891 } | 1891 } |
1892 | 1892 |
1893 | 1893 |
1894 void RunModuleParserSyncTest(const char* context_data[][2], | |
1895 const char* statement_data[], | |
1896 ParserSyncTestResult result, | |
1897 const ParserFlag* flags = NULL, int flags_len = 0, | |
1898 const ParserFlag* always_true_flags = NULL, | |
1899 int always_true_len = 0, | |
1900 const ParserFlag* always_false_flags = NULL, | |
1901 int always_false_len = 0) { | |
1902 bool flag = i::FLAG_harmony_modules; | |
1903 i::FLAG_harmony_modules = true; | |
1904 RunParserSyncTest(context_data, statement_data, result, flags, flags_len, | |
1905 always_true_flags, always_true_len, always_false_flags, | |
1906 always_false_len, true); | |
1907 i::FLAG_harmony_modules = flag; | |
1908 } | |
1909 | |
1910 | |
1894 TEST(ErrorsEvalAndArguments) { | 1911 TEST(ErrorsEvalAndArguments) { |
1895 // Tests that both preparsing and parsing produce the right kind of errors for | 1912 // Tests that both preparsing and parsing produce the right kind of errors for |
1896 // using "eval" and "arguments" as identifiers. Without the strict mode, it's | 1913 // using "eval" and "arguments" as identifiers. Without the strict mode, it's |
1897 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it | 1914 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it |
1898 // isn't. | 1915 // isn't. |
1899 const char* context_data[][2] = { | 1916 const char* context_data[][2] = { |
1900 {"\"use strict\";", ""}, | 1917 {"\"use strict\";", ""}, |
1901 {"\"use strong\";", ""}, | 1918 {"\"use strong\";", ""}, |
1902 {"var eval; function test_func() {\"use strict\"; ", "}"}, | 1919 {"var eval; function test_func() {\"use strict\"; ", "}"}, |
1903 {"var eval; function test_func() {\"use strong\"; ", "}"}, | 1920 {"var eval; function test_func() {\"use strong\"; ", "}"}, |
(...skipping 5324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7228 NULL | 7245 NULL |
7229 }; | 7246 }; |
7230 // clang-format on | 7247 // clang-format on |
7231 | 7248 |
7232 static const ParserFlag fail_flags[] = { | 7249 static const ParserFlag fail_flags[] = { |
7233 kAllowHarmonySloppy, kAllowHarmonySloppyLet, kNoLegacyConst, | 7250 kAllowHarmonySloppy, kAllowHarmonySloppyLet, kNoLegacyConst, |
7234 kAllowHarmonyDestructuring}; | 7251 kAllowHarmonyDestructuring}; |
7235 RunParserSyncTest(context_data, fail_data, kError, NULL, 0, fail_flags, | 7252 RunParserSyncTest(context_data, fail_data, kError, NULL, 0, fail_flags, |
7236 arraysize(fail_flags)); | 7253 arraysize(fail_flags)); |
7237 } | 7254 } |
7255 | |
7256 | |
7257 TEST(EscapedKeywords) { | |
7258 // clang-format off | |
7259 const char* sloppy_context_data[][2] = { | |
7260 {"", ""}, | |
7261 {NULL, NULL} | |
7262 }; | |
7263 | |
7264 const char* strict_context_data[][2] = { | |
7265 {"'use strict';", ""}, | |
7266 {NULL, NULL} | |
7267 }; | |
7268 | |
7269 const char* fail_data[] = { | |
7270 "for (var i = 0; i < 100; ++i) { br\\u0065ak; }", | |
7271 "cl\\u0061ss Foo {}", | |
7272 "var x = cl\\u0061ss {}", | |
7273 "\\u0063onst foo = 1;", | |
7274 "while (i < 10) { if (i++ & 1) c\\u006fntinue; this.x++; }", | |
7275 "d\\u0065bugger;", | |
7276 "d\\u0065lete this.a;", | |
7277 "\\u0063o { } while(0)", | |
7278 "if (d\\u006f { true }) {}", | |
7279 "if (false) { this.a = 1; } \\u0065lse { this.b = 1; }", | |
7280 "e\\u0078port var foo;", | |
7281 "try { } catch (e) {} f\\u0069nally { }", | |
7282 "f\\u006fr (var i = 0; i < 10; ++i);", | |
7283 "f\\u0075nction fn() {}", | |
7284 "var f = f\\u0075nction() {}", | |
7285 "\\u0069f (true) { }", | |
7286 "\\u0069mport blah from './foo.js';", | |
7287 "n\\u0065w function f() {}", | |
7288 "(function() { r\\u0065turn; })()", | |
7289 "class C extends function() {} { constructor() { sup\\u0065r() } }", | |
7290 "class C extends function() {} { constructor() { sup\\u0065r.a = 1 } }", | |
7291 "sw\\u0069tch (this.a) {}", | |
7292 "var x = th\\u0069s;", | |
7293 "th\\u0069s.a = 1;", | |
7294 "thr\\u006fw 'boo';", | |
7295 "t\\u0072y { true } catch (e) {}", | |
7296 "var x = typ\\u0065of 'blah'", | |
7297 "v\\u0061r a = true", | |
7298 "var v\\u0061r = true", | |
7299 "(function() { return v\\u006fid 0; })()", | |
7300 "wh\\u0069le (true) { }", | |
7301 "w\\u0069th (this.scope) { }", | |
7302 "(function*() { y\\u0069eld 1; })()", | |
7303 | |
7304 "var \\u0065num = 1;", | |
7305 "var { \\u0065num } = {}", | |
7306 "(\\u0065num = 1);", | |
7307 | |
7308 // Null / Boolean literals | |
7309 "(x === n\\u0075ll);", | |
7310 "var x = n\\u0075ll;", | |
7311 "var n\\u0075ll = 1;", | |
7312 "var { n\\u0075ll } = { 1 };", | |
7313 "n\\u0075ll = 1;", | |
7314 "(x === tr\\u0075e);", | |
7315 "var x = tr\\u0075e;", | |
7316 "var tr\\u0075e = 1;", | |
7317 "var { tr\\u0075e } = {};", | |
7318 "tr\\u0075e = 1;", | |
7319 "(x === f\\u0061lse);", | |
7320 "var x = f\\u0061lse;", | |
7321 "var f\\u0061lse = 1;", | |
7322 "var { f\\u0061lse } = {};", | |
7323 "f\\u0061lse = 1;", | |
7324 | |
7325 // TODO(caitp): consistent error messages for labeled statements and | |
7326 // expressions | |
7327 "switch (this.a) { c\\u0061se 6: break; }", | |
7328 "try { } c\\u0061tch (e) {}", | |
7329 "switch (this.a) { d\\u0065fault: break; }", | |
7330 "class C \\u0065xtends function B() {} {}", | |
7331 "for (var a i\\u006e this) {}", | |
7332 "if ('foo' \\u0069n this) {}", | |
7333 "if (this \\u0069nstanceof Array) {}", | |
7334 "(n\\u0065w function f() {})", | |
7335 "(typ\\u0065of 123)", | |
7336 "(v\\u006fid 0)", | |
7337 "do { ; } wh\\u0069le (true) { }", | |
7338 "(function*() { return (n++, y\\u0069eld 1); })()", | |
7339 "class C { st\\u0061tic bar() {} }", | |
7340 | |
7341 "(y\\u0069eld);", | |
7342 "var y\\u0069eld = 1;", | |
7343 "var { y\\u0069eld } = {};", | |
7344 NULL | |
7345 }; | |
7346 // clang-format on | |
7347 | |
7348 static const ParserFlag always_flags[] = {kAllowHarmonySloppy, | |
7349 kAllowHarmonyDestructuring}; | |
7350 RunParserSyncTest(sloppy_context_data, fail_data, kError, NULL, 0, | |
7351 always_flags, arraysize(always_flags)); | |
7352 RunParserSyncTest(strict_context_data, fail_data, kError, NULL, 0, | |
7353 always_flags, arraysize(always_flags)); | |
7354 RunModuleParserSyncTest(sloppy_context_data, fail_data, kError, NULL, 0, | |
7355 always_flags, arraysize(always_flags)); | |
7356 | |
7357 // clang-format off | |
7358 const char* let_data[] = { | |
7359 "var l\\u0065t = 1;", | |
7360 "l\\u0065t = 1;", | |
7361 "(l\\u0065t === 1);", | |
7362 NULL | |
7363 }; | |
7364 // clang-format on | |
7365 | |
7366 RunParserSyncTest(sloppy_context_data, let_data, kError, NULL, 0, | |
7367 always_flags, arraysize(always_flags)); | |
7368 RunParserSyncTest(strict_context_data, let_data, kError, NULL, 0, | |
7369 always_flags, arraysize(always_flags)); | |
7370 | |
7371 static const ParserFlag sloppy_let_flags[] = { | |
7372 kAllowHarmonySloppy, kAllowHarmonySloppyLet, kAllowHarmonyDestructuring}; | |
7373 RunParserSyncTest(sloppy_context_data, let_data, kError, NULL, 0, | |
7374 sloppy_let_flags, arraysize(sloppy_let_flags)); | |
7375 | |
7376 // Non-errors in sloppy mode | |
7377 const char* valid_data[] = {"(\\u0069mplements = 1);", | |
7378 "var impl\\u0065ments = 1;", | |
7379 "var { impl\\u0065ments } = {};", | |
7380 "(\\u0069nterface = 1);", | |
7381 "var int\\u0065rface = 1;", | |
7382 "var { int\\u0065rface } = {};", | |
7383 "(p\\u0061ckage = 1);", | |
7384 "var packa\\u0067e = 1;", | |
7385 "var { packa\\u0067e } = {};", | |
7386 "(p\\u0072ivate = 1);", | |
7387 "var p\\u0072ivate;", | |
7388 "var { p\\u0072ivate } = {};", | |
7389 "(prot\\u0065cted);", | |
7390 "var prot\\u0065cted = 1;", | |
7391 "var { prot\\u0065cted } = {};", | |
7392 "(publ\\u0069c);", | |
7393 "var publ\\u0069c = 1;", | |
7394 "var { publ\\u0069c } = {};", | |
7395 NULL}; | |
7396 RunParserSyncTest(sloppy_context_data, valid_data, kSuccess, NULL, 0, | |
7397 always_flags, arraysize(always_flags)); | |
7398 RunParserSyncTest(strict_context_data, valid_data, kError, NULL, 0, | |
7399 always_flags, arraysize(always_flags)); | |
7400 RunModuleParserSyncTest(strict_context_data, valid_data, kError, NULL, 0, | |
7401 always_flags, arraysize(always_flags)); | |
7402 } | |
OLD | NEW |