| 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 1342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1353 kAllowHarmonyScoping, | 1353 kAllowHarmonyScoping, |
| 1354 kAllowHarmonyModules, | 1354 kAllowHarmonyModules, |
| 1355 kAllowHarmonyNumericLiterals, | 1355 kAllowHarmonyNumericLiterals, |
| 1356 kAllowHarmonyArrowFunctions, | 1356 kAllowHarmonyArrowFunctions, |
| 1357 kAllowHarmonyClasses, | 1357 kAllowHarmonyClasses, |
| 1358 kAllowHarmonyObjectLiterals, | 1358 kAllowHarmonyObjectLiterals, |
| 1359 kAllowHarmonyRestParameters, | 1359 kAllowHarmonyRestParameters, |
| 1360 kAllowHarmonyTemplates, | 1360 kAllowHarmonyTemplates, |
| 1361 kAllowHarmonySloppy, | 1361 kAllowHarmonySloppy, |
| 1362 kAllowHarmonyUnicode, | 1362 kAllowHarmonyUnicode, |
| 1363 kAllowHarmonyComputedPropertyNames | 1363 kAllowHarmonyComputedPropertyNames, |
| 1364 kAllowStrongMode |
| 1364 }; | 1365 }; |
| 1365 | 1366 |
| 1366 | 1367 |
| 1367 enum ParserSyncTestResult { | 1368 enum ParserSyncTestResult { |
| 1368 kSuccessOrError, | 1369 kSuccessOrError, |
| 1369 kSuccess, | 1370 kSuccess, |
| 1370 kError | 1371 kError |
| 1371 }; | 1372 }; |
| 1372 | 1373 |
| 1373 template <typename Traits> | 1374 template <typename Traits> |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1384 parser->set_allow_harmony_arrow_functions( | 1385 parser->set_allow_harmony_arrow_functions( |
| 1385 flags.Contains(kAllowHarmonyArrowFunctions)); | 1386 flags.Contains(kAllowHarmonyArrowFunctions)); |
| 1386 parser->set_allow_harmony_classes(flags.Contains(kAllowHarmonyClasses)); | 1387 parser->set_allow_harmony_classes(flags.Contains(kAllowHarmonyClasses)); |
| 1387 parser->set_allow_harmony_templates(flags.Contains(kAllowHarmonyTemplates)); | 1388 parser->set_allow_harmony_templates(flags.Contains(kAllowHarmonyTemplates)); |
| 1388 parser->set_allow_harmony_rest_params( | 1389 parser->set_allow_harmony_rest_params( |
| 1389 flags.Contains(kAllowHarmonyRestParameters)); | 1390 flags.Contains(kAllowHarmonyRestParameters)); |
| 1390 parser->set_allow_harmony_sloppy(flags.Contains(kAllowHarmonySloppy)); | 1391 parser->set_allow_harmony_sloppy(flags.Contains(kAllowHarmonySloppy)); |
| 1391 parser->set_allow_harmony_unicode(flags.Contains(kAllowHarmonyUnicode)); | 1392 parser->set_allow_harmony_unicode(flags.Contains(kAllowHarmonyUnicode)); |
| 1392 parser->set_allow_harmony_computed_property_names( | 1393 parser->set_allow_harmony_computed_property_names( |
| 1393 flags.Contains(kAllowHarmonyComputedPropertyNames)); | 1394 flags.Contains(kAllowHarmonyComputedPropertyNames)); |
| 1395 parser->set_allow_strong_mode(flags.Contains(kAllowStrongMode)); |
| 1394 } | 1396 } |
| 1395 | 1397 |
| 1396 | 1398 |
| 1397 void TestParserSyncWithFlags(i::Handle<i::String> source, | 1399 void TestParserSyncWithFlags(i::Handle<i::String> source, |
| 1398 i::EnumSet<ParserFlag> flags, | 1400 i::EnumSet<ParserFlag> flags, |
| 1399 ParserSyncTestResult result) { | 1401 ParserSyncTestResult result) { |
| 1400 i::Isolate* isolate = CcTest::i_isolate(); | 1402 i::Isolate* isolate = CcTest::i_isolate(); |
| 1401 i::Factory* factory = isolate->factory(); | 1403 i::Factory* factory = isolate->factory(); |
| 1402 | 1404 |
| 1403 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); | 1405 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1753 delete[] generated_flags; | 1755 delete[] generated_flags; |
| 1754 } | 1756 } |
| 1755 | 1757 |
| 1756 | 1758 |
| 1757 TEST(ErrorsEvalAndArguments) { | 1759 TEST(ErrorsEvalAndArguments) { |
| 1758 // Tests that both preparsing and parsing produce the right kind of errors for | 1760 // Tests that both preparsing and parsing produce the right kind of errors for |
| 1759 // using "eval" and "arguments" as identifiers. Without the strict mode, it's | 1761 // using "eval" and "arguments" as identifiers. Without the strict mode, it's |
| 1760 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it | 1762 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it |
| 1761 // isn't. | 1763 // isn't. |
| 1762 const char* context_data[][2] = { | 1764 const char* context_data[][2] = { |
| 1763 { "\"use strict\";", "" }, | 1765 {"\"use strict\";", ""}, |
| 1764 { "var eval; function test_func() {\"use strict\"; ", "}"}, | 1766 {"\"use strong\";", ""}, |
| 1765 { NULL, NULL } | 1767 {"var eval; function test_func() {\"use strict\"; ", "}"}, |
| 1766 }; | 1768 {"var eval; function test_func() {\"use strong\"; ", "}"}, |
| 1769 {NULL, NULL}}; |
| 1767 | 1770 |
| 1768 const char* statement_data[] = { | 1771 const char* statement_data[] = { |
| 1769 "var eval;", | 1772 "var eval;", |
| 1770 "var arguments", | 1773 "var arguments", |
| 1771 "var foo, eval;", | 1774 "var foo, eval;", |
| 1772 "var foo, arguments;", | 1775 "var foo, arguments;", |
| 1773 "try { } catch (eval) { }", | 1776 "try { } catch (eval) { }", |
| 1774 "try { } catch (arguments) { }", | 1777 "try { } catch (arguments) { }", |
| 1775 "function eval() { }", | 1778 "function eval() { }", |
| 1776 "function arguments() { }", | 1779 "function arguments() { }", |
| 1777 "function foo(eval) { }", | 1780 "function foo(eval) { }", |
| 1778 "function foo(arguments) { }", | 1781 "function foo(arguments) { }", |
| 1779 "function foo(bar, eval) { }", | 1782 "function foo(bar, eval) { }", |
| 1780 "function foo(bar, arguments) { }", | 1783 "function foo(bar, arguments) { }", |
| 1781 "(eval) => { }", | 1784 "(eval) => { }", |
| 1782 "(arguments) => { }", | 1785 "(arguments) => { }", |
| 1783 "(foo, eval) => { }", | 1786 "(foo, eval) => { }", |
| 1784 "(foo, arguments) => { }", | 1787 "(foo, arguments) => { }", |
| 1785 "eval = 1;", | 1788 "eval = 1;", |
| 1786 "arguments = 1;", | 1789 "arguments = 1;", |
| 1787 "var foo = eval = 1;", | 1790 "var foo = eval = 1;", |
| 1788 "var foo = arguments = 1;", | 1791 "var foo = arguments = 1;", |
| 1789 "++eval;", | 1792 "++eval;", |
| 1790 "++arguments;", | 1793 "++arguments;", |
| 1791 "eval++;", | 1794 "eval++;", |
| 1792 "arguments++;", | 1795 "arguments++;", |
| 1793 NULL | 1796 NULL |
| 1794 }; | 1797 }; |
| 1795 | 1798 |
| 1796 RunParserSyncTest(context_data, statement_data, kError); | 1799 static const ParserFlag always_flags[] = {kAllowStrongMode}; |
| 1800 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, |
| 1801 arraysize(always_flags)); |
| 1797 } | 1802 } |
| 1798 | 1803 |
| 1799 | 1804 |
| 1800 TEST(NoErrorsEvalAndArgumentsSloppy) { | 1805 TEST(NoErrorsEvalAndArgumentsSloppy) { |
| 1801 // Tests that both preparsing and parsing accept "eval" and "arguments" as | 1806 // Tests that both preparsing and parsing accept "eval" and "arguments" as |
| 1802 // identifiers when needed. | 1807 // identifiers when needed. |
| 1803 const char* context_data[][2] = { | 1808 const char* context_data[][2] = { |
| 1804 { "", "" }, | 1809 { "", "" }, |
| 1805 { "function test_func() {", "}"}, | 1810 { "function test_func() {", "}"}, |
| 1806 { NULL, NULL } | 1811 { NULL, NULL } |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1893 "++" #NAME ";", \ | 1898 "++" #NAME ";", \ |
| 1894 #NAME " ++;", | 1899 #NAME " ++;", |
| 1895 | 1900 |
| 1896 | 1901 |
| 1897 TEST(ErrorsFutureStrictReservedWords) { | 1902 TEST(ErrorsFutureStrictReservedWords) { |
| 1898 // Tests that both preparsing and parsing produce the right kind of errors for | 1903 // Tests that both preparsing and parsing produce the right kind of errors for |
| 1899 // using future strict reserved words as identifiers. Without the strict mode, | 1904 // using future strict reserved words as identifiers. Without the strict mode, |
| 1900 // it's ok to use future strict reserved words as identifiers. With the strict | 1905 // it's ok to use future strict reserved words as identifiers. With the strict |
| 1901 // mode, it isn't. | 1906 // mode, it isn't. |
| 1902 const char* context_data[][2] = { | 1907 const char* context_data[][2] = { |
| 1903 { "function test_func() {\"use strict\"; ", "}"}, | 1908 {"function test_func() {\"use strict\"; ", "}"}, |
| 1904 { "() => { \"use strict\"; ", "}" }, | 1909 {"() => { \"use strict\"; ", "}"}, |
| 1905 { NULL, NULL } | 1910 {"function test_func() {\"use strong\"; ", "}"}, |
| 1906 }; | 1911 {"() => { \"use strong\"; ", "}"}, |
| 1912 {NULL, NULL}}; |
| 1907 | 1913 |
| 1908 const char* statement_data[] { | 1914 const char* statement_data[] { |
| 1909 LIMITED_FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) | 1915 LIMITED_FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) |
| 1910 NULL | 1916 NULL |
| 1911 }; | 1917 }; |
| 1912 | 1918 |
| 1913 RunParserSyncTest(context_data, statement_data, kError); | 1919 static const ParserFlag always_flags[] = {kAllowStrongMode}; |
| 1914 RunParserSyncTest(context_data, statement_data, kError); | 1920 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, |
| 1921 arraysize(always_flags)); |
| 1922 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, |
| 1923 arraysize(always_flags)); |
| 1915 } | 1924 } |
| 1916 | 1925 |
| 1917 | 1926 |
| 1918 #undef LIMITED_FUTURE_STRICT_RESERVED_WORDS | 1927 #undef LIMITED_FUTURE_STRICT_RESERVED_WORDS |
| 1919 | 1928 |
| 1920 | 1929 |
| 1921 TEST(NoErrorsFutureStrictReservedWords) { | 1930 TEST(NoErrorsFutureStrictReservedWords) { |
| 1922 const char* context_data[][2] = { | 1931 const char* context_data[][2] = { |
| 1923 { "", "" }, | 1932 { "", "" }, |
| 1924 { "function test_func() {", "}"}, | 1933 { "function test_func() {", "}"}, |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2082 "yield[100]", | 2091 "yield[100]", |
| 2083 NULL | 2092 NULL |
| 2084 }; | 2093 }; |
| 2085 | 2094 |
| 2086 RunParserSyncTest(context_data, statement_data, kSuccess); | 2095 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 2087 } | 2096 } |
| 2088 | 2097 |
| 2089 | 2098 |
| 2090 TEST(ErrorsYieldStrict) { | 2099 TEST(ErrorsYieldStrict) { |
| 2091 const char* context_data[][2] = { | 2100 const char* context_data[][2] = { |
| 2092 { "\"use strict\";", "" }, | 2101 {"\"use strict\";", ""}, |
| 2093 { "\"use strict\"; function not_gen() {", "}" }, | 2102 {"\"use strict\"; function not_gen() {", "}"}, |
| 2094 { "function test_func() {\"use strict\"; ", "}"}, | 2103 {"function test_func() {\"use strict\"; ", "}"}, |
| 2095 { "\"use strict\"; function * gen() { function not_gen() {", "} }" }, | 2104 {"\"use strict\"; function * gen() { function not_gen() {", "} }"}, |
| 2096 { "\"use strict\"; (function not_gen() {", "})" }, | 2105 {"\"use strict\"; (function not_gen() {", "})"}, |
| 2097 { "\"use strict\"; (function * gen() { (function not_gen() {", "}) })" }, | 2106 {"\"use strict\"; (function * gen() { (function not_gen() {", "}) })"}, |
| 2098 { "() => {\"use strict\"; ", "}" }, | 2107 {"() => {\"use strict\"; ", "}"}, |
| 2099 { NULL, NULL } | 2108 {"\"use strong\";", ""}, |
| 2100 }; | 2109 {"\"use strong\"; function not_gen() {", "}"}, |
| 2110 {"function test_func() {\"use strong\"; ", "}"}, |
| 2111 {"\"use strong\"; function * gen() { function not_gen() {", "} }"}, |
| 2112 {"\"use strong\"; (function not_gen() {", "})"}, |
| 2113 {"\"use strong\"; (function * gen() { (function not_gen() {", "}) })"}, |
| 2114 {"() => {\"use strong\"; ", "}"}, |
| 2115 {NULL, NULL}}; |
| 2101 | 2116 |
| 2102 const char* statement_data[] = { | 2117 const char* statement_data[] = { |
| 2103 "var yield;", | 2118 "var yield;", |
| 2104 "var foo, yield;", | 2119 "var foo, yield;", |
| 2105 "try { } catch (yield) { }", | 2120 "try { } catch (yield) { }", |
| 2106 "function yield() { }", | 2121 "function yield() { }", |
| 2107 "(function yield() { })", | 2122 "(function yield() { })", |
| 2108 "function foo(yield) { }", | 2123 "function foo(yield) { }", |
| 2109 "function foo(bar, yield) { }", | 2124 "function foo(bar, yield) { }", |
| 2110 "function * yield() { }", | 2125 "function * yield() { }", |
| 2111 "(function * yield() { })", | 2126 "(function * yield() { })", |
| 2112 "yield = 1;", | 2127 "yield = 1;", |
| 2113 "var foo = yield = 1;", | 2128 "var foo = yield = 1;", |
| 2114 "++yield;", | 2129 "++yield;", |
| 2115 "yield++;", | 2130 "yield++;", |
| 2116 "yield: 34;", | 2131 "yield: 34;", |
| 2117 NULL | 2132 NULL |
| 2118 }; | 2133 }; |
| 2119 | 2134 |
| 2120 RunParserSyncTest(context_data, statement_data, kError); | 2135 static const ParserFlag always_flags[] = {kAllowStrongMode}; |
| 2136 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, |
| 2137 arraysize(always_flags)); |
| 2121 } | 2138 } |
| 2122 | 2139 |
| 2123 | 2140 |
| 2124 TEST(NoErrorsGenerator) { | 2141 TEST(NoErrorsGenerator) { |
| 2125 const char* context_data[][2] = { | 2142 const char* context_data[][2] = { |
| 2126 { "function * gen() {", "}" }, | 2143 { "function * gen() {", "}" }, |
| 2127 { "(function * gen() {", "})" }, | 2144 { "(function * gen() {", "})" }, |
| 2128 { "(function * () {", "})" }, | 2145 { "(function * () {", "})" }, |
| 2129 { NULL, NULL } | 2146 { NULL, NULL } |
| 2130 }; | 2147 }; |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2228 RunParserSyncTest(context_data, statement_data, kError); | 2245 RunParserSyncTest(context_data, statement_data, kError); |
| 2229 } | 2246 } |
| 2230 | 2247 |
| 2231 | 2248 |
| 2232 TEST(ErrorsNameOfStrictFunction) { | 2249 TEST(ErrorsNameOfStrictFunction) { |
| 2233 // Tests that illegal tokens as names of a strict function produce the correct | 2250 // Tests that illegal tokens as names of a strict function produce the correct |
| 2234 // errors. | 2251 // errors. |
| 2235 const char* context_data[][2] = { | 2252 const char* context_data[][2] = { |
| 2236 { "function ", ""}, | 2253 { "function ", ""}, |
| 2237 { "\"use strict\"; function", ""}, | 2254 { "\"use strict\"; function", ""}, |
| 2255 { "\"use strong\"; function", ""}, |
| 2238 { "function * ", ""}, | 2256 { "function * ", ""}, |
| 2239 { "\"use strict\"; function * ", ""}, | 2257 { "\"use strict\"; function * ", ""}, |
| 2258 { "\"use strong\"; function * ", ""}, |
| 2240 { NULL, NULL } | 2259 { NULL, NULL } |
| 2241 }; | 2260 }; |
| 2242 | 2261 |
| 2243 const char* statement_data[] = { | 2262 const char* statement_data[] = { |
| 2244 "eval() {\"use strict\";}", | 2263 "eval() {\"use strict\";}", |
| 2245 "arguments() {\"use strict\";}", | 2264 "arguments() {\"use strict\";}", |
| 2246 "interface() {\"use strict\";}", | 2265 "interface() {\"use strict\";}", |
| 2247 "yield() {\"use strict\";}", | 2266 "yield() {\"use strict\";}", |
| 2248 // Future reserved words are always illegal | 2267 // Future reserved words are always illegal |
| 2249 "super() { }", | 2268 "super() { }", |
| 2250 "super() {\"use strict\";}", | 2269 "super() {\"use strict\";}", |
| 2251 NULL | 2270 NULL |
| 2252 }; | 2271 }; |
| 2253 | 2272 |
| 2254 RunParserSyncTest(context_data, statement_data, kError); | 2273 static const ParserFlag always_flags[] = {kAllowStrongMode}; |
| 2274 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, |
| 2275 arraysize(always_flags)); |
| 2255 } | 2276 } |
| 2256 | 2277 |
| 2257 | 2278 |
| 2258 TEST(NoErrorsNameOfStrictFunction) { | 2279 TEST(NoErrorsNameOfStrictFunction) { |
| 2259 const char* context_data[][2] = { | 2280 const char* context_data[][2] = { |
| 2260 { "function ", ""}, | 2281 { "function ", ""}, |
| 2261 { NULL, NULL } | 2282 { NULL, NULL } |
| 2262 }; | 2283 }; |
| 2263 | 2284 |
| 2264 const char* statement_data[] = { | 2285 const char* statement_data[] = { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2305 NULL | 2326 NULL |
| 2306 }; | 2327 }; |
| 2307 | 2328 |
| 2308 RunParserSyncTest(context_data, statement_data, kError); | 2329 RunParserSyncTest(context_data, statement_data, kError); |
| 2309 } | 2330 } |
| 2310 | 2331 |
| 2311 | 2332 |
| 2312 TEST(ErrorsIllegalWordsAsLabelsStrict) { | 2333 TEST(ErrorsIllegalWordsAsLabelsStrict) { |
| 2313 // Tests that illegal tokens as labels produce the correct errors. | 2334 // Tests that illegal tokens as labels produce the correct errors. |
| 2314 const char* context_data[][2] = { | 2335 const char* context_data[][2] = { |
| 2315 { "\"use strict\";", "" }, | 2336 {"\"use strict\";", ""}, |
| 2316 { "function test_func() {\"use strict\"; ", "}"}, | 2337 {"function test_func() {\"use strict\"; ", "}"}, |
| 2317 { "() => {\"use strict\"; ", "}" }, | 2338 {"() => {\"use strict\"; ", "}"}, |
| 2318 { NULL, NULL } | 2339 {"\"use strong\";", ""}, |
| 2319 }; | 2340 {"function test_func() {\"use strong\"; ", "}"}, |
| 2341 {"() => {\"use strong\"; ", "}"}, |
| 2342 {NULL, NULL}}; |
| 2320 | 2343 |
| 2321 #define LABELLED_WHILE(NAME) #NAME ": while (true) { break " #NAME "; }", | 2344 #define LABELLED_WHILE(NAME) #NAME ": while (true) { break " #NAME "; }", |
| 2322 const char* statement_data[] = { | 2345 const char* statement_data[] = { |
| 2323 "super: while(true) { break super; }", | 2346 "super: while(true) { break super; }", |
| 2324 FUTURE_STRICT_RESERVED_WORDS(LABELLED_WHILE) | 2347 FUTURE_STRICT_RESERVED_WORDS(LABELLED_WHILE) |
| 2325 NULL | 2348 NULL |
| 2326 }; | 2349 }; |
| 2327 #undef LABELLED_WHILE | 2350 #undef LABELLED_WHILE |
| 2328 | 2351 |
| 2329 RunParserSyncTest(context_data, statement_data, kError); | 2352 static const ParserFlag always_flags[] = {kAllowStrongMode}; |
| 2353 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, |
| 2354 arraysize(always_flags)); |
| 2330 } | 2355 } |
| 2331 | 2356 |
| 2332 | 2357 |
| 2333 TEST(NoErrorsIllegalWordsAsLabels) { | 2358 TEST(NoErrorsIllegalWordsAsLabels) { |
| 2334 // Using eval and arguments as labels is legal even in strict mode. | 2359 // Using eval and arguments as labels is legal even in strict mode. |
| 2335 const char* context_data[][2] = { | 2360 const char* context_data[][2] = { |
| 2336 { "", ""}, | 2361 { "", ""}, |
| 2337 { "function test_func() {", "}" }, | 2362 { "function test_func() {", "}" }, |
| 2338 { "() => {", "}" }, | 2363 { "() => {", "}" }, |
| 2339 { "\"use strict\";", "" }, | 2364 { "\"use strict\";", "" }, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2396 | 2421 |
| 2397 TEST(NoErrorsParenthesizedDirectivePrologue) { | 2422 TEST(NoErrorsParenthesizedDirectivePrologue) { |
| 2398 // Parenthesized directive prologue shouldn't be recognized. | 2423 // Parenthesized directive prologue shouldn't be recognized. |
| 2399 const char* context_data[][2] = { | 2424 const char* context_data[][2] = { |
| 2400 { "", ""}, | 2425 { "", ""}, |
| 2401 { NULL, NULL } | 2426 { NULL, NULL } |
| 2402 }; | 2427 }; |
| 2403 | 2428 |
| 2404 const char* statement_data[] = { | 2429 const char* statement_data[] = { |
| 2405 "(\"use strict\"); var eval;", | 2430 "(\"use strict\"); var eval;", |
| 2431 "(\"use strong\"); var eval;", |
| 2406 NULL | 2432 NULL |
| 2407 }; | 2433 }; |
| 2408 | 2434 |
| 2409 RunParserSyncTest(context_data, statement_data, kSuccess); | 2435 static const ParserFlag always_flags[] = {kAllowStrongMode}; |
| 2436 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 2437 always_flags, arraysize(always_flags)); |
| 2410 } | 2438 } |
| 2411 | 2439 |
| 2412 | 2440 |
| 2413 TEST(ErrorsNotAnIdentifierName) { | 2441 TEST(ErrorsNotAnIdentifierName) { |
| 2414 const char* context_data[][2] = { | 2442 const char* context_data[][2] = { |
| 2415 { "", ""}, | 2443 { "", ""}, |
| 2416 { "\"use strict\";", ""}, | 2444 { "\"use strict\";", ""}, |
| 2417 { NULL, NULL } | 2445 { NULL, NULL } |
| 2418 }; | 2446 }; |
| 2419 | 2447 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2523 {"function foo(bar, eval) {", "}"}, | 2551 {"function foo(bar, eval) {", "}"}, |
| 2524 {"function foo(bar, arguments) {", "}"}, | 2552 {"function foo(bar, arguments) {", "}"}, |
| 2525 {"function foo(bar, yield) {", "}"}, | 2553 {"function foo(bar, yield) {", "}"}, |
| 2526 {"function foo(bar, interface) {", "}"}, | 2554 {"function foo(bar, interface) {", "}"}, |
| 2527 {"function foo(bar, bar) {", "}"}, | 2555 {"function foo(bar, bar) {", "}"}, |
| 2528 { NULL, NULL } | 2556 { NULL, NULL } |
| 2529 }; | 2557 }; |
| 2530 | 2558 |
| 2531 const char* strict_statement_data[] = { | 2559 const char* strict_statement_data[] = { |
| 2532 "\"use strict\";", | 2560 "\"use strict\";", |
| 2561 "\"use strong\";", |
| 2533 NULL | 2562 NULL |
| 2534 }; | 2563 }; |
| 2535 | 2564 |
| 2536 const char* non_strict_statement_data[] = { | 2565 const char* non_strict_statement_data[] = { |
| 2537 ";", | 2566 ";", |
| 2538 NULL | 2567 NULL |
| 2539 }; | 2568 }; |
| 2540 | 2569 |
| 2541 RunParserSyncTest(context_data, strict_statement_data, kError); | 2570 static const ParserFlag always_flags[] = {kAllowStrongMode}; |
| 2542 RunParserSyncTest(context_data, non_strict_statement_data, kSuccess); | 2571 RunParserSyncTest(context_data, strict_statement_data, kError, NULL, 0, |
| 2572 always_flags, arraysize(always_flags)); |
| 2573 RunParserSyncTest(context_data, non_strict_statement_data, kSuccess, NULL, 0, |
| 2574 always_flags, arraysize(always_flags)); |
| 2543 } | 2575 } |
| 2544 | 2576 |
| 2545 | 2577 |
| 2546 TEST(ErrorsTryWithoutCatchOrFinally) { | 2578 TEST(ErrorsTryWithoutCatchOrFinally) { |
| 2547 const char* context_data[][2] = { | 2579 const char* context_data[][2] = { |
| 2548 {"", ""}, | 2580 {"", ""}, |
| 2549 { NULL, NULL } | 2581 { NULL, NULL } |
| 2550 }; | 2582 }; |
| 2551 | 2583 |
| 2552 const char* statement_data[] = { | 2584 const char* statement_data[] = { |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2824 // The test is quite slow, so run it with a reduced set of flags. | 2856 // The test is quite slow, so run it with a reduced set of flags. |
| 2825 static const ParserFlag empty_flags[] = {kAllowLazy}; | 2857 static const ParserFlag empty_flags[] = {kAllowLazy}; |
| 2826 RunParserSyncTest(context_data, statement_data, kError, empty_flags, 1); | 2858 RunParserSyncTest(context_data, statement_data, kError, empty_flags, 1); |
| 2827 } | 2859 } |
| 2828 | 2860 |
| 2829 | 2861 |
| 2830 TEST(StrictDelete) { | 2862 TEST(StrictDelete) { |
| 2831 // "delete <Identifier>" is not allowed in strict mode. | 2863 // "delete <Identifier>" is not allowed in strict mode. |
| 2832 const char* strict_context_data[][2] = { | 2864 const char* strict_context_data[][2] = { |
| 2833 {"\"use strict\"; ", ""}, | 2865 {"\"use strict\"; ", ""}, |
| 2866 {"\"use strong\"; ", ""}, |
| 2834 { NULL, NULL } | 2867 { NULL, NULL } |
| 2835 }; | 2868 }; |
| 2836 | 2869 |
| 2837 const char* sloppy_context_data[][2] = { | 2870 const char* sloppy_context_data[][2] = { |
| 2838 {"", ""}, | 2871 {"", ""}, |
| 2839 { NULL, NULL } | 2872 { NULL, NULL } |
| 2840 }; | 2873 }; |
| 2841 | 2874 |
| 2842 // These are errors in the strict mode. | 2875 // These are errors in the strict mode. |
| 2843 const char* sloppy_statement_data[] = { | 2876 const char* sloppy_statement_data[] = { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2863 "delete new foo(bar);", | 2896 "delete new foo(bar);", |
| 2864 NULL | 2897 NULL |
| 2865 }; | 2898 }; |
| 2866 | 2899 |
| 2867 // These are always errors | 2900 // These are always errors |
| 2868 const char* bad_statement_data[] = { | 2901 const char* bad_statement_data[] = { |
| 2869 "delete if;", | 2902 "delete if;", |
| 2870 NULL | 2903 NULL |
| 2871 }; | 2904 }; |
| 2872 | 2905 |
| 2873 RunParserSyncTest(strict_context_data, sloppy_statement_data, kError); | 2906 static const ParserFlag always_flags[] = {kAllowStrongMode}; |
| 2874 RunParserSyncTest(sloppy_context_data, sloppy_statement_data, kSuccess); | 2907 RunParserSyncTest(strict_context_data, sloppy_statement_data, kError, NULL, 0, |
| 2908 always_flags, arraysize(always_flags)); |
| 2909 RunParserSyncTest(sloppy_context_data, sloppy_statement_data, kSuccess, NULL, |
| 2910 0, always_flags, arraysize(always_flags)); |
| 2875 | 2911 |
| 2876 RunParserSyncTest(strict_context_data, good_statement_data, kSuccess); | 2912 RunParserSyncTest(strict_context_data, good_statement_data, kSuccess, NULL, 0, |
| 2877 RunParserSyncTest(sloppy_context_data, good_statement_data, kSuccess); | 2913 always_flags, arraysize(always_flags)); |
| 2914 RunParserSyncTest(sloppy_context_data, good_statement_data, kSuccess, NULL, 0, |
| 2915 always_flags, arraysize(always_flags)); |
| 2878 | 2916 |
| 2879 RunParserSyncTest(strict_context_data, bad_statement_data, kError); | 2917 RunParserSyncTest(strict_context_data, bad_statement_data, kError, NULL, 0, |
| 2880 RunParserSyncTest(sloppy_context_data, bad_statement_data, kError); | 2918 always_flags, arraysize(always_flags)); |
| 2919 RunParserSyncTest(sloppy_context_data, bad_statement_data, kError, NULL, 0, |
| 2920 always_flags, arraysize(always_flags)); |
| 2881 } | 2921 } |
| 2882 | 2922 |
| 2883 | 2923 |
| 2884 TEST(InvalidLeftHandSide) { | 2924 TEST(InvalidLeftHandSide) { |
| 2885 const char* assignment_context_data[][2] = { | 2925 const char* assignment_context_data[][2] = { |
| 2886 {"", " = 1;"}, | 2926 {"", " = 1;"}, |
| 2887 {"\"use strict\"; ", " = 1;"}, | 2927 {"\"use strict\"; ", " = 1;"}, |
| 2888 { NULL, NULL } | 2928 { NULL, NULL } |
| 2889 }; | 2929 }; |
| 2890 | 2930 |
| (...skipping 2072 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4963 } | 5003 } |
| 4964 | 5004 |
| 4965 | 5005 |
| 4966 TEST(DeclarationsError) { | 5006 TEST(DeclarationsError) { |
| 4967 const char* context_data[][2] = {{"'use strict'; if (true)", ""}, | 5007 const char* context_data[][2] = {{"'use strict'; if (true)", ""}, |
| 4968 {"'use strict'; if (false) {} else", ""}, | 5008 {"'use strict'; if (false) {} else", ""}, |
| 4969 {"'use strict'; while (false)", ""}, | 5009 {"'use strict'; while (false)", ""}, |
| 4970 {"'use strict'; for (;;)", ""}, | 5010 {"'use strict'; for (;;)", ""}, |
| 4971 {"'use strict'; for (x in y)", ""}, | 5011 {"'use strict'; for (x in y)", ""}, |
| 4972 {"'use strict'; do ", " while (false)"}, | 5012 {"'use strict'; do ", " while (false)"}, |
| 5013 {"'use strong'; if (true)", ""}, |
| 5014 {"'use strong'; if (false) {} else", ""}, |
| 5015 {"'use strong'; while (false)", ""}, |
| 5016 {"'use strong'; for (;;)", ""}, |
| 5017 {"'use strong'; for (x in y)", ""}, |
| 5018 {"'use strong'; do ", " while (false)"}, |
| 4973 {NULL, NULL}}; | 5019 {NULL, NULL}}; |
| 4974 | 5020 |
| 4975 const char* statement_data[] = { | 5021 const char* statement_data[] = { |
| 4976 "let x = 1;", | 5022 "let x = 1;", |
| 4977 "const x = 1;", | 5023 "const x = 1;", |
| 4978 "class C {}", | 5024 "class C {}", |
| 4979 NULL}; | 5025 NULL}; |
| 4980 | 5026 |
| 4981 static const ParserFlag always_flags[] = { | 5027 static const ParserFlag always_flags[] = { |
| 4982 kAllowHarmonyClasses, kAllowHarmonyScoping | 5028 kAllowHarmonyClasses, kAllowHarmonyScoping, kAllowStrongMode}; |
| 4983 }; | |
| 4984 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, | 5029 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, |
| 4985 always_flags, arraysize(always_flags)); | 5030 always_flags, arraysize(always_flags)); |
| 4986 } | 5031 } |
| 5032 |
| 5033 |
| 5034 void TestLanguageMode(const char* source, |
| 5035 i::LanguageMode expected_language_mode) { |
| 5036 i::Isolate* isolate = CcTest::i_isolate(); |
| 5037 i::Factory* factory = isolate->factory(); |
| 5038 v8::HandleScope handles(CcTest::isolate()); |
| 5039 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); |
| 5040 v8::Context::Scope context_scope(context); |
| 5041 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - |
| 5042 128 * 1024); |
| 5043 |
| 5044 i::Handle<i::Script> script = |
| 5045 factory->NewScript(factory->NewStringFromAsciiChecked(source)); |
| 5046 i::CompilationInfoWithZone info(script); |
| 5047 i::Parser::ParseInfo parse_info = {isolate->stack_guard()->real_climit(), |
| 5048 isolate->heap()->HashSeed(), |
| 5049 isolate->unicode_cache()}; |
| 5050 i::Parser parser(&info, &parse_info); |
| 5051 parser.set_allow_strong_mode(true); |
| 5052 info.MarkAsGlobal(); |
| 5053 parser.Parse(); |
| 5054 CHECK(info.function() != NULL); |
| 5055 CHECK_EQ(expected_language_mode, info.function()->language_mode()); |
| 5056 } |
| 5057 |
| 5058 |
| 5059 TEST(LanguageModeDirectives) { |
| 5060 TestLanguageMode("\"use nothing\"", i::SLOPPY); |
| 5061 TestLanguageMode("\"use strict\"", i::STRICT); |
| 5062 TestLanguageMode("\"use strong\"", i::STRONG); |
| 5063 |
| 5064 TestLanguageMode("var x = 1; \"use strict\"", i::SLOPPY); |
| 5065 TestLanguageMode("var x = 1; \"use strong\"", i::SLOPPY); |
| 5066 |
| 5067 // Test that multiple directives ("use strict" / "use strong") put the parser |
| 5068 // into the correct mode. |
| 5069 TestLanguageMode("\"use strict\"; \"use strong\";", i::STRONG); |
| 5070 TestLanguageMode("\"use strong\"; \"use strict\";", i::STRONG); |
| 5071 |
| 5072 TestLanguageMode("\"use some future directive\"; \"use strict\";", i::STRICT); |
| 5073 TestLanguageMode("\"use some future directive\"; \"use strong\";", i::STRONG); |
| 5074 } |
| OLD | NEW |