Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(120)

Side by Side Diff: test/cctest/test-parsing.cc

Issue 898983002: Add strong mode. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 1743 matching lines...) Expand 10 before | Expand all | Expand 10 after
1754 } 1754 }
1755 1755
1756 1756
1757 TEST(ErrorsEvalAndArguments) { 1757 TEST(ErrorsEvalAndArguments) {
1758 // Tests that both preparsing and parsing produce the right kind of errors for 1758 // 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 1759 // 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 1760 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it
1761 // isn't. 1761 // isn't.
1762 const char* context_data[][2] = { 1762 const char* context_data[][2] = {
1763 { "\"use strict\";", "" }, 1763 { "\"use strict\";", "" },
1764 { "\"use sanity\";", "" },
1764 { "var eval; function test_func() {\"use strict\"; ", "}"}, 1765 { "var eval; function test_func() {\"use strict\"; ", "}"},
1766 { "var eval; function test_func() {\"use sanity\"; ", "}"},
1765 { NULL, NULL } 1767 { NULL, NULL }
1766 }; 1768 };
1767 1769
1768 const char* statement_data[] = { 1770 const char* statement_data[] = {
1769 "var eval;", 1771 "var eval;",
1770 "var arguments", 1772 "var arguments",
1771 "var foo, eval;", 1773 "var foo, eval;",
1772 "var foo, arguments;", 1774 "var foo, arguments;",
1773 "try { } catch (eval) { }", 1775 "try { } catch (eval) { }",
1774 "try { } catch (arguments) { }", 1776 "try { } catch (arguments) { }",
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1895 1897
1896 1898
1897 TEST(ErrorsFutureStrictReservedWords) { 1899 TEST(ErrorsFutureStrictReservedWords) {
1898 // Tests that both preparsing and parsing produce the right kind of errors for 1900 // 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, 1901 // 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 1902 // it's ok to use future strict reserved words as identifiers. With the strict
1901 // mode, it isn't. 1903 // mode, it isn't.
1902 const char* context_data[][2] = { 1904 const char* context_data[][2] = {
1903 { "function test_func() {\"use strict\"; ", "}"}, 1905 { "function test_func() {\"use strict\"; ", "}"},
1904 { "() => { \"use strict\"; ", "}" }, 1906 { "() => { \"use strict\"; ", "}" },
1907 { "function test_func() {\"use sanity\"; ", "}"},
1908 { "() => { \"use sanity\"; ", "}" },
1905 { NULL, NULL } 1909 { NULL, NULL }
1906 }; 1910 };
1907 1911
1908 const char* statement_data[] { 1912 const char* statement_data[] {
1909 LIMITED_FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) 1913 LIMITED_FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS)
1910 NULL 1914 NULL
1911 }; 1915 };
1912 1916
1913 RunParserSyncTest(context_data, statement_data, kError); 1917 RunParserSyncTest(context_data, statement_data, kError);
1914 RunParserSyncTest(context_data, statement_data, kError); 1918 RunParserSyncTest(context_data, statement_data, kError);
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
2089 2093
2090 TEST(ErrorsYieldStrict) { 2094 TEST(ErrorsYieldStrict) {
2091 const char* context_data[][2] = { 2095 const char* context_data[][2] = {
2092 { "\"use strict\";", "" }, 2096 { "\"use strict\";", "" },
2093 { "\"use strict\"; function not_gen() {", "}" }, 2097 { "\"use strict\"; function not_gen() {", "}" },
2094 { "function test_func() {\"use strict\"; ", "}"}, 2098 { "function test_func() {\"use strict\"; ", "}"},
2095 { "\"use strict\"; function * gen() { function not_gen() {", "} }" }, 2099 { "\"use strict\"; function * gen() { function not_gen() {", "} }" },
2096 { "\"use strict\"; (function not_gen() {", "})" }, 2100 { "\"use strict\"; (function not_gen() {", "})" },
2097 { "\"use strict\"; (function * gen() { (function not_gen() {", "}) })" }, 2101 { "\"use strict\"; (function * gen() { (function not_gen() {", "}) })" },
2098 { "() => {\"use strict\"; ", "}" }, 2102 { "() => {\"use strict\"; ", "}" },
2103 { "\"use sanity\";", "" },
2104 { "\"use sanity\"; function not_gen() {", "}" },
2105 { "function test_func() {\"use sanity\"; ", "}"},
2106 { "\"use sanity\"; function * gen() { function not_gen() {", "} }" },
2107 { "\"use sanity\"; (function not_gen() {", "})" },
2108 { "\"use sanity\"; (function * gen() { (function not_gen() {", "}) })" },
2109 { "() => {\"use sanity\"; ", "}" },
2099 { NULL, NULL } 2110 { NULL, NULL }
2100 }; 2111 };
2101 2112
2102 const char* statement_data[] = { 2113 const char* statement_data[] = {
2103 "var yield;", 2114 "var yield;",
2104 "var foo, yield;", 2115 "var foo, yield;",
2105 "try { } catch (yield) { }", 2116 "try { } catch (yield) { }",
2106 "function yield() { }", 2117 "function yield() { }",
2107 "(function yield() { })", 2118 "(function yield() { })",
2108 "function foo(yield) { }", 2119 "function foo(yield) { }",
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
2228 RunParserSyncTest(context_data, statement_data, kError); 2239 RunParserSyncTest(context_data, statement_data, kError);
2229 } 2240 }
2230 2241
2231 2242
2232 TEST(ErrorsNameOfStrictFunction) { 2243 TEST(ErrorsNameOfStrictFunction) {
2233 // Tests that illegal tokens as names of a strict function produce the correct 2244 // Tests that illegal tokens as names of a strict function produce the correct
2234 // errors. 2245 // errors.
2235 const char* context_data[][2] = { 2246 const char* context_data[][2] = {
2236 { "function ", ""}, 2247 { "function ", ""},
2237 { "\"use strict\"; function", ""}, 2248 { "\"use strict\"; function", ""},
2249 { "\"use sanity\"; function", ""},
2238 { "function * ", ""}, 2250 { "function * ", ""},
2239 { "\"use strict\"; function * ", ""}, 2251 { "\"use strict\"; function * ", ""},
2252 { "\"use sanity\"; function * ", ""},
2240 { NULL, NULL } 2253 { NULL, NULL }
2241 }; 2254 };
2242 2255
2243 const char* statement_data[] = { 2256 const char* statement_data[] = {
2244 "eval() {\"use strict\";}", 2257 "eval() {\"use strict\";}",
2245 "arguments() {\"use strict\";}", 2258 "arguments() {\"use strict\";}",
2246 "interface() {\"use strict\";}", 2259 "interface() {\"use strict\";}",
2247 "yield() {\"use strict\";}", 2260 "yield() {\"use strict\";}",
2248 // Future reserved words are always illegal 2261 // Future reserved words are always illegal
2249 "function super() { }", 2262 "function super() { }",
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
2308 RunParserSyncTest(context_data, statement_data, kError); 2321 RunParserSyncTest(context_data, statement_data, kError);
2309 } 2322 }
2310 2323
2311 2324
2312 TEST(ErrorsIllegalWordsAsLabelsStrict) { 2325 TEST(ErrorsIllegalWordsAsLabelsStrict) {
2313 // Tests that illegal tokens as labels produce the correct errors. 2326 // Tests that illegal tokens as labels produce the correct errors.
2314 const char* context_data[][2] = { 2327 const char* context_data[][2] = {
2315 { "\"use strict\";", "" }, 2328 { "\"use strict\";", "" },
2316 { "function test_func() {\"use strict\"; ", "}"}, 2329 { "function test_func() {\"use strict\"; ", "}"},
2317 { "() => {\"use strict\"; ", "}" }, 2330 { "() => {\"use strict\"; ", "}" },
2331 { "\"use sanity\";", "" },
2332 { "function test_func() {\"use sanity\"; ", "}"},
2333 { "() => {\"use sanity\"; ", "}" },
2318 { NULL, NULL } 2334 { NULL, NULL }
2319 }; 2335 };
2320 2336
2321 #define LABELLED_WHILE(NAME) #NAME ": while (true) { break " #NAME "; }", 2337 #define LABELLED_WHILE(NAME) #NAME ": while (true) { break " #NAME "; }",
2322 const char* statement_data[] = { 2338 const char* statement_data[] = {
2323 "super: while(true) { break super; }", 2339 "super: while(true) { break super; }",
2324 FUTURE_STRICT_RESERVED_WORDS(LABELLED_WHILE) 2340 FUTURE_STRICT_RESERVED_WORDS(LABELLED_WHILE)
2325 NULL 2341 NULL
2326 }; 2342 };
2327 #undef LABELLED_WHILE 2343 #undef LABELLED_WHILE
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2396 2412
2397 TEST(NoErrorsParenthesizedDirectivePrologue) { 2413 TEST(NoErrorsParenthesizedDirectivePrologue) {
2398 // Parenthesized directive prologue shouldn't be recognized. 2414 // Parenthesized directive prologue shouldn't be recognized.
2399 const char* context_data[][2] = { 2415 const char* context_data[][2] = {
2400 { "", ""}, 2416 { "", ""},
2401 { NULL, NULL } 2417 { NULL, NULL }
2402 }; 2418 };
2403 2419
2404 const char* statement_data[] = { 2420 const char* statement_data[] = {
2405 "(\"use strict\"); var eval;", 2421 "(\"use strict\"); var eval;",
2422 "(\"use sanity\"); var eval;",
2406 NULL 2423 NULL
2407 }; 2424 };
2408 2425
2409 RunParserSyncTest(context_data, statement_data, kSuccess); 2426 RunParserSyncTest(context_data, statement_data, kSuccess);
2410 } 2427 }
2411 2428
2412 2429
2413 TEST(ErrorsNotAnIdentifierName) { 2430 TEST(ErrorsNotAnIdentifierName) {
2414 const char* context_data[][2] = { 2431 const char* context_data[][2] = {
2415 { "", ""}, 2432 { "", ""},
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
2523 {"function foo(bar, eval) {", "}"}, 2540 {"function foo(bar, eval) {", "}"},
2524 {"function foo(bar, arguments) {", "}"}, 2541 {"function foo(bar, arguments) {", "}"},
2525 {"function foo(bar, yield) {", "}"}, 2542 {"function foo(bar, yield) {", "}"},
2526 {"function foo(bar, interface) {", "}"}, 2543 {"function foo(bar, interface) {", "}"},
2527 {"function foo(bar, bar) {", "}"}, 2544 {"function foo(bar, bar) {", "}"},
2528 { NULL, NULL } 2545 { NULL, NULL }
2529 }; 2546 };
2530 2547
2531 const char* strict_statement_data[] = { 2548 const char* strict_statement_data[] = {
2532 "\"use strict\";", 2549 "\"use strict\";",
2550 "\"use sanity\";",
2533 NULL 2551 NULL
2534 }; 2552 };
2535 2553
2536 const char* non_strict_statement_data[] = { 2554 const char* non_strict_statement_data[] = {
2537 ";", 2555 ";",
2538 NULL 2556 NULL
2539 }; 2557 };
2540 2558
2541 RunParserSyncTest(context_data, strict_statement_data, kError); 2559 RunParserSyncTest(context_data, strict_statement_data, kError);
2542 RunParserSyncTest(context_data, non_strict_statement_data, kSuccess); 2560 RunParserSyncTest(context_data, non_strict_statement_data, kSuccess);
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
2824 // The test is quite slow, so run it with a reduced set of flags. 2842 // The test is quite slow, so run it with a reduced set of flags.
2825 static const ParserFlag empty_flags[] = {kAllowLazy}; 2843 static const ParserFlag empty_flags[] = {kAllowLazy};
2826 RunParserSyncTest(context_data, statement_data, kError, empty_flags, 1); 2844 RunParserSyncTest(context_data, statement_data, kError, empty_flags, 1);
2827 } 2845 }
2828 2846
2829 2847
2830 TEST(StrictDelete) { 2848 TEST(StrictDelete) {
2831 // "delete <Identifier>" is not allowed in strict mode. 2849 // "delete <Identifier>" is not allowed in strict mode.
2832 const char* strict_context_data[][2] = { 2850 const char* strict_context_data[][2] = {
2833 {"\"use strict\"; ", ""}, 2851 {"\"use strict\"; ", ""},
2852 {"\"use sanity\"; ", ""},
2834 { NULL, NULL } 2853 { NULL, NULL }
2835 }; 2854 };
2836 2855
2837 const char* sloppy_context_data[][2] = { 2856 const char* sloppy_context_data[][2] = {
2838 {"", ""}, 2857 {"", ""},
2839 { NULL, NULL } 2858 { NULL, NULL }
2840 }; 2859 };
2841 2860
2842 // These are errors in the strict mode. 2861 // These are errors in the strict mode.
2843 const char* sloppy_statement_data[] = { 2862 const char* sloppy_statement_data[] = {
(...skipping 2119 matching lines...) Expand 10 before | Expand all | Expand 10 after
4963 } 4982 }
4964 4983
4965 4984
4966 TEST(DeclarationsError) { 4985 TEST(DeclarationsError) {
4967 const char* context_data[][2] = {{"'use strict'; if (true)", ""}, 4986 const char* context_data[][2] = {{"'use strict'; if (true)", ""},
4968 {"'use strict'; if (false) {} else", ""}, 4987 {"'use strict'; if (false) {} else", ""},
4969 {"'use strict'; while (false)", ""}, 4988 {"'use strict'; while (false)", ""},
4970 {"'use strict'; for (;;)", ""}, 4989 {"'use strict'; for (;;)", ""},
4971 {"'use strict'; for (x in y)", ""}, 4990 {"'use strict'; for (x in y)", ""},
4972 {"'use strict'; do ", " while (false)"}, 4991 {"'use strict'; do ", " while (false)"},
4992 {"'use sanity'; if (true)", ""},
4993 {"'use sanity'; if (false) {} else", ""},
4994 {"'use sanity'; while (false)", ""},
4995 {"'use sanity'; for (;;)", ""},
4996 {"'use sanity'; for (x in y)", ""},
4997 {"'use sanity'; do ", " while (false)"},
4973 {NULL, NULL}}; 4998 {NULL, NULL}};
rossberg 2015/02/04 16:18:09 Maybe add a test checking multiple directives.
marja 2015/02/05 12:11:37 Done.
4974 4999
4975 const char* statement_data[] = { 5000 const char* statement_data[] = {
4976 "let x = 1;", 5001 "let x = 1;",
4977 "const x = 1;", 5002 "const x = 1;",
4978 "class C {}", 5003 "class C {}",
4979 NULL}; 5004 NULL};
4980 5005
4981 static const ParserFlag always_flags[] = { 5006 static const ParserFlag always_flags[] = {
4982 kAllowHarmonyClasses, kAllowHarmonyScoping 5007 kAllowHarmonyClasses, kAllowHarmonyScoping
4983 }; 5008 };
4984 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, 5009 RunParserSyncTest(context_data, statement_data, kError, NULL, 0,
4985 always_flags, arraysize(always_flags)); 5010 always_flags, arraysize(always_flags));
4986 } 5011 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698