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 1640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1651 "var interface;", | 1651 "var interface;", |
1652 "var foo, interface;", | 1652 "var foo, interface;", |
1653 "try { } catch (interface) { }", | 1653 "try { } catch (interface) { }", |
1654 "function interface() { }", | 1654 "function interface() { }", |
1655 "function foo(interface) { }", | 1655 "function foo(interface) { }", |
1656 "function foo(bar, interface) { }", | 1656 "function foo(bar, interface) { }", |
1657 "interface = 1;", | 1657 "interface = 1;", |
1658 "var foo = interface = 1;", | 1658 "var foo = interface = 1;", |
1659 "++interface;", | 1659 "++interface;", |
1660 "interface++;", | 1660 "interface++;", |
1661 "var yield = 13;", | |
1661 NULL | 1662 NULL |
1662 }; | 1663 }; |
1663 | 1664 |
1664 RunParserSyncTest(context_data, statement_data, kError); | 1665 RunParserSyncTest(context_data, statement_data, kError); |
1665 } | 1666 } |
1666 | 1667 |
1667 | 1668 |
1668 TEST(NoErrorsFutureStrictReservedWords) { | 1669 TEST(NoErrorsFutureStrictReservedWords) { |
1669 const char* context_data[][2] = { | 1670 const char* context_data[][2] = { |
1670 { "", "" }, | 1671 { "", "" }, |
1671 { "function test_func() {", "}"}, | 1672 { "function test_func() {", "}"}, |
1672 { NULL, NULL } | 1673 { NULL, NULL } |
1673 }; | 1674 }; |
1674 | 1675 |
1675 const char* statement_data[] = { | 1676 const char* statement_data[] = { |
1676 "var interface;", | 1677 "var interface;", |
1677 "var foo, interface;", | 1678 "var foo, interface;", |
1678 "try { } catch (interface) { }", | 1679 "try { } catch (interface) { }", |
1679 "function interface() { }", | 1680 "function interface() { }", |
1680 "function foo(interface) { }", | 1681 "function foo(interface) { }", |
1681 "function foo(bar, interface) { }", | 1682 "function foo(bar, interface) { }", |
1682 "interface = 1;", | 1683 "interface = 1;", |
1683 "var foo = interface = 1;", | 1684 "var foo = interface = 1;", |
1684 "++interface;", | 1685 "++interface;", |
1685 "interface++;", | 1686 "interface++;", |
1687 "var yield = 13;", | |
1686 NULL | 1688 NULL |
1687 }; | 1689 }; |
1688 | 1690 |
1689 RunParserSyncTest(context_data, statement_data, kSuccess); | 1691 RunParserSyncTest(context_data, statement_data, kSuccess); |
1690 } | 1692 } |
1691 | 1693 |
1692 | 1694 |
1693 TEST(ErrorsReservedWords) { | 1695 TEST(ErrorsReservedWords) { |
1694 // Tests that both preparsing and parsing produce the right kind of errors for | 1696 // Tests that both preparsing and parsing produce the right kind of errors for |
1695 // using future reserved words as identifiers. These tests don't depend on the | 1697 // using future reserved words as identifiers. These tests don't depend on the |
(...skipping 18 matching lines...) Expand all Loading... | |
1714 "++super;", | 1716 "++super;", |
1715 "super++;", | 1717 "super++;", |
1716 "function foo super", | 1718 "function foo super", |
1717 NULL | 1719 NULL |
1718 }; | 1720 }; |
1719 | 1721 |
1720 RunParserSyncTest(context_data, statement_data, kError); | 1722 RunParserSyncTest(context_data, statement_data, kError); |
1721 } | 1723 } |
1722 | 1724 |
1723 | 1725 |
1724 TEST(NoErrorsYieldSloppy) { | 1726 TEST(NoErrorsYieldSloppyAllModes) { |
1725 // In sloppy mode, it's okay to use "yield" as identifier, *except* inside a | 1727 // In sloppy mode, it's okay to use "yield" as identifier, *except* inside a |
1726 // generator (see next test). | 1728 // generator (see next test). |
1727 const char* context_data[][2] = { | 1729 const char* context_data[][2] = { |
1728 { "", "" }, | 1730 { "", "" }, |
1729 { "function is_not_gen() {", "}" }, | 1731 { "function not_gen() {", "}" }, |
1732 { "(function not_gen() {", "})" }, | |
1730 { NULL, NULL } | 1733 { NULL, NULL } |
1731 }; | 1734 }; |
1732 | 1735 |
1733 const char* statement_data[] = { | 1736 const char* statement_data[] = { |
1734 "var yield;", | 1737 "var yield;", |
1735 "var foo, yield;", | 1738 "var foo, yield;", |
1736 "try { } catch (yield) { }", | 1739 "try { } catch (yield) { }", |
1737 "function yield() { }", | 1740 "function yield() { }", |
1741 "(function yield() { })", | |
1738 "function foo(yield) { }", | 1742 "function foo(yield) { }", |
1739 "function foo(bar, yield) { }", | 1743 "function foo(bar, yield) { }", |
1740 "yield = 1;", | 1744 "yield = 1;", |
1741 "var foo = yield = 1;", | 1745 "var foo = yield = 1;", |
1742 "++yield;", | 1746 "++yield;", |
1743 "yield++;", | 1747 "yield++;", |
1748 "yield: 34", | |
1749 "function yield(yield) { yield: yield (yield + yield (0)); }", | |
1750 "({ yield: 1 })", | |
1751 "({ get yield() { 1 } })", | |
1752 "yield (100)", | |
1744 NULL | 1753 NULL |
1745 }; | 1754 }; |
1746 | 1755 |
1747 RunParserSyncTest(context_data, statement_data, kSuccess); | 1756 RunParserSyncTest(context_data, statement_data, kSuccess); |
1748 } | 1757 } |
1749 | 1758 |
1750 | 1759 |
1751 TEST(ErrorsYieldSloppyGenerator) { | 1760 TEST(NoErrorsYieldSloppyGeneratorsEnabled) { |
1761 // In sloppy mode, it's okay to use "yield" as identifier, *except* inside a | |
1762 // generator (see next test). | |
1752 const char* context_data[][2] = { | 1763 const char* context_data[][2] = { |
1753 { "function * is_gen() {", "}" }, | 1764 { "", "" }, |
1765 { "function not_gen() {", "}" }, | |
1766 { "function * gen() { function not_gen() {", "} }" }, | |
1767 { "(function not_gen() {", "})" }, | |
1768 { "(function * gen() { (function not_gen() {", "}) })" }, | |
1754 { NULL, NULL } | 1769 { NULL, NULL } |
1755 }; | 1770 }; |
1756 | 1771 |
1757 const char* statement_data[] = { | 1772 const char* statement_data[] = { |
1758 "var yield;", | 1773 "var yield;", |
1759 "var foo, yield;", | 1774 "var foo, yield;", |
1760 "try { } catch (yield) { }", | 1775 "try { } catch (yield) { }", |
1761 "function yield() { }", | 1776 "function yield() { }", |
1762 // BUG: These should not be allowed, but they are (if kAllowGenerators is | 1777 "(function yield() { })", |
1763 // set) | 1778 "function foo(yield) { }", |
1764 // "function foo(yield) { }", | 1779 "function foo(bar, yield) { }", |
1765 // "function foo(bar, yield) { }", | 1780 "function * yield() { }", |
1781 "(function * yield() { })", | |
1766 "yield = 1;", | 1782 "yield = 1;", |
1767 "var foo = yield = 1;", | 1783 "var foo = yield = 1;", |
1768 "++yield;", | 1784 "++yield;", |
1769 "yield++;", | 1785 "yield++;", |
1786 "yield: 34", | |
1787 "function yield(yield) { yield: yield (yield + yield (0)); }", | |
marja
2014/07/02 11:39:22
Lovely
| |
1788 "({ yield: 1 })", | |
1789 "({ get yield() { 1 } })", | |
1790 "yield (100)", | |
1770 NULL | 1791 NULL |
1771 }; | 1792 }; |
1772 | 1793 |
1773 // If generators are not allowed, the error will be produced at the '*' token, | 1794 // This test requires kAllowGenerators to succeed. |
1774 // so this test works both with and without the kAllowGenerators flag. | 1795 static const ParserFlag always_true_flags[] = { |
1775 RunParserSyncTest(context_data, statement_data, kError); | 1796 kAllowGenerators |
1797 }; | |
1798 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | |
1799 always_true_flags, 1); | |
1776 } | 1800 } |
1777 | 1801 |
1778 | 1802 |
1779 TEST(ErrorsYieldStrict) { | 1803 TEST(ErrorsYieldStrict) { |
1780 const char* context_data[][2] = { | 1804 const char* context_data[][2] = { |
1781 { "\"use strict\";", "" }, | 1805 { "\"use strict\";", "" }, |
1782 { "\"use strict\"; function is_not_gen() {", "}" }, | 1806 { "\"use strict\"; function not_gen() {", "}" }, |
1783 { "function test_func() {\"use strict\"; ", "}"}, | 1807 { "function test_func() {\"use strict\"; ", "}"}, |
1808 { "\"use strict\"; function * gen() { function not_gen() {", "} }" }, | |
1809 { "\"use strict\"; (function not_gen() {", "})" }, | |
1810 { "\"use strict\"; (function gen* () { (function not_gen() {", "}) })" }, | |
marja
2014/07/02 11:39:22
Wut, wait, why is the asterisk after the name?
wingo
2014/07/02 11:42:49
Um, that's a typo. Will fix!
| |
1784 { NULL, NULL } | 1811 { NULL, NULL } |
1785 }; | 1812 }; |
1786 | 1813 |
1787 const char* statement_data[] = { | 1814 const char* statement_data[] = { |
1788 "var yield;", | 1815 "var yield;", |
1789 "var foo, yield;", | 1816 "var foo, yield;", |
1790 "try { } catch (yield) { }", | 1817 "try { } catch (yield) { }", |
1791 "function yield() { }", | 1818 "function yield() { }", |
1819 "(function yield() { })", | |
1792 "function foo(yield) { }", | 1820 "function foo(yield) { }", |
1793 "function foo(bar, yield) { }", | 1821 "function foo(bar, yield) { }", |
1822 "function * yield() { }", | |
1823 "(function * yield() { })", | |
1794 "yield = 1;", | 1824 "yield = 1;", |
1795 "var foo = yield = 1;", | 1825 "var foo = yield = 1;", |
1796 "++yield;", | 1826 "++yield;", |
1797 "yield++;", | 1827 "yield++;", |
1828 "yield: 34;", | |
1798 NULL | 1829 NULL |
1799 }; | 1830 }; |
1800 | 1831 |
1801 RunParserSyncTest(context_data, statement_data, kError); | 1832 RunParserSyncTest(context_data, statement_data, kError); |
1802 } | 1833 } |
1803 | 1834 |
1804 | 1835 |
1805 TEST(NoErrorsYield) { | 1836 TEST(NoErrorsGenerator) { |
1806 const char* context_data[][2] = { | 1837 const char* context_data[][2] = { |
1807 { "function * is_gen() {", "}" }, | 1838 { "function * gen() {", "}" }, |
1839 { "(function * gen() {", "})" }, | |
1840 { "(function * () {", "})" }, | |
1808 { NULL, NULL } | 1841 { NULL, NULL } |
1809 }; | 1842 }; |
1810 | 1843 |
1811 const char* statement_data[] = { | 1844 const char* statement_data[] = { |
1812 "yield 2;", // this is legal inside generator | 1845 // A generator without a body is valid. |
1813 "yield * 2;", // this is legal inside generator | 1846 "" |
1847 // Valid yield expressions inside generators. | |
1848 "yield 2;", | |
1849 "yield * 2;", | |
1850 "yield * \n 2;", | |
1851 "yield yield 1;", | |
1852 "yield * yield * 1;", | |
1853 "yield 3 + (yield 4);", | |
1854 "yield * 3 + (yield * 4);", | |
1855 "(yield * 3) + (yield * 4);", | |
1856 "yield 3; yield 4;", | |
1857 "yield * 3; yield * 4;", | |
1858 "(function (yield) { })", | |
1859 // You can return in a generator. | |
1860 "yield 1; return", | |
1861 "yield * 1; return", | |
1862 "yield 1; return 37", | |
1863 "yield * 1; return 37", | |
1864 "yield 1; return 37; yield 'dead';", | |
1865 "yield * 1; return 37; yield * 'dead';", | |
1866 // Yield is still a valid key in object literals. | |
1867 "({ yield: 1 })", | |
1868 "({ get yield() { } })", | |
1869 // TODO(348893007): Invalid (no newline allowed between yield and *). | |
marja
2014/07/02 11:39:22
Does this mean the test would fail?
wingo
2014/07/02 11:42:49
This test should fail according to spec (should pa
| |
1870 "yield\n*3", | |
1814 NULL | 1871 NULL |
1815 }; | 1872 }; |
1816 | 1873 |
1817 // This test requires kAllowGenerators to succeed. | 1874 // This test requires kAllowGenerators to succeed. |
1818 static const ParserFlag always_true_flags[] = { | 1875 static const ParserFlag always_true_flags[] = { |
1819 kAllowGenerators | 1876 kAllowGenerators |
1820 }; | 1877 }; |
1821 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 1878 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
1822 always_true_flags, 1); | 1879 always_true_flags, 1); |
1823 } | 1880 } |
1824 | 1881 |
1825 | 1882 |
1883 TEST(ErrorsYieldGenerator) { | |
1884 const char* context_data[][2] = { | |
1885 { "function * gen() {", "}" }, | |
1886 { "\"use strict\"; function * gen() {", "}" }, | |
1887 { NULL, NULL } | |
1888 }; | |
1889 | |
1890 const char* statement_data[] = { | |
1891 // Invalid yield expressions inside generators. | |
1892 "var yield;", | |
1893 "var foo, yield;", | |
1894 "try { } catch (yield) { }", | |
1895 "function yield() { }", | |
1896 // The name of the NFE is let-bound in the generator, which does not permit | |
1897 // yield to be an identifier. | |
1898 "(function yield() { })", | |
1899 "(function * yield() { })", | |
1900 // Yield isn't valid as a formal parameter for generators. | |
1901 "function * foo(yield) { }", | |
1902 "(function * foo(yield) { })", | |
1903 "yield = 1;", | |
1904 "var foo = yield = 1;", | |
1905 "++yield;", | |
1906 "yield++;", | |
1907 "yield *", | |
1908 "(yield *)", | |
1909 // Yield binds very loosely, so this parses as "yield (3 + yield 4)", which | |
1910 // is invalid. | |
1911 "yield 3 + yield 4;", | |
1912 "yield: 34", | |
1913 "yield ? 1 : 2", | |
1914 // Parses as yield (/ yield): invalid. | |
1915 "yield / yield", | |
1916 // TODO(348893007): The rest of these should be valid. | |
1917 "yield;", | |
1918 "yield", | |
1919 "yield\n", | |
1920 "(yield)", | |
1921 "[yield]", | |
1922 "{yield}", | |
1923 "yield, yield", | |
1924 "yield; yield", | |
1925 "(yield) ? yield : yield", | |
1926 "(yield) \n ? yield : yield", | |
1927 // Parses as yield (+ yield). | |
1928 "yield + yield", | |
1929 NULL | |
1930 }; | |
1931 | |
1932 RunParserSyncTest(context_data, statement_data, kError); | |
1933 } | |
1934 | |
1935 | |
1826 TEST(ErrorsNameOfStrictFunction) { | 1936 TEST(ErrorsNameOfStrictFunction) { |
1827 // Tests that illegal tokens as names of a strict function produce the correct | 1937 // Tests that illegal tokens as names of a strict function produce the correct |
1828 // errors. | 1938 // errors. |
1829 const char* context_data[][2] = { | 1939 const char* context_data[][2] = { |
1830 { "", ""}, | 1940 { "function ", ""}, |
1831 { "\"use strict\";", ""}, | 1941 { "\"use strict\"; function", ""}, |
1942 { "function * ", ""}, | |
1943 { "\"use strict\"; function * ", ""}, | |
1832 { NULL, NULL } | 1944 { NULL, NULL } |
1833 }; | 1945 }; |
1834 | 1946 |
1835 const char* statement_data[] = { | 1947 const char* statement_data[] = { |
1836 "function eval() {\"use strict\";}", | 1948 "eval() {\"use strict\";}", |
1837 "function arguments() {\"use strict\";}", | 1949 "arguments() {\"use strict\";}", |
1838 "function interface() {\"use strict\";}", | 1950 "interface() {\"use strict\";}", |
1839 "function yield() {\"use strict\";}", | 1951 "yield() {\"use strict\";}", |
1840 // Future reserved words are always illegal | 1952 // Future reserved words are always illegal |
1841 "function super() { }", | 1953 "function super() { }", |
1842 "function super() {\"use strict\";}", | 1954 "function super() {\"use strict\";}", |
1843 NULL | 1955 NULL |
1844 }; | 1956 }; |
1845 | 1957 |
1846 RunParserSyncTest(context_data, statement_data, kError); | 1958 RunParserSyncTest(context_data, statement_data, kError); |
1847 } | 1959 } |
1848 | 1960 |
1849 | 1961 |
1850 TEST(NoErrorsNameOfStrictFunction) { | 1962 TEST(NoErrorsNameOfStrictFunction) { |
1851 const char* context_data[][2] = { | 1963 const char* context_data[][2] = { |
1852 { "", ""}, | 1964 { "function ", ""}, |
1853 { NULL, NULL } | 1965 { NULL, NULL } |
1854 }; | 1966 }; |
1855 | 1967 |
1856 const char* statement_data[] = { | 1968 const char* statement_data[] = { |
1857 "function eval() { }", | 1969 "eval() { }", |
1858 "function arguments() { }", | 1970 "arguments() { }", |
1859 "function interface() { }", | 1971 "interface() { }", |
1860 "function yield() { }", | 1972 "yield() { }", |
1861 NULL | 1973 NULL |
1862 }; | 1974 }; |
1863 | 1975 |
1864 RunParserSyncTest(context_data, statement_data, kSuccess); | 1976 RunParserSyncTest(context_data, statement_data, kSuccess); |
1865 } | 1977 } |
1866 | 1978 |
1867 | 1979 |
1980 TEST(NoErrorsNameOfStrictGenerator) { | |
1981 const char* context_data[][2] = { | |
1982 { "function * ", ""}, | |
1983 { NULL, NULL } | |
1984 }; | |
1985 | |
1986 const char* statement_data[] = { | |
1987 "eval() { }", | |
1988 "arguments() { }", | |
1989 "interface() { }", | |
1990 "yield() { }", | |
1991 NULL | |
1992 }; | |
1993 | |
1994 // This test requires kAllowGenerators to succeed. | |
1995 static const ParserFlag always_true_flags[] = { | |
1996 kAllowGenerators | |
1997 }; | |
1998 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | |
1999 always_true_flags, 1); | |
2000 } | |
2001 | |
1868 | 2002 |
1869 TEST(ErrorsIllegalWordsAsLabelsSloppy) { | 2003 TEST(ErrorsIllegalWordsAsLabelsSloppy) { |
1870 // Using future reserved words as labels is always an error. | 2004 // Using future reserved words as labels is always an error. |
1871 const char* context_data[][2] = { | 2005 const char* context_data[][2] = { |
1872 { "", ""}, | 2006 { "", ""}, |
1873 { "function test_func() {", "}" }, | 2007 { "function test_func() {", "}" }, |
1874 { NULL, NULL } | 2008 { NULL, NULL } |
1875 }; | 2009 }; |
1876 | 2010 |
1877 const char* statement_data[] = { | 2011 const char* statement_data[] = { |
(...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2764 LocalContext env; | 2898 LocalContext env; |
2765 int use_counts[v8::Isolate::kUseCounterFeatureCount] = {}; | 2899 int use_counts[v8::Isolate::kUseCounterFeatureCount] = {}; |
2766 global_use_counts = use_counts; | 2900 global_use_counts = use_counts; |
2767 CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback); | 2901 CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback); |
2768 CompileRun("\"use asm\";\n" | 2902 CompileRun("\"use asm\";\n" |
2769 "var foo = 1;\n" | 2903 "var foo = 1;\n" |
2770 "\"use asm\";\n" // Only the first one counts. | 2904 "\"use asm\";\n" // Only the first one counts. |
2771 "function bar() { \"use asm\"; var baz = 1; }"); | 2905 "function bar() { \"use asm\"; var baz = 1; }"); |
2772 CHECK_EQ(2, use_counts[v8::Isolate::kUseAsm]); | 2906 CHECK_EQ(2, use_counts[v8::Isolate::kUseAsm]); |
2773 } | 2907 } |
OLD | NEW |