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 1491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1502 | 1502 |
1503 enum ParserFlag { | 1503 enum ParserFlag { |
1504 kAllowLazy, | 1504 kAllowLazy, |
1505 kAllowNatives, | 1505 kAllowNatives, |
1506 kAllowHarmonyDefaultParameters, | 1506 kAllowHarmonyDefaultParameters, |
1507 kAllowHarmonySloppy, | 1507 kAllowHarmonySloppy, |
1508 kAllowHarmonySloppyLet, | 1508 kAllowHarmonySloppyLet, |
1509 kAllowHarmonyDestructuring, | 1509 kAllowHarmonyDestructuring, |
1510 kAllowHarmonyDestructuringAssignment, | 1510 kAllowHarmonyDestructuringAssignment, |
1511 kAllowHarmonyNewTarget, | 1511 kAllowHarmonyNewTarget, |
1512 kAllowStrongMode, | |
1513 kNoLegacyConst, | 1512 kNoLegacyConst, |
1514 kAllowHarmonyFunctionSent, | 1513 kAllowHarmonyFunctionSent, |
1515 kAllowHarmonyRestrictiveDeclarations, | 1514 kAllowHarmonyRestrictiveDeclarations, |
1516 }; | 1515 }; |
1517 | 1516 |
1518 enum ParserSyncTestResult { | 1517 enum ParserSyncTestResult { |
1519 kSuccessOrError, | 1518 kSuccessOrError, |
1520 kSuccess, | 1519 kSuccess, |
1521 kError | 1520 kError |
1522 }; | 1521 }; |
1523 | 1522 |
1524 template <typename Traits> | 1523 template <typename Traits> |
1525 void SetParserFlags(i::ParserBase<Traits>* parser, | 1524 void SetParserFlags(i::ParserBase<Traits>* parser, |
1526 i::EnumSet<ParserFlag> flags) { | 1525 i::EnumSet<ParserFlag> flags) { |
1527 parser->set_allow_lazy(flags.Contains(kAllowLazy)); | 1526 parser->set_allow_lazy(flags.Contains(kAllowLazy)); |
1528 parser->set_allow_natives(flags.Contains(kAllowNatives)); | 1527 parser->set_allow_natives(flags.Contains(kAllowNatives)); |
1529 parser->set_allow_harmony_default_parameters( | 1528 parser->set_allow_harmony_default_parameters( |
1530 flags.Contains(kAllowHarmonyDefaultParameters)); | 1529 flags.Contains(kAllowHarmonyDefaultParameters)); |
1531 parser->set_allow_harmony_sloppy(flags.Contains(kAllowHarmonySloppy)); | 1530 parser->set_allow_harmony_sloppy(flags.Contains(kAllowHarmonySloppy)); |
1532 parser->set_allow_harmony_sloppy_let(flags.Contains(kAllowHarmonySloppyLet)); | 1531 parser->set_allow_harmony_sloppy_let(flags.Contains(kAllowHarmonySloppyLet)); |
1533 parser->set_allow_harmony_destructuring_bind( | 1532 parser->set_allow_harmony_destructuring_bind( |
1534 flags.Contains(kAllowHarmonyDestructuring)); | 1533 flags.Contains(kAllowHarmonyDestructuring)); |
1535 parser->set_allow_harmony_destructuring_assignment( | 1534 parser->set_allow_harmony_destructuring_assignment( |
1536 flags.Contains(kAllowHarmonyDestructuringAssignment)); | 1535 flags.Contains(kAllowHarmonyDestructuringAssignment)); |
1537 parser->set_allow_strong_mode(flags.Contains(kAllowStrongMode)); | |
1538 parser->set_allow_legacy_const(!flags.Contains(kNoLegacyConst)); | 1536 parser->set_allow_legacy_const(!flags.Contains(kNoLegacyConst)); |
1539 parser->set_allow_harmony_function_sent( | 1537 parser->set_allow_harmony_function_sent( |
1540 flags.Contains(kAllowHarmonyFunctionSent)); | 1538 flags.Contains(kAllowHarmonyFunctionSent)); |
1541 parser->set_allow_harmony_restrictive_declarations( | 1539 parser->set_allow_harmony_restrictive_declarations( |
1542 flags.Contains(kAllowHarmonyRestrictiveDeclarations)); | 1540 flags.Contains(kAllowHarmonyRestrictiveDeclarations)); |
1543 } | 1541 } |
1544 | 1542 |
1545 | 1543 |
1546 void TestParserSyncWithFlags(i::Handle<i::String> source, | 1544 void TestParserSyncWithFlags(i::Handle<i::String> source, |
1547 i::EnumSet<ParserFlag> flags, | 1545 i::EnumSet<ParserFlag> flags, |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1922 } | 1920 } |
1923 | 1921 |
1924 | 1922 |
1925 TEST(ErrorsEvalAndArguments) { | 1923 TEST(ErrorsEvalAndArguments) { |
1926 // Tests that both preparsing and parsing produce the right kind of errors for | 1924 // Tests that both preparsing and parsing produce the right kind of errors for |
1927 // using "eval" and "arguments" as identifiers. Without the strict mode, it's | 1925 // using "eval" and "arguments" as identifiers. Without the strict mode, it's |
1928 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it | 1926 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it |
1929 // isn't. | 1927 // isn't. |
1930 const char* context_data[][2] = { | 1928 const char* context_data[][2] = { |
1931 {"\"use strict\";", ""}, | 1929 {"\"use strict\";", ""}, |
1932 {"\"use strong\";", ""}, | |
1933 {"var eval; function test_func() {\"use strict\"; ", "}"}, | 1930 {"var eval; function test_func() {\"use strict\"; ", "}"}, |
1934 {"var eval; function test_func() {\"use strong\"; ", "}"}, | |
1935 {NULL, NULL}}; | 1931 {NULL, NULL}}; |
1936 | 1932 |
1937 const char* statement_data[] = { | 1933 const char* statement_data[] = { |
1938 "var eval;", | 1934 "var eval;", |
1939 "var arguments", | 1935 "var arguments", |
1940 "var foo, eval;", | 1936 "var foo, eval;", |
1941 "var foo, arguments;", | 1937 "var foo, arguments;", |
1942 "try { } catch (eval) { }", | 1938 "try { } catch (eval) { }", |
1943 "try { } catch (arguments) { }", | 1939 "try { } catch (arguments) { }", |
1944 "function eval() { }", | 1940 "function eval() { }", |
(...skipping 10 matching lines...) Expand all Loading... |
1955 "arguments = 1;", | 1951 "arguments = 1;", |
1956 "var foo = eval = 1;", | 1952 "var foo = eval = 1;", |
1957 "var foo = arguments = 1;", | 1953 "var foo = arguments = 1;", |
1958 "++eval;", | 1954 "++eval;", |
1959 "++arguments;", | 1955 "++arguments;", |
1960 "eval++;", | 1956 "eval++;", |
1961 "arguments++;", | 1957 "arguments++;", |
1962 NULL | 1958 NULL |
1963 }; | 1959 }; |
1964 | 1960 |
1965 static const ParserFlag always_flags[] = {kAllowStrongMode}; | 1961 RunParserSyncTest(context_data, statement_data, kError); |
1966 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, | |
1967 arraysize(always_flags)); | |
1968 } | 1962 } |
1969 | 1963 |
1970 | 1964 |
1971 TEST(NoErrorsEvalAndArgumentsSloppy) { | 1965 TEST(NoErrorsEvalAndArgumentsSloppy) { |
1972 // Tests that both preparsing and parsing accept "eval" and "arguments" as | 1966 // Tests that both preparsing and parsing accept "eval" and "arguments" as |
1973 // identifiers when needed. | 1967 // identifiers when needed. |
1974 const char* context_data[][2] = { | 1968 const char* context_data[][2] = { |
1975 { "", "" }, | 1969 { "", "" }, |
1976 { "function test_func() {", "}"}, | 1970 { "function test_func() {", "}"}, |
1977 { NULL, NULL } | 1971 { NULL, NULL } |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2064 | 2058 |
2065 | 2059 |
2066 TEST(ErrorsFutureStrictReservedWords) { | 2060 TEST(ErrorsFutureStrictReservedWords) { |
2067 // Tests that both preparsing and parsing produce the right kind of errors for | 2061 // Tests that both preparsing and parsing produce the right kind of errors for |
2068 // using future strict reserved words as identifiers. Without the strict mode, | 2062 // using future strict reserved words as identifiers. Without the strict mode, |
2069 // it's ok to use future strict reserved words as identifiers. With the strict | 2063 // it's ok to use future strict reserved words as identifiers. With the strict |
2070 // mode, it isn't. | 2064 // mode, it isn't. |
2071 const char* context_data[][2] = { | 2065 const char* context_data[][2] = { |
2072 {"function test_func() {\"use strict\"; ", "}"}, | 2066 {"function test_func() {\"use strict\"; ", "}"}, |
2073 {"() => { \"use strict\"; ", "}"}, | 2067 {"() => { \"use strict\"; ", "}"}, |
2074 {"function test_func() {\"use strong\"; ", "}"}, | |
2075 {"() => { \"use strong\"; ", "}"}, | |
2076 {NULL, NULL}}; | 2068 {NULL, NULL}}; |
2077 | 2069 |
2078 const char* statement_data[] { | 2070 const char* statement_data[] { |
2079 LIMITED_FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) | 2071 LIMITED_FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) |
2080 NULL | 2072 NULL |
2081 }; | 2073 }; |
2082 | 2074 |
2083 static const ParserFlag always_flags[] = {kAllowStrongMode}; | 2075 RunParserSyncTest(context_data, statement_data, kError); |
2084 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, | |
2085 arraysize(always_flags)); | |
2086 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, | |
2087 arraysize(always_flags)); | |
2088 } | 2076 } |
2089 | 2077 |
2090 | 2078 |
2091 #undef LIMITED_FUTURE_STRICT_RESERVED_WORDS | 2079 #undef LIMITED_FUTURE_STRICT_RESERVED_WORDS |
2092 | 2080 |
2093 | 2081 |
2094 TEST(NoErrorsFutureStrictReservedWords) { | 2082 TEST(NoErrorsFutureStrictReservedWords) { |
2095 const char* context_data[][2] = { | 2083 const char* context_data[][2] = { |
2096 { "", "" }, | 2084 { "", "" }, |
2097 { "function test_func() {", "}"}, | 2085 { "function test_func() {", "}"}, |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2254 | 2242 |
2255 TEST(ErrorsYieldStrict) { | 2243 TEST(ErrorsYieldStrict) { |
2256 const char* context_data[][2] = { | 2244 const char* context_data[][2] = { |
2257 {"\"use strict\";", ""}, | 2245 {"\"use strict\";", ""}, |
2258 {"\"use strict\"; function not_gen() {", "}"}, | 2246 {"\"use strict\"; function not_gen() {", "}"}, |
2259 {"function test_func() {\"use strict\"; ", "}"}, | 2247 {"function test_func() {\"use strict\"; ", "}"}, |
2260 {"\"use strict\"; function * gen() { function not_gen() {", "} }"}, | 2248 {"\"use strict\"; function * gen() { function not_gen() {", "} }"}, |
2261 {"\"use strict\"; (function not_gen() {", "})"}, | 2249 {"\"use strict\"; (function not_gen() {", "})"}, |
2262 {"\"use strict\"; (function * gen() { (function not_gen() {", "}) })"}, | 2250 {"\"use strict\"; (function * gen() { (function not_gen() {", "}) })"}, |
2263 {"() => {\"use strict\"; ", "}"}, | 2251 {"() => {\"use strict\"; ", "}"}, |
2264 {"\"use strong\";", ""}, | |
2265 {"\"use strong\"; function not_gen() {", "}"}, | |
2266 {"function test_func() {\"use strong\"; ", "}"}, | |
2267 {"\"use strong\"; function * gen() { function not_gen() {", "} }"}, | |
2268 {"\"use strong\"; (function not_gen() {", "})"}, | |
2269 {"\"use strong\"; (function * gen() { (function not_gen() {", "}) })"}, | |
2270 {"() => {\"use strong\"; ", "}"}, | |
2271 {NULL, NULL}}; | 2252 {NULL, NULL}}; |
2272 | 2253 |
2273 const char* statement_data[] = { | 2254 const char* statement_data[] = { |
2274 "var yield;", | 2255 "var yield;", |
2275 "var foo, yield;", | 2256 "var foo, yield;", |
2276 "try { } catch (yield) { }", | 2257 "try { } catch (yield) { }", |
2277 "function yield() { }", | 2258 "function yield() { }", |
2278 "(function yield() { })", | 2259 "(function yield() { })", |
2279 "function foo(yield) { }", | 2260 "function foo(yield) { }", |
2280 "function foo(bar, yield) { }", | 2261 "function foo(bar, yield) { }", |
2281 "function * yield() { }", | 2262 "function * yield() { }", |
2282 "(function * yield() { })", | 2263 "(function * yield() { })", |
2283 "yield = 1;", | 2264 "yield = 1;", |
2284 "var foo = yield = 1;", | 2265 "var foo = yield = 1;", |
2285 "++yield;", | 2266 "++yield;", |
2286 "yield++;", | 2267 "yield++;", |
2287 "yield: 34;", | 2268 "yield: 34;", |
2288 NULL | 2269 NULL |
2289 }; | 2270 }; |
2290 | 2271 |
2291 static const ParserFlag always_flags[] = {kAllowStrongMode}; | 2272 RunParserSyncTest(context_data, statement_data, kError); |
2292 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, | |
2293 arraysize(always_flags)); | |
2294 } | 2273 } |
2295 | 2274 |
2296 | 2275 |
2297 TEST(ErrorsYieldSloppy) { | 2276 TEST(ErrorsYieldSloppy) { |
2298 const char* context_data[][2] = { | 2277 const char* context_data[][2] = { |
2299 { "", "" }, | 2278 { "", "" }, |
2300 { "function not_gen() {", "}" }, | 2279 { "function not_gen() {", "}" }, |
2301 { "(function not_gen() {", "})" }, | 2280 { "(function not_gen() {", "})" }, |
2302 { NULL, NULL } | 2281 { NULL, NULL } |
2303 }; | 2282 }; |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2437 RunParserSyncTest(context_data, statement_data, kError); | 2416 RunParserSyncTest(context_data, statement_data, kError); |
2438 } | 2417 } |
2439 | 2418 |
2440 | 2419 |
2441 TEST(ErrorsNameOfStrictFunction) { | 2420 TEST(ErrorsNameOfStrictFunction) { |
2442 // Tests that illegal tokens as names of a strict function produce the correct | 2421 // Tests that illegal tokens as names of a strict function produce the correct |
2443 // errors. | 2422 // errors. |
2444 const char* context_data[][2] = { | 2423 const char* context_data[][2] = { |
2445 { "function ", ""}, | 2424 { "function ", ""}, |
2446 { "\"use strict\"; function", ""}, | 2425 { "\"use strict\"; function", ""}, |
2447 { "\"use strong\"; function", ""}, | |
2448 { "function * ", ""}, | 2426 { "function * ", ""}, |
2449 { "\"use strict\"; function * ", ""}, | 2427 { "\"use strict\"; function * ", ""}, |
2450 { "\"use strong\"; function * ", ""}, | |
2451 { NULL, NULL } | 2428 { NULL, NULL } |
2452 }; | 2429 }; |
2453 | 2430 |
2454 const char* statement_data[] = { | 2431 const char* statement_data[] = { |
2455 "eval() {\"use strict\";}", | 2432 "eval() {\"use strict\";}", |
2456 "arguments() {\"use strict\";}", | 2433 "arguments() {\"use strict\";}", |
2457 "interface() {\"use strict\";}", | 2434 "interface() {\"use strict\";}", |
2458 "yield() {\"use strict\";}", | 2435 "yield() {\"use strict\";}", |
2459 // Future reserved words are always illegal | 2436 // Future reserved words are always illegal |
2460 "super() { }", | 2437 "super() { }", |
2461 "super() {\"use strict\";}", | 2438 "super() {\"use strict\";}", |
2462 NULL | 2439 NULL |
2463 }; | 2440 }; |
2464 | 2441 |
2465 static const ParserFlag always_flags[] = {kAllowStrongMode}; | 2442 RunParserSyncTest(context_data, statement_data, kError); |
2466 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, | |
2467 arraysize(always_flags)); | |
2468 } | 2443 } |
2469 | 2444 |
2470 | 2445 |
2471 TEST(NoErrorsNameOfStrictFunction) { | 2446 TEST(NoErrorsNameOfStrictFunction) { |
2472 const char* context_data[][2] = { | 2447 const char* context_data[][2] = { |
2473 { "function ", ""}, | 2448 { "function ", ""}, |
2474 { NULL, NULL } | 2449 { NULL, NULL } |
2475 }; | 2450 }; |
2476 | 2451 |
2477 const char* statement_data[] = { | 2452 const char* statement_data[] = { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2521 RunParserSyncTest(context_data, statement_data, kError); | 2496 RunParserSyncTest(context_data, statement_data, kError); |
2522 } | 2497 } |
2523 | 2498 |
2524 | 2499 |
2525 TEST(ErrorsIllegalWordsAsLabelsStrict) { | 2500 TEST(ErrorsIllegalWordsAsLabelsStrict) { |
2526 // Tests that illegal tokens as labels produce the correct errors. | 2501 // Tests that illegal tokens as labels produce the correct errors. |
2527 const char* context_data[][2] = { | 2502 const char* context_data[][2] = { |
2528 {"\"use strict\";", ""}, | 2503 {"\"use strict\";", ""}, |
2529 {"function test_func() {\"use strict\"; ", "}"}, | 2504 {"function test_func() {\"use strict\"; ", "}"}, |
2530 {"() => {\"use strict\"; ", "}"}, | 2505 {"() => {\"use strict\"; ", "}"}, |
2531 {"\"use strong\";", ""}, | |
2532 {"function test_func() {\"use strong\"; ", "}"}, | |
2533 {"() => {\"use strong\"; ", "}"}, | |
2534 {NULL, NULL}}; | 2506 {NULL, NULL}}; |
2535 | 2507 |
2536 #define LABELLED_WHILE(NAME) #NAME ": while (true) { break " #NAME "; }", | 2508 #define LABELLED_WHILE(NAME) #NAME ": while (true) { break " #NAME "; }", |
2537 const char* statement_data[] = { | 2509 const char* statement_data[] = { |
2538 "super: while(true) { break super; }", | 2510 "super: while(true) { break super; }", |
2539 FUTURE_STRICT_RESERVED_WORDS(LABELLED_WHILE) | 2511 FUTURE_STRICT_RESERVED_WORDS(LABELLED_WHILE) |
2540 NULL | 2512 NULL |
2541 }; | 2513 }; |
2542 #undef LABELLED_WHILE | 2514 #undef LABELLED_WHILE |
2543 | 2515 |
2544 static const ParserFlag always_flags[] = {kAllowStrongMode}; | 2516 RunParserSyncTest(context_data, statement_data, kError); |
2545 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, | |
2546 arraysize(always_flags)); | |
2547 } | 2517 } |
2548 | 2518 |
2549 | 2519 |
2550 TEST(NoErrorsIllegalWordsAsLabels) { | 2520 TEST(NoErrorsIllegalWordsAsLabels) { |
2551 // Using eval and arguments as labels is legal even in strict mode. | 2521 // Using eval and arguments as labels is legal even in strict mode. |
2552 const char* context_data[][2] = { | 2522 const char* context_data[][2] = { |
2553 { "", ""}, | 2523 { "", ""}, |
2554 { "function test_func() {", "}" }, | 2524 { "function test_func() {", "}" }, |
2555 { "() => {", "}" }, | 2525 { "() => {", "}" }, |
2556 { "\"use strict\";", "" }, | 2526 { "\"use strict\";", "" }, |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2609 | 2579 |
2610 TEST(NoErrorsParenthesizedDirectivePrologue) { | 2580 TEST(NoErrorsParenthesizedDirectivePrologue) { |
2611 // Parenthesized directive prologue shouldn't be recognized. | 2581 // Parenthesized directive prologue shouldn't be recognized. |
2612 const char* context_data[][2] = { | 2582 const char* context_data[][2] = { |
2613 { "", ""}, | 2583 { "", ""}, |
2614 { NULL, NULL } | 2584 { NULL, NULL } |
2615 }; | 2585 }; |
2616 | 2586 |
2617 const char* statement_data[] = { | 2587 const char* statement_data[] = { |
2618 "(\"use strict\"); var eval;", | 2588 "(\"use strict\"); var eval;", |
2619 "(\"use strong\"); var eval;", | |
2620 NULL | 2589 NULL |
2621 }; | 2590 }; |
2622 | 2591 |
2623 static const ParserFlag always_flags[] = {kAllowStrongMode}; | 2592 RunParserSyncTest(context_data, statement_data, kSuccess); |
2624 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | |
2625 always_flags, arraysize(always_flags)); | |
2626 } | 2593 } |
2627 | 2594 |
2628 | 2595 |
2629 TEST(ErrorsNotAnIdentifierName) { | 2596 TEST(ErrorsNotAnIdentifierName) { |
2630 const char* context_data[][2] = { | 2597 const char* context_data[][2] = { |
2631 { "", ""}, | 2598 { "", ""}, |
2632 { "\"use strict\";", ""}, | 2599 { "\"use strict\";", ""}, |
2633 { NULL, NULL } | 2600 { NULL, NULL } |
2634 }; | 2601 }; |
2635 | 2602 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2743 {"function foo(bar, eval) {", "}"}, | 2710 {"function foo(bar, eval) {", "}"}, |
2744 {"function foo(bar, arguments) {", "}"}, | 2711 {"function foo(bar, arguments) {", "}"}, |
2745 {"function foo(bar, yield) {", "}"}, | 2712 {"function foo(bar, yield) {", "}"}, |
2746 {"function foo(bar, interface) {", "}"}, | 2713 {"function foo(bar, interface) {", "}"}, |
2747 {"function foo(bar, bar) {", "}"}, | 2714 {"function foo(bar, bar) {", "}"}, |
2748 { NULL, NULL } | 2715 { NULL, NULL } |
2749 }; | 2716 }; |
2750 | 2717 |
2751 const char* strict_statement_data[] = { | 2718 const char* strict_statement_data[] = { |
2752 "\"use strict\";", | 2719 "\"use strict\";", |
2753 "\"use strong\";", | |
2754 NULL | 2720 NULL |
2755 }; | 2721 }; |
2756 | 2722 |
2757 const char* non_strict_statement_data[] = { | 2723 const char* non_strict_statement_data[] = { |
2758 ";", | 2724 ";", |
2759 NULL | 2725 NULL |
2760 }; | 2726 }; |
2761 | 2727 |
2762 static const ParserFlag always_flags[] = {kAllowStrongMode}; | 2728 RunParserSyncTest(context_data, strict_statement_data, kError); |
2763 RunParserSyncTest(context_data, strict_statement_data, kError, NULL, 0, | 2729 RunParserSyncTest(context_data, non_strict_statement_data, kSuccess); |
2764 always_flags, arraysize(always_flags)); | |
2765 RunParserSyncTest(context_data, non_strict_statement_data, kSuccess, NULL, 0, | |
2766 always_flags, arraysize(always_flags)); | |
2767 } | 2730 } |
2768 | 2731 |
2769 | 2732 |
2770 TEST(ErrorsTryWithoutCatchOrFinally) { | 2733 TEST(ErrorsTryWithoutCatchOrFinally) { |
2771 const char* context_data[][2] = { | 2734 const char* context_data[][2] = { |
2772 {"", ""}, | 2735 {"", ""}, |
2773 { NULL, NULL } | 2736 { NULL, NULL } |
2774 }; | 2737 }; |
2775 | 2738 |
2776 const char* statement_data[] = { | 2739 const char* statement_data[] = { |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3024 }; | 2987 }; |
3025 | 2988 |
3026 // The test is quite slow, so run it with a reduced set of flags. | 2989 // The test is quite slow, so run it with a reduced set of flags. |
3027 static const ParserFlag empty_flags[] = {kAllowLazy}; | 2990 static const ParserFlag empty_flags[] = {kAllowLazy}; |
3028 RunParserSyncTest(context_data, statement_data, kError, empty_flags, 1); | 2991 RunParserSyncTest(context_data, statement_data, kError, empty_flags, 1); |
3029 } | 2992 } |
3030 | 2993 |
3031 | 2994 |
3032 TEST(StrictDelete) { | 2995 TEST(StrictDelete) { |
3033 // "delete <Identifier>" is not allowed in strict mode. | 2996 // "delete <Identifier>" is not allowed in strict mode. |
3034 const char* strong_context_data[][2] = { | |
3035 {"\"use strong\"; ", ""}, | |
3036 { NULL, NULL } | |
3037 }; | |
3038 | |
3039 const char* strict_context_data[][2] = { | 2997 const char* strict_context_data[][2] = { |
3040 {"\"use strict\"; ", ""}, | 2998 {"\"use strict\"; ", ""}, |
3041 { NULL, NULL } | 2999 { NULL, NULL } |
3042 }; | 3000 }; |
3043 | 3001 |
3044 const char* sloppy_context_data[][2] = { | 3002 const char* sloppy_context_data[][2] = { |
3045 {"", ""}, | 3003 {"", ""}, |
3046 { NULL, NULL } | 3004 { NULL, NULL } |
3047 }; | 3005 }; |
3048 | 3006 |
(...skipping 21 matching lines...) Expand all Loading... |
3070 "delete new foo(bar);", | 3028 "delete new foo(bar);", |
3071 NULL | 3029 NULL |
3072 }; | 3030 }; |
3073 | 3031 |
3074 // These are always errors | 3032 // These are always errors |
3075 const char* bad_statement_data[] = { | 3033 const char* bad_statement_data[] = { |
3076 "delete if;", | 3034 "delete if;", |
3077 NULL | 3035 NULL |
3078 }; | 3036 }; |
3079 | 3037 |
3080 static const ParserFlag always_flags[] = {kAllowStrongMode}; | 3038 RunParserSyncTest(strict_context_data, sloppy_statement_data, kError); |
3081 RunParserSyncTest(strong_context_data, sloppy_statement_data, kError, NULL, 0, | 3039 RunParserSyncTest(sloppy_context_data, sloppy_statement_data, kSuccess); |
3082 always_flags, arraysize(always_flags)); | |
3083 RunParserSyncTest(strict_context_data, sloppy_statement_data, kError, NULL, 0, | |
3084 always_flags, arraysize(always_flags)); | |
3085 RunParserSyncTest(sloppy_context_data, sloppy_statement_data, kSuccess, NULL, | |
3086 0, always_flags, arraysize(always_flags)); | |
3087 | 3040 |
3088 RunParserSyncTest(strong_context_data, good_statement_data, kError, NULL, 0, | 3041 RunParserSyncTest(strict_context_data, good_statement_data, kSuccess); |
3089 always_flags, arraysize(always_flags)); | 3042 RunParserSyncTest(sloppy_context_data, good_statement_data, kSuccess); |
3090 RunParserSyncTest(strict_context_data, good_statement_data, kSuccess, NULL, 0, | |
3091 always_flags, arraysize(always_flags)); | |
3092 RunParserSyncTest(sloppy_context_data, good_statement_data, kSuccess, NULL, 0, | |
3093 always_flags, arraysize(always_flags)); | |
3094 | 3043 |
3095 RunParserSyncTest(strong_context_data, bad_statement_data, kError, NULL, 0, | 3044 RunParserSyncTest(strict_context_data, bad_statement_data, kError); |
3096 always_flags, arraysize(always_flags)); | 3045 RunParserSyncTest(sloppy_context_data, bad_statement_data, kError); |
3097 RunParserSyncTest(strict_context_data, bad_statement_data, kError, NULL, 0, | |
3098 always_flags, arraysize(always_flags)); | |
3099 RunParserSyncTest(sloppy_context_data, bad_statement_data, kError, NULL, 0, | |
3100 always_flags, arraysize(always_flags)); | |
3101 } | 3046 } |
3102 | 3047 |
3103 | 3048 |
3104 TEST(NoErrorsDeclsInCase) { | 3049 TEST(NoErrorsDeclsInCase) { |
3105 const char* context_data[][2] = { | 3050 const char* context_data[][2] = { |
3106 {"'use strict'; switch(x) { case 1:", "}"}, | 3051 {"'use strict'; switch(x) { case 1:", "}"}, |
3107 {"function foo() {'use strict'; switch(x) { case 1:", "}}"}, | 3052 {"function foo() {'use strict'; switch(x) { case 1:", "}}"}, |
3108 {"'use strict'; switch(x) { case 1: case 2:", "}"}, | 3053 {"'use strict'; switch(x) { case 1: case 2:", "}"}, |
3109 {"function foo() {'use strict'; switch(x) { case 1: case 2:", "}}"}, | 3054 {"function foo() {'use strict'; switch(x) { case 1: case 2:", "}}"}, |
3110 {"'use strict'; switch(x) { default:", "}"}, | 3055 {"'use strict'; switch(x) { default:", "}"}, |
(...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3918 // ensure that nested expressions can still use the 'in' operator, | 3863 // ensure that nested expressions can still use the 'in' operator, |
3919 const char* loop_context_data[][2] = {{"for (", "; 0;);"}, | 3864 const char* loop_context_data[][2] = {{"for (", "; 0;);"}, |
3920 {nullptr, nullptr}}; | 3865 {nullptr, nullptr}}; |
3921 const char* loop_expr_data[] = {"f => ('key' in {})", nullptr}; | 3866 const char* loop_expr_data[] = {"f => ('key' in {})", nullptr}; |
3922 RunParserSyncTest(loop_context_data, loop_expr_data, kSuccess, flags, | 3867 RunParserSyncTest(loop_context_data, loop_expr_data, kSuccess, flags, |
3923 arraysize(flags)); | 3868 arraysize(flags)); |
3924 } | 3869 } |
3925 | 3870 |
3926 | 3871 |
3927 TEST(ArrowFunctionsSloppyParameterNames) { | 3872 TEST(ArrowFunctionsSloppyParameterNames) { |
3928 const char* strong_context_data[][2] = { | |
3929 {"'use strong'; ", ";"}, | |
3930 {"'use strong'; bar ? (", ") : baz;"}, | |
3931 {"'use strong'; bar ? baz : (", ");"}, | |
3932 {"'use strong'; bar, ", ";"}, | |
3933 {"'use strong'; ", ", bar;"}, | |
3934 {NULL, NULL} | |
3935 }; | |
3936 | |
3937 const char* strict_context_data[][2] = { | 3873 const char* strict_context_data[][2] = { |
3938 {"'use strict'; ", ";"}, | 3874 {"'use strict'; ", ";"}, |
3939 {"'use strict'; bar ? (", ") : baz;"}, | 3875 {"'use strict'; bar ? (", ") : baz;"}, |
3940 {"'use strict'; bar ? baz : (", ");"}, | 3876 {"'use strict'; bar ? baz : (", ");"}, |
3941 {"'use strict'; bar, ", ";"}, | 3877 {"'use strict'; bar, ", ";"}, |
3942 {"'use strict'; ", ", bar;"}, | 3878 {"'use strict'; ", ", bar;"}, |
3943 {NULL, NULL} | 3879 {NULL, NULL} |
3944 }; | 3880 }; |
3945 | 3881 |
3946 const char* sloppy_context_data[][2] = { | 3882 const char* sloppy_context_data[][2] = { |
(...skipping 19 matching lines...) Expand all Loading... |
3966 "(bar, arguments) => {}", | 3902 "(bar, arguments) => {}", |
3967 "(bar, yield) => {}", | 3903 "(bar, yield) => {}", |
3968 "(bar, interface) => {}", | 3904 "(bar, interface) => {}", |
3969 "(interface, eval) => {}", | 3905 "(interface, eval) => {}", |
3970 "(interface, arguments) => {}", | 3906 "(interface, arguments) => {}", |
3971 "(eval, interface) => {}", | 3907 "(eval, interface) => {}", |
3972 "(arguments, interface) => {}", | 3908 "(arguments, interface) => {}", |
3973 NULL | 3909 NULL |
3974 }; | 3910 }; |
3975 | 3911 |
3976 static const ParserFlag always_flags[] = {kAllowStrongMode}; | 3912 RunParserSyncTest(strict_context_data, statement_data, kError); |
3977 RunParserSyncTest(strong_context_data, statement_data, kError, NULL, 0, | 3913 RunParserSyncTest(sloppy_context_data, statement_data, kSuccess); |
3978 always_flags, arraysize(always_flags)); | |
3979 RunParserSyncTest(strict_context_data, statement_data, kError, NULL, 0, | |
3980 always_flags, arraysize(always_flags)); | |
3981 RunParserSyncTest(sloppy_context_data, statement_data, kSuccess, NULL, 0, | |
3982 always_flags, arraysize(always_flags)); | |
3983 } | 3914 } |
3984 | 3915 |
3985 | 3916 |
3986 TEST(ArrowFunctionsYieldParameterNameInGenerator) { | 3917 TEST(ArrowFunctionsYieldParameterNameInGenerator) { |
3987 const char* sloppy_function_context_data[][2] = { | 3918 const char* sloppy_function_context_data[][2] = { |
3988 {"(function f() { (", "); });"}, | 3919 {"(function f() { (", "); });"}, |
3989 {NULL, NULL} | 3920 {NULL, NULL} |
3990 }; | 3921 }; |
3991 | 3922 |
3992 const char* strict_function_context_data[][2] = { | 3923 const char* strict_function_context_data[][2] = { |
3993 {"(function f() {'use strong'; (", "); });"}, | |
3994 {"(function f() {'use strict'; (", "); });"}, | 3924 {"(function f() {'use strict'; (", "); });"}, |
3995 {NULL, NULL} | 3925 {NULL, NULL} |
3996 }; | 3926 }; |
3997 | 3927 |
3998 const char* generator_context_data[][2] = { | 3928 const char* generator_context_data[][2] = { |
3999 {"(function *g() {'use strong'; (", "); });"}, | |
4000 {"(function *g() {'use strict'; (", "); });"}, | 3929 {"(function *g() {'use strict'; (", "); });"}, |
4001 {"(function *g() { (", "); });"}, | 3930 {"(function *g() { (", "); });"}, |
4002 {NULL, NULL} | 3931 {NULL, NULL} |
4003 }; | 3932 }; |
4004 | 3933 |
4005 const char* arrow_data[] = { | 3934 const char* arrow_data[] = { |
4006 "yield => {}", | 3935 "yield => {}", |
4007 "(yield) => {}", | 3936 "(yield) => {}", |
4008 "(a, yield) => {}", | 3937 "(a, yield) => {}", |
4009 "(yield, a) => {}", | 3938 "(yield, a) => {}", |
4010 "(yield, ...a) => {}", | 3939 "(yield, ...a) => {}", |
4011 "(a, ...yield) => {}", | 3940 "(a, ...yield) => {}", |
4012 "({yield}) => {}", | 3941 "({yield}) => {}", |
4013 "([yield]) => {}", | 3942 "([yield]) => {}", |
4014 NULL | 3943 NULL |
4015 }; | 3944 }; |
4016 | 3945 |
4017 static const ParserFlag always_flags[] = { kAllowHarmonyDestructuring, | 3946 static const ParserFlag always_flags[] = { kAllowHarmonyDestructuring }; |
4018 kAllowStrongMode}; | |
4019 RunParserSyncTest(sloppy_function_context_data, arrow_data, kSuccess, NULL, 0, | 3947 RunParserSyncTest(sloppy_function_context_data, arrow_data, kSuccess, NULL, 0, |
4020 always_flags, arraysize(always_flags)); | 3948 always_flags, arraysize(always_flags)); |
4021 RunParserSyncTest(strict_function_context_data, arrow_data, kError, NULL, 0, | 3949 RunParserSyncTest(strict_function_context_data, arrow_data, kError, NULL, 0, |
4022 always_flags, arraysize(always_flags)); | 3950 always_flags, arraysize(always_flags)); |
4023 RunParserSyncTest(generator_context_data, arrow_data, kError, NULL, 0, | 3951 RunParserSyncTest(generator_context_data, arrow_data, kError, NULL, 0, |
4024 always_flags, arraysize(always_flags)); | 3952 always_flags, arraysize(always_flags)); |
4025 } | 3953 } |
4026 | 3954 |
4027 | 3955 |
4028 TEST(SuperNoErrors) { | 3956 TEST(SuperNoErrors) { |
(...skipping 1935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5964 } | 5892 } |
5965 | 5893 |
5966 | 5894 |
5967 TEST(DeclarationsError) { | 5895 TEST(DeclarationsError) { |
5968 const char* context_data[][2] = {{"'use strict'; if (true)", ""}, | 5896 const char* context_data[][2] = {{"'use strict'; if (true)", ""}, |
5969 {"'use strict'; if (false) {} else", ""}, | 5897 {"'use strict'; if (false) {} else", ""}, |
5970 {"'use strict'; while (false)", ""}, | 5898 {"'use strict'; while (false)", ""}, |
5971 {"'use strict'; for (;;)", ""}, | 5899 {"'use strict'; for (;;)", ""}, |
5972 {"'use strict'; for (x in y)", ""}, | 5900 {"'use strict'; for (x in y)", ""}, |
5973 {"'use strict'; do ", " while (false)"}, | 5901 {"'use strict'; do ", " while (false)"}, |
5974 {"'use strong'; if (true)", ""}, | |
5975 {"'use strong'; if (false) {} else", ""}, | |
5976 {"'use strong'; while (false)", ""}, | |
5977 {"'use strong'; for (;;)", ""}, | |
5978 {"'use strong'; for (x in y)", ""}, | |
5979 {"'use strong'; do ", " while (false)"}, | |
5980 {NULL, NULL}}; | 5902 {NULL, NULL}}; |
5981 | 5903 |
5982 const char* statement_data[] = { | 5904 const char* statement_data[] = { |
5983 "let x = 1;", | 5905 "let x = 1;", |
5984 "const x = 1;", | 5906 "const x = 1;", |
5985 "class C {}", | 5907 "class C {}", |
5986 NULL}; | 5908 NULL}; |
5987 | 5909 |
5988 static const ParserFlag always_flags[] = {kAllowStrongMode}; | 5910 RunParserSyncTest(context_data, statement_data, kError); |
5989 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, | |
5990 always_flags, arraysize(always_flags)); | |
5991 } | 5911 } |
5992 | 5912 |
5993 | 5913 |
5994 void TestLanguageMode(const char* source, | 5914 void TestLanguageMode(const char* source, |
5995 i::LanguageMode expected_language_mode) { | 5915 i::LanguageMode expected_language_mode) { |
5996 i::Isolate* isolate = CcTest::i_isolate(); | 5916 i::Isolate* isolate = CcTest::i_isolate(); |
5997 i::Factory* factory = isolate->factory(); | 5917 i::Factory* factory = isolate->factory(); |
5998 v8::HandleScope handles(CcTest::isolate()); | 5918 v8::HandleScope handles(CcTest::isolate()); |
5999 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate()); | 5919 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate()); |
6000 v8::Context::Scope context_scope(context); | 5920 v8::Context::Scope context_scope(context); |
6001 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - | 5921 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - |
6002 128 * 1024); | 5922 128 * 1024); |
6003 | 5923 |
6004 i::Handle<i::Script> script = | 5924 i::Handle<i::Script> script = |
6005 factory->NewScript(factory->NewStringFromAsciiChecked(source)); | 5925 factory->NewScript(factory->NewStringFromAsciiChecked(source)); |
6006 i::Zone zone; | 5926 i::Zone zone; |
6007 i::ParseInfo info(&zone, script); | 5927 i::ParseInfo info(&zone, script); |
6008 i::Parser parser(&info); | 5928 i::Parser parser(&info); |
6009 parser.set_allow_strong_mode(true); | |
6010 info.set_global(); | 5929 info.set_global(); |
6011 parser.Parse(&info); | 5930 parser.Parse(&info); |
6012 CHECK(info.literal() != NULL); | 5931 CHECK(info.literal() != NULL); |
6013 CHECK_EQ(expected_language_mode, info.literal()->language_mode()); | 5932 CHECK_EQ(expected_language_mode, info.literal()->language_mode()); |
6014 } | 5933 } |
6015 | 5934 |
6016 | 5935 |
6017 TEST(LanguageModeDirectives) { | 5936 TEST(LanguageModeDirectives) { |
6018 TestLanguageMode("\"use nothing\"", i::SLOPPY); | 5937 TestLanguageMode("\"use nothing\"", i::SLOPPY); |
6019 TestLanguageMode("\"use strict\"", i::STRICT); | 5938 TestLanguageMode("\"use strict\"", i::STRICT); |
6020 TestLanguageMode("\"use strong\"", i::STRONG); | |
6021 | 5939 |
6022 TestLanguageMode("var x = 1; \"use strict\"", i::SLOPPY); | 5940 TestLanguageMode("var x = 1; \"use strict\"", i::SLOPPY); |
6023 TestLanguageMode("var x = 1; \"use strong\"", i::SLOPPY); | |
6024 | |
6025 // Test that multiple directives ("use strict" / "use strong") put the parser | |
6026 // into the correct mode. | |
6027 TestLanguageMode("\"use strict\"; \"use strong\";", i::STRONG); | |
6028 TestLanguageMode("\"use strong\"; \"use strict\";", i::STRONG); | |
6029 | 5941 |
6030 TestLanguageMode("\"use some future directive\"; \"use strict\";", i::STRICT); | 5942 TestLanguageMode("\"use some future directive\"; \"use strict\";", i::STRICT); |
6031 TestLanguageMode("\"use some future directive\"; \"use strong\";", i::STRONG); | |
6032 } | |
6033 | |
6034 | |
6035 TEST(MultipleLanguageModeDirectives) { | |
6036 const char* context_data[][2] = { | |
6037 { "'use strict'; 'use strong';", "" }, | |
6038 { "'use strong'; 'use strict';", "" }, | |
6039 { "function f() { 'use strict'; 'use strong';", "}" }, | |
6040 { "function f() { 'use strong'; 'use strict';", "}" }, | |
6041 { NULL, NULL } | |
6042 }; | |
6043 | |
6044 const char* strict_error_data[] = { | |
6045 "var x = 42; delete x", | |
6046 NULL}; | |
6047 | |
6048 const char* strong_error_data[] = { | |
6049 "var x = 42", | |
6050 NULL}; | |
6051 | |
6052 static const ParserFlag strong_mode_flags[] = {kAllowStrongMode}; | |
6053 RunParserSyncTest(context_data, strict_error_data, kError, | |
6054 strong_mode_flags, arraysize(strong_mode_flags)); | |
6055 RunParserSyncTest(context_data, strong_error_data, kError, NULL, 0, | |
6056 strong_mode_flags, arraysize(strong_mode_flags)); | |
6057 } | 5943 } |
6058 | 5944 |
6059 | 5945 |
6060 TEST(PropertyNameEvalArguments) { | 5946 TEST(PropertyNameEvalArguments) { |
6061 const char* context_data[][2] = {{"'use strict';", ""}, | 5947 const char* context_data[][2] = {{"'use strict';", ""}, |
6062 {"'use strong';", ""}, | |
6063 {NULL, NULL}}; | 5948 {NULL, NULL}}; |
6064 | 5949 |
6065 const char* statement_data[] = { | 5950 const char* statement_data[] = { |
6066 "({eval: 1})", | 5951 "({eval: 1})", |
6067 "({arguments: 1})", | 5952 "({arguments: 1})", |
6068 "({eval() {}})", | 5953 "({eval() {}})", |
6069 "({arguments() {}})", | 5954 "({arguments() {}})", |
6070 "({*eval() {}})", | 5955 "({*eval() {}})", |
6071 "({*arguments() {}})", | 5956 "({*arguments() {}})", |
6072 "({get eval() {}})", | 5957 "({get eval() {}})", |
(...skipping 14 matching lines...) Expand all Loading... |
6087 "class C {static arguments() {}}", | 5972 "class C {static arguments() {}}", |
6088 "class C {static *eval() {}}", | 5973 "class C {static *eval() {}}", |
6089 "class C {static *arguments() {}}", | 5974 "class C {static *arguments() {}}", |
6090 "class C {static get eval() {}}", | 5975 "class C {static get eval() {}}", |
6091 "class C {static get arguments() {}}", | 5976 "class C {static get arguments() {}}", |
6092 "class C {static set eval(_) {}}", | 5977 "class C {static set eval(_) {}}", |
6093 "class C {static set arguments(_) {}}", | 5978 "class C {static set arguments(_) {}}", |
6094 | 5979 |
6095 NULL}; | 5980 NULL}; |
6096 | 5981 |
6097 static const ParserFlag always_flags[] = {kAllowStrongMode}; | 5982 RunParserSyncTest(context_data, statement_data, kSuccess); |
6098 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | |
6099 always_flags, arraysize(always_flags)); | |
6100 } | 5983 } |
6101 | 5984 |
6102 | 5985 |
6103 TEST(FunctionLiteralDuplicateParameters) { | 5986 TEST(FunctionLiteralDuplicateParameters) { |
6104 const char* strict_context_data[][2] = | 5987 const char* strict_context_data[][2] = |
6105 {{"'use strict';(function(", "){})();"}, | 5988 {{"'use strict';(function(", "){})();"}, |
6106 {"(function(", ") { 'use strict'; })();"}, | 5989 {"(function(", ") { 'use strict'; })();"}, |
6107 {"'use strict'; function fn(", ") {}; fn();"}, | 5990 {"'use strict'; function fn(", ") {}; fn();"}, |
6108 {"function fn(", ") { 'use strict'; }; fn();"}, | 5991 {"function fn(", ") { 'use strict'; }; fn();"}, |
6109 {"'use strong';(function(", "){})();"}, | |
6110 {"(function(", ") { 'use strong'; })();"}, | |
6111 {"'use strong'; function fn(", ") {}; fn();"}, | |
6112 {"function fn(", ") { 'use strong'; }; fn();"}, | |
6113 {NULL, NULL}}; | 5992 {NULL, NULL}}; |
6114 | 5993 |
6115 const char* sloppy_context_data[][2] = | 5994 const char* sloppy_context_data[][2] = |
6116 {{"(function(", "){})();"}, | 5995 {{"(function(", "){})();"}, |
6117 {"(function(", ") {})();"}, | 5996 {"(function(", ") {})();"}, |
6118 {"function fn(", ") {}; fn();"}, | 5997 {"function fn(", ") {}; fn();"}, |
6119 {"function fn(", ") {}; fn();"}, | 5998 {"function fn(", ") {}; fn();"}, |
6120 {NULL, NULL}}; | 5999 {NULL, NULL}}; |
6121 | 6000 |
6122 const char* data[] = { | 6001 const char* data[] = { |
6123 "a, a", | 6002 "a, a", |
6124 "a, a, a", | 6003 "a, a, a", |
6125 "b, a, a", | 6004 "b, a, a", |
6126 "a, b, c, c", | 6005 "a, b, c, c", |
6127 "a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, w", | 6006 "a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, w", |
6128 NULL}; | 6007 NULL}; |
6129 | 6008 |
6130 static const ParserFlag always_flags[] = { kAllowStrongMode }; | 6009 RunParserSyncTest(strict_context_data, data, kError); |
6131 RunParserSyncTest(strict_context_data, data, kError, NULL, 0, always_flags, | 6010 RunParserSyncTest(sloppy_context_data, data, kSuccess); |
6132 arraysize(always_flags)); | |
6133 RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, NULL, 0); | |
6134 } | 6011 } |
6135 | 6012 |
6136 | 6013 |
6137 TEST(VarForbiddenInStrongMode) { | |
6138 const char* strong_context_data[][2] = | |
6139 {{"'use strong'; ", ""}, | |
6140 {"function f() {'use strong'; ", "}"}, | |
6141 {"function f() {'use strong'; while (true) { ", "} }"}, | |
6142 {NULL, NULL}}; | |
6143 | |
6144 const char* strict_context_data[][2] = | |
6145 {{"'use strict'; ", ""}, | |
6146 {"function f() {'use strict'; ", "}"}, | |
6147 {"function f() {'use strict'; while (true) { ", "} }"}, | |
6148 {NULL, NULL}}; | |
6149 | |
6150 const char* sloppy_context_data[][2] = | |
6151 {{"", ""}, | |
6152 {"function f() { ", "}"}, | |
6153 {NULL, NULL}}; | |
6154 | |
6155 const char* var_declarations[] = { | |
6156 "var x = 0;", | |
6157 "for (var i = 0; i < 10; i++) { }", | |
6158 NULL}; | |
6159 | |
6160 const char* let_declarations[] = { | |
6161 "let x = 0;", | |
6162 "for (let i = 0; i < 10; i++) { }", | |
6163 NULL}; | |
6164 | |
6165 const char* const_declarations[] = { | |
6166 "const x = 0;", | |
6167 NULL}; | |
6168 | |
6169 static const ParserFlag always_flags[] = {kAllowStrongMode}; | |
6170 RunParserSyncTest(strong_context_data, var_declarations, kError, NULL, 0, | |
6171 always_flags, arraysize(always_flags)); | |
6172 RunParserSyncTest(strong_context_data, let_declarations, kSuccess, NULL, 0, | |
6173 always_flags, arraysize(always_flags)); | |
6174 RunParserSyncTest(strong_context_data, const_declarations, kSuccess, NULL, 0, | |
6175 always_flags, arraysize(always_flags)); | |
6176 | |
6177 RunParserSyncTest(strict_context_data, var_declarations, kSuccess, NULL, 0, | |
6178 always_flags, arraysize(always_flags)); | |
6179 RunParserSyncTest(strict_context_data, let_declarations, kSuccess, NULL, 0, | |
6180 always_flags, arraysize(always_flags)); | |
6181 | |
6182 RunParserSyncTest(sloppy_context_data, var_declarations, kSuccess, NULL, 0, | |
6183 always_flags, arraysize(always_flags)); | |
6184 // At the moment, let declarations are only available in strict mode. | |
6185 RunParserSyncTest(sloppy_context_data, let_declarations, kError, NULL, 0, | |
6186 always_flags, arraysize(always_flags)); | |
6187 } | |
6188 | |
6189 | |
6190 TEST(StrongEmptySubStatements) { | |
6191 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; | |
6192 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}}; | |
6193 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; | |
6194 | |
6195 const char* data_error[] = { | |
6196 "if (1);", | |
6197 "if (1) {} else;", | |
6198 "while (1);", | |
6199 "do; while (1);", | |
6200 "for (;;);", | |
6201 "for (x in []);", | |
6202 "for (x of []);", | |
6203 "for (const x = 0;;);", | |
6204 "for (const x in []);", | |
6205 "for (const x of []);", | |
6206 NULL}; | |
6207 | |
6208 const char* data_success[] = { | |
6209 "if (1) {} else {}", | |
6210 "switch(1) {}", | |
6211 "1+1;;", | |
6212 "1+1; ;", | |
6213 NULL}; | |
6214 | |
6215 static const ParserFlag always_flags[] = { | |
6216 kAllowStrongMode, | |
6217 }; | |
6218 RunParserSyncTest(sloppy_context_data, data_error, kSuccess, NULL, 0, | |
6219 always_flags, arraysize(always_flags)); | |
6220 RunParserSyncTest(strict_context_data, data_error, kSuccess, NULL, 0, | |
6221 always_flags, arraysize(always_flags)); | |
6222 RunParserSyncTest(strong_context_data, data_error, kError, NULL, 0, | |
6223 always_flags, arraysize(always_flags)); | |
6224 RunParserSyncTest(strong_context_data, data_success, kSuccess, NULL, 0, | |
6225 always_flags, arraysize(always_flags)); | |
6226 } | |
6227 | |
6228 | |
6229 TEST(StrongForIn) { | |
6230 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; | |
6231 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}}; | |
6232 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; | |
6233 | |
6234 const char* data[] = { | |
6235 "for (x in []) {}", | |
6236 "for (const x in []) {}", | |
6237 NULL}; | |
6238 | |
6239 static const ParserFlag always_flags[] = { | |
6240 kAllowStrongMode, | |
6241 }; | |
6242 RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, always_flags, | |
6243 arraysize(always_flags)); | |
6244 RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags, | |
6245 arraysize(always_flags)); | |
6246 RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags, | |
6247 arraysize(always_flags)); | |
6248 } | |
6249 | |
6250 | |
6251 TEST(StrongConstructorThis) { | |
6252 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; | |
6253 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}}; | |
6254 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; | |
6255 | |
6256 const char* error_data[] = { | |
6257 "class C { constructor() { this; } }", | |
6258 "class C { constructor() { this.a; } }", | |
6259 "class C { constructor() { this['a']; } }", | |
6260 "class C { constructor() { (this); } }", | |
6261 "class C { constructor() { this(); } }", | |
6262 // TODO(rossberg): arrow functions not handled yet. | |
6263 // "class C { constructor() { () => this; } }", | |
6264 "class C { constructor() { this.a = 0, 0; } }", | |
6265 "class C { constructor() { (this.a = 0); } }", | |
6266 // "class C { constructor() { (() => this.a = 0)(); } }", | |
6267 "class C { constructor() { { this.a = 0; } } }", | |
6268 "class C { constructor() { if (1) this.a = 0; } }", | |
6269 "class C { constructor() { label: this.a = 0; } }", | |
6270 "class C { constructor() { this.a = this.b; } }", | |
6271 "class C { constructor() { this.a = {b: 1}; this.a.b } }", | |
6272 "class C { constructor() { this.a = {b: 1}; this.a.b = 0 } }", | |
6273 "class C { constructor() { this.a = function(){}; this.a() } }", | |
6274 NULL}; | |
6275 | |
6276 const char* success_data[] = { | |
6277 "class C { constructor() { this.a = 0; } }", | |
6278 "class C { constructor() { label: 0; this.a = 0; this.b = 6; } }", | |
6279 NULL}; | |
6280 | |
6281 static const ParserFlag always_flags[] = {kAllowStrongMode}; | |
6282 RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0, | |
6283 always_flags, arraysize(always_flags)); | |
6284 RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0, | |
6285 always_flags, arraysize(always_flags)); | |
6286 RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0, | |
6287 always_flags, arraysize(always_flags)); | |
6288 | |
6289 RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0, | |
6290 always_flags, arraysize(always_flags)); | |
6291 RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0, | |
6292 always_flags, arraysize(always_flags)); | |
6293 RunParserSyncTest(strong_context_data, success_data, kSuccess, NULL, 0, | |
6294 always_flags, arraysize(always_flags)); | |
6295 } | |
6296 | |
6297 | |
6298 TEST(StrongConstructorSuper) { | |
6299 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; | |
6300 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}}; | |
6301 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; | |
6302 | |
6303 const char* error_data[] = { | |
6304 "class C extends Object { constructor() {} }", | |
6305 "class C extends Object { constructor() { super.a; } }", | |
6306 "class C extends Object { constructor() { super['a']; } }", | |
6307 "class C extends Object { constructor() { super.a = 0; } }", | |
6308 "class C extends Object { constructor() { (super.a); } }", | |
6309 // TODO(rossberg): arrow functions do not handle super yet. | |
6310 // "class C extends Object { constructor() { () => super.a; } }", | |
6311 "class C extends Object { constructor() { super(), 0; } }", | |
6312 "class C extends Object { constructor() { (super()); } }", | |
6313 // "class C extends Object { constructor() { (() => super())(); } }", | |
6314 "class C extends Object { constructor() { { super(); } } }", | |
6315 "class C extends Object { constructor() { if (1) super(); } }", | |
6316 "class C extends Object { constructor() { label: super(); } }", | |
6317 "class C extends Object { constructor() { super(), super(); } }", | |
6318 "class C extends Object { constructor() { super(); super(); } }", | |
6319 "class C extends Object { constructor() { super(); (super()); } }", | |
6320 "class C extends Object { constructor() { super(); { super() } } }", | |
6321 "class C extends Object { constructor() { this.a = 0, super(); } }", | |
6322 "class C extends Object { constructor() { this.a = 0; super(); } }", | |
6323 "class C extends Object { constructor() { super(this.a = 0); } }", | |
6324 "class C extends Object { constructor() { super().a; } }", | |
6325 NULL}; | |
6326 | |
6327 const char* success_data[] = { | |
6328 "class C extends Object { constructor() { super(); } }", | |
6329 "class C extends Object { constructor() { label: 66; super(); } }", | |
6330 "class C extends Object { constructor() { super(3); this.x = 0; } }", | |
6331 "class C extends Object { constructor() { 3; super(3); this.x = 0; } }", | |
6332 NULL}; | |
6333 | |
6334 static const ParserFlag always_flags[] = {kAllowStrongMode}; | |
6335 RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0, | |
6336 always_flags, arraysize(always_flags)); | |
6337 RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0, | |
6338 always_flags, arraysize(always_flags)); | |
6339 RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0, | |
6340 always_flags, arraysize(always_flags)); | |
6341 | |
6342 RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0, | |
6343 always_flags, arraysize(always_flags)); | |
6344 RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0, | |
6345 always_flags, arraysize(always_flags)); | |
6346 RunParserSyncTest(strong_context_data, success_data, kSuccess, NULL, 0, | |
6347 always_flags, arraysize(always_flags)); | |
6348 } | |
6349 | |
6350 | |
6351 TEST(StrongConstructorReturns) { | |
6352 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; | |
6353 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}}; | |
6354 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; | |
6355 | |
6356 const char* error_data[] = { | |
6357 "class C extends Object { constructor() { super(); return {}; } }", | |
6358 "class C extends Object { constructor() { super(); { return {}; } } }", | |
6359 "class C extends Object { constructor() { super(); if (1) return {}; } }", | |
6360 "class C extends Object { constructor() { return; super(); } }", | |
6361 "class C extends Object { constructor() { { return; } super(); } }", | |
6362 "class C extends Object { constructor() { if (0) return; super(); } }", | |
6363 "class C { constructor() { return; this.a = 0; } }", | |
6364 "class C { constructor() { { return; } this.a = 0; } }", | |
6365 "class C { constructor() { if (0) return; this.a = 0; } }", | |
6366 "class C { constructor() { this.a = 0; if (0) return; this.b = 0; } }", | |
6367 NULL}; | |
6368 | |
6369 const char* success_data[] = { | |
6370 "class C extends Object { constructor() { super(); return; } }", | |
6371 "class C extends Object { constructor() { super(); { return } } }", | |
6372 "class C extends Object { constructor() { super(); if (1) return; } }", | |
6373 "class C { constructor() { this.a = 0; return; } }", | |
6374 "class C { constructor() { this.a = 0; { return; } } }", | |
6375 "class C { constructor() { this.a = 0; if (0) return; 65; } }", | |
6376 "class C extends Array { constructor() { super(); this.a = 9; return } }", | |
6377 NULL}; | |
6378 | |
6379 static const ParserFlag always_flags[] = {kAllowStrongMode}; | |
6380 RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0, | |
6381 always_flags, arraysize(always_flags)); | |
6382 RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0, | |
6383 always_flags, arraysize(always_flags)); | |
6384 RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0, | |
6385 always_flags, arraysize(always_flags)); | |
6386 | |
6387 RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0, | |
6388 always_flags, arraysize(always_flags)); | |
6389 RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0, | |
6390 always_flags, arraysize(always_flags)); | |
6391 RunParserSyncTest(strong_context_data, success_data, kSuccess, NULL, 0, | |
6392 always_flags, arraysize(always_flags)); | |
6393 } | |
6394 | |
6395 | |
6396 TEST(StrongConstructorDirective) { | |
6397 const char* context_data[][2] = {{"class c { ", " }"}, | |
6398 {"(class c { ", " });"}, | |
6399 {"let a = (class c { ", " });"}, | |
6400 {NULL}}; | |
6401 | |
6402 const char* error_data[] = { | |
6403 "constructor() { \"use strong\" }", | |
6404 "constructor(...rest) { \"use strong\" }", | |
6405 "foo() {} constructor() { \"use strong\" }", | |
6406 "foo(...rest) { \"use strict\" } constructor() { \"use strong\" }", NULL}; | |
6407 | |
6408 const char* success_data[] = { | |
6409 "constructor() { \"use strict\" }", "foo() { \"use strong\" }", | |
6410 "foo() { \"use strong\" } constructor() {}", NULL}; | |
6411 | |
6412 static const ParserFlag always_flags[] = { | |
6413 kAllowHarmonySloppy, kAllowHarmonySloppyLet, kAllowStrongMode}; | |
6414 | |
6415 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, | |
6416 arraysize(always_flags)); | |
6417 RunParserSyncTest(context_data, success_data, kSuccess, NULL, 0, always_flags, | |
6418 arraysize(always_flags)); | |
6419 } | |
6420 | |
6421 | |
6422 TEST(StrongUndefinedLocal) { | |
6423 const char* context_data[][2] = {{"", ""}, {NULL}}; | |
6424 | |
6425 const char* data[] = { | |
6426 "function undefined() {'use strong';}", | |
6427 "function* undefined() {'use strong';}", | |
6428 "(function undefined() {'use strong';});", | |
6429 "{foo: (function undefined(){'use strong';})};", | |
6430 "(function* undefined() {'use strong';})", | |
6431 "{foo: (function* undefined(){'use strong';})};", | |
6432 "function foo(a, b, undefined, c, d) {'use strong';}", | |
6433 "function* foo(a, b, undefined, c, d) {'use strong';}", | |
6434 "(function foo(a, b, undefined, c, d) {'use strong';})", | |
6435 "{foo: (function foo(a, b, undefined, c, d) {'use strong';})};", | |
6436 "(function* foo(a, b, undefined, c, d) {'use strong';})", | |
6437 "{foo: (function* foo(a, b, undefined, c, d) {'use strong';})};", | |
6438 "class C { foo(a, b, undefined, c, d) {'use strong';} }", | |
6439 "class C { *foo(a, b, undefined, c, d) {'use strong';} }", | |
6440 "({ foo(a, b, undefined, c, d) {'use strong';} });", | |
6441 "{ *foo(a, b, undefined, c, d) {'use strong';} });", | |
6442 "class undefined {'use strong'}", | |
6443 "(class undefined {'use strong'});", | |
6444 NULL}; | |
6445 | |
6446 static const ParserFlag always_flags[] = { | |
6447 kAllowStrongMode, kAllowHarmonySloppy | |
6448 }; | |
6449 | |
6450 RunParserSyncTest(context_data, data, kError, NULL, 0, | |
6451 always_flags, arraysize(always_flags)); | |
6452 } | |
6453 | |
6454 | |
6455 TEST(StrongUndefinedArrow) { | |
6456 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; | |
6457 const char* strict_context_data[][2] = {{"'use strict';", ""}, {NULL}}; | |
6458 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; | |
6459 | |
6460 const char* data[] = { | |
6461 "(undefined => {return});", | |
6462 "((undefined, b, c) => {return});", | |
6463 "((a, undefined, c) => {return});", | |
6464 "((a, b, undefined) => {return});", | |
6465 NULL}; | |
6466 | |
6467 const char* local_strong[] = { | |
6468 "(undefined => {'use strong';});", | |
6469 "((undefined, b, c) => {'use strong';});", | |
6470 "((a, undefined, c) => {'use strong';});", | |
6471 "((a, b, undefined) => {'use strong';});", | |
6472 NULL}; | |
6473 | |
6474 static const ParserFlag always_flags[] = {kAllowStrongMode}; | |
6475 RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, always_flags, | |
6476 arraysize(always_flags)); | |
6477 RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags, | |
6478 arraysize(always_flags)); | |
6479 RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags, | |
6480 arraysize(always_flags)); | |
6481 RunParserSyncTest(sloppy_context_data, local_strong, kError, NULL, 0, | |
6482 always_flags, arraysize(always_flags)); | |
6483 } | |
6484 | |
6485 | |
6486 TEST(StrongDirectEval) { | |
6487 const char* sloppy_context_data[][2] = {{"", ""}, {NULL}}; | |
6488 const char* strong_context_data[][2] = {{"'use strong';", ""}, {NULL}}; | |
6489 | |
6490 const char* error_data[] = { | |
6491 "eval();", | |
6492 "eval([]);", | |
6493 "(eval)();", | |
6494 "(((eval)))();", | |
6495 "eval('function f() {}');", | |
6496 "function f() {eval()}", | |
6497 NULL}; | |
6498 | |
6499 const char* success_data[] = { | |
6500 "eval;", | |
6501 "eval`foo`;", | |
6502 "let foo = eval; foo();", | |
6503 "(1, eval)();", | |
6504 NULL}; | |
6505 | |
6506 static const ParserFlag always_flags[] = { | |
6507 kAllowStrongMode | |
6508 }; | |
6509 | |
6510 RunParserSyncTest(sloppy_context_data, error_data, kSuccess, NULL, 0, | |
6511 always_flags, arraysize(always_flags)); | |
6512 RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0, | |
6513 always_flags, arraysize(always_flags)); | |
6514 RunParserSyncTest(strong_context_data, success_data, kSuccess, NULL, 0, | |
6515 always_flags, arraysize(always_flags)); | |
6516 } | |
6517 | |
6518 | |
6519 TEST(StrongSwitchFallthrough) { | |
6520 const char* sloppy_context_data[][2] = { | |
6521 {"function f() { foo:for(;;) { switch(1) {", "};}}"}, | |
6522 {NULL, NULL} | |
6523 }; | |
6524 const char* strong_context_data[][2] = { | |
6525 {"function f() { 'use strong'; foo:for(;;) { switch(1) {", "};}}"}, | |
6526 {NULL, NULL} | |
6527 }; | |
6528 | |
6529 const char* data_success[] = { | |
6530 "", | |
6531 "case 1:", | |
6532 "case 1: case 2:", | |
6533 "case 1: break;", | |
6534 "default: throw new TypeError();", | |
6535 "case 1: case 2: null", | |
6536 "case 1: case 2: default: 1+1", | |
6537 "case 1: break; case 2: return; default:", | |
6538 "case 1: break foo; case 2: return; default:", | |
6539 "case 1: case 2: break; case 3: continue; case 4: default:", | |
6540 "case 1: case 2: break; case 3: continue foo; case 4: default:", | |
6541 "case 1: case 2: {{return;}} case 3: default:", | |
6542 "case 1: case 2: case 3: default: {1+1;{continue;}}", | |
6543 "case 1: case 2: {1+1;{1+1;{continue;}}} case 3: default:", | |
6544 "case 1: if (1) break; else continue; case 2: case 3: default:", | |
6545 "case 1: case 2: if (1) {{break;}} else break; case 3: default:", | |
6546 "case 1: if (1) break; else {if (1) break; else break;} case 2: default:", | |
6547 "case 1: if (1) {if (1) break; else break;} else break; case 2: default:", | |
6548 NULL}; | |
6549 | |
6550 const char* data_error[] = { | |
6551 "case 1: case 2: (function(){return}); default:", | |
6552 "case 1: 1+1; case 2:", | |
6553 "case 1: bar: break bar; case 2: break;", | |
6554 "case 1: bar:return; case 2:", | |
6555 "case 1: bar:{ continue;} case 2:", | |
6556 "case 1: break; case 2: bar:{ throw new TypeError() } default:", | |
6557 "case 1: case 2: { bar:{ { break;} } } default: break;", | |
6558 "case 1: if (1) break; else {}; case 2: default:", | |
6559 "case 1: case 2: if (1) break; default:", | |
6560 "case 1: case 2: if (1) break; else 0; default:", | |
6561 "case 1: case 2: if (1) 0; else break; default:", | |
6562 "case 1: case 2: case 3: if (1) {} default:", | |
6563 "case 1: bar:if (1) break; else continue; case 2: case 3: default:", | |
6564 NULL}; | |
6565 | |
6566 static const ParserFlag always_flags[] = { | |
6567 kAllowStrongMode | |
6568 }; | |
6569 RunParserSyncTest(strong_context_data, data_success, kSuccess, NULL, 0, | |
6570 always_flags, arraysize(always_flags)); | |
6571 RunParserSyncTest(sloppy_context_data, data_error, kSuccess, NULL, 0, | |
6572 always_flags, arraysize(always_flags)); | |
6573 RunParserSyncTest(strong_context_data, data_error, kError, NULL, 0, | |
6574 always_flags, arraysize(always_flags)); | |
6575 } | |
6576 | |
6577 | |
6578 TEST(ArrowFunctionASIErrors) { | 6014 TEST(ArrowFunctionASIErrors) { |
6579 const char* context_data[][2] = {{"'use strict';", ""}, {"", ""}, | 6015 const char* context_data[][2] = {{"'use strict';", ""}, {"", ""}, |
6580 {NULL, NULL}}; | 6016 {NULL, NULL}}; |
6581 | 6017 |
6582 const char* data[] = { | 6018 const char* data[] = { |
6583 "(a\n=> a)(1)", | 6019 "(a\n=> a)(1)", |
6584 "(a/*\n*/=> a)(1)", | 6020 "(a/*\n*/=> a)(1)", |
6585 "((a)\n=> a)(1)", | 6021 "((a)\n=> a)(1)", |
6586 "((a)/*\n*/=> a)(1)", | 6022 "((a)/*\n*/=> a)(1)", |
6587 "((a, b)\n=> a + b)(1, 2)", | 6023 "((a, b)\n=> a + b)(1, 2)", |
6588 "((a, b)/*\n*/=> a + b)(1, 2)", | 6024 "((a, b)/*\n*/=> a + b)(1, 2)", |
6589 NULL}; | 6025 NULL}; |
6590 RunParserSyncTest(context_data, data, kError); | 6026 RunParserSyncTest(context_data, data, kError); |
6591 } | 6027 } |
6592 | 6028 |
6593 | 6029 |
6594 TEST(StrongModeFreeVariablesDeclaredByPreviousScript) { | |
6595 i::FLAG_strong_mode = true; | |
6596 i::FLAG_legacy_const = true; | |
6597 v8::V8::Initialize(); | |
6598 v8::HandleScope scope(CcTest::isolate()); | |
6599 v8::Context::Scope context_scope(v8::Context::New(CcTest::isolate())); | |
6600 v8::TryCatch try_catch(CcTest::isolate()); | |
6601 | |
6602 // Introduce a bunch of variables, in all language modes. | |
6603 const char* script1 = | |
6604 "var my_var1 = 0; \n" | |
6605 "function my_func1() { } \n" | |
6606 "const my_const1 = 0; \n"; | |
6607 CompileRun(v8_str(script1)); | |
6608 CHECK(!try_catch.HasCaught()); | |
6609 | |
6610 const char* script2 = | |
6611 "\"use strict\"; \n" | |
6612 "let my_var2 = 0; \n" | |
6613 "function my_func2() { } \n" | |
6614 "const my_const2 = 0 \n"; | |
6615 CompileRun(v8_str(script2)); | |
6616 CHECK(!try_catch.HasCaught()); | |
6617 | |
6618 const char* script3 = | |
6619 "\"use strong\"; \n" | |
6620 "let my_var3 = 0; \n" | |
6621 "function my_func3() { } \n" | |
6622 "const my_const3 = 0; \n"; | |
6623 CompileRun(v8_str(script3)); | |
6624 CHECK(!try_catch.HasCaught()); | |
6625 | |
6626 // Sloppy eval introduces variables in the surrounding scope. | |
6627 const char* script4 = | |
6628 "eval('var my_var4 = 0;') \n" | |
6629 "eval('function my_func4() { }') \n" | |
6630 "eval('const my_const4 = 0;') \n"; | |
6631 CompileRun(v8_str(script4)); | |
6632 CHECK(!try_catch.HasCaught()); | |
6633 | |
6634 // Test that referencing these variables work. | |
6635 const char* script5 = | |
6636 "\"use strong\"; \n" | |
6637 "my_var1; \n" | |
6638 "my_func1; \n" | |
6639 "my_const1; \n" | |
6640 "my_var2; \n" | |
6641 "my_func2; \n" | |
6642 "my_const2; \n" | |
6643 "my_var3; \n" | |
6644 "my_func3; \n" | |
6645 "my_const3; \n" | |
6646 "my_var4; \n" | |
6647 "my_func4; \n" | |
6648 "my_const4; \n"; | |
6649 CompileRun(v8_str(script5)); | |
6650 CHECK(!try_catch.HasCaught()); | |
6651 } | |
6652 | |
6653 | |
6654 TEST(StrongModeFreeVariablesDeclaredByLanguage) { | |
6655 i::FLAG_strong_mode = true; | |
6656 v8::V8::Initialize(); | |
6657 v8::HandleScope scope(CcTest::isolate()); | |
6658 v8::Context::Scope context_scope(v8::Context::New(CcTest::isolate())); | |
6659 v8::TryCatch try_catch(CcTest::isolate()); | |
6660 | |
6661 const char* script1 = | |
6662 "\"use strong\"; \n" | |
6663 "Math; \n" | |
6664 "RegExp; \n"; | |
6665 CompileRun(v8_str(script1)); | |
6666 CHECK(!try_catch.HasCaught()); | |
6667 } | |
6668 | |
6669 | |
6670 TEST(StrongModeFreeVariablesDeclaredInGlobalPrototype) { | |
6671 i::FLAG_strong_mode = true; | |
6672 v8::V8::Initialize(); | |
6673 v8::HandleScope scope(CcTest::isolate()); | |
6674 v8::Context::Scope context_scope(v8::Context::New(CcTest::isolate())); | |
6675 v8::TryCatch try_catch(CcTest::isolate()); | |
6676 | |
6677 const char* script1 = "this.__proto__.my_var = 0;\n"; | |
6678 CompileRun(v8_str(script1)); | |
6679 CHECK(!try_catch.HasCaught()); | |
6680 | |
6681 const char* script2 = | |
6682 "\"use strong\"; \n" | |
6683 "my_var; \n"; | |
6684 CompileRun(v8_str(script2)); | |
6685 CHECK(!try_catch.HasCaught()); | |
6686 } | |
6687 | |
6688 | |
6689 static const ParserFlag kAllDestructuringFlags[] = { | 6030 static const ParserFlag kAllDestructuringFlags[] = { |
6690 kAllowHarmonyDestructuring, kAllowHarmonyDestructuringAssignment, | 6031 kAllowHarmonyDestructuring, kAllowHarmonyDestructuringAssignment, |
6691 kAllowHarmonyDefaultParameters}; | 6032 kAllowHarmonyDefaultParameters}; |
6692 | 6033 |
6693 TEST(DestructuringPositiveTests) { | 6034 TEST(DestructuringPositiveTests) { |
6694 i::FLAG_harmony_destructuring_bind = true; | 6035 i::FLAG_harmony_destructuring_bind = true; |
6695 | 6036 |
6696 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, | 6037 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, |
6697 {"var ", " = {};"}, | 6038 {"var ", " = {};"}, |
6698 {"'use strict'; const ", " = {};"}, | 6039 {"'use strict'; const ", " = {};"}, |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7404 | 6745 |
7405 | 6746 |
7406 TEST(DefaultParametersYieldInInitializers) { | 6747 TEST(DefaultParametersYieldInInitializers) { |
7407 // clang-format off | 6748 // clang-format off |
7408 const char* sloppy_function_context_data[][2] = { | 6749 const char* sloppy_function_context_data[][2] = { |
7409 {"(function f(", ") { });"}, | 6750 {"(function f(", ") { });"}, |
7410 {NULL, NULL} | 6751 {NULL, NULL} |
7411 }; | 6752 }; |
7412 | 6753 |
7413 const char* strict_function_context_data[][2] = { | 6754 const char* strict_function_context_data[][2] = { |
7414 {"'use strong'; (function f(", ") { });"}, | |
7415 {"'use strict'; (function f(", ") { });"}, | 6755 {"'use strict'; (function f(", ") { });"}, |
7416 {NULL, NULL} | 6756 {NULL, NULL} |
7417 }; | 6757 }; |
7418 | 6758 |
7419 const char* sloppy_arrow_context_data[][2] = { | 6759 const char* sloppy_arrow_context_data[][2] = { |
7420 {"((", ")=>{});"}, | 6760 {"((", ")=>{});"}, |
7421 {NULL, NULL} | 6761 {NULL, NULL} |
7422 }; | 6762 }; |
7423 | 6763 |
7424 const char* strict_arrow_context_data[][2] = { | 6764 const char* strict_arrow_context_data[][2] = { |
7425 {"'use strong'; ((", ")=>{});"}, | |
7426 {"'use strict'; ((", ")=>{});"}, | 6765 {"'use strict'; ((", ")=>{});"}, |
7427 {NULL, NULL} | 6766 {NULL, NULL} |
7428 }; | 6767 }; |
7429 | 6768 |
7430 const char* generator_context_data[][2] = { | 6769 const char* generator_context_data[][2] = { |
7431 {"'use strong'; (function *g(", ") { });"}, | |
7432 {"'use strict'; (function *g(", ") { });"}, | 6770 {"'use strict'; (function *g(", ") { });"}, |
7433 {"(function *g(", ") { });"}, | 6771 {"(function *g(", ") { });"}, |
7434 {NULL, NULL} | 6772 {NULL, NULL} |
7435 }; | 6773 }; |
7436 | 6774 |
7437 const char* parameter_data[] = { | 6775 const char* parameter_data[] = { |
7438 "x=yield", | 6776 "x=yield", |
7439 "x, y=yield", | 6777 "x, y=yield", |
7440 "{x=yield}", | 6778 "{x=yield}", |
7441 "[x=yield]", | 6779 "[x=yield]", |
(...skipping 14 matching lines...) Expand all Loading... |
7456 "{x}=(yield)", | 6794 "{x}=(yield)", |
7457 "[x]=(yield)", | 6795 "[x]=(yield)", |
7458 | 6796 |
7459 "{x}=f(yield)", | 6797 "{x}=f(yield)", |
7460 "[x]=f(yield)", | 6798 "[x]=f(yield)", |
7461 NULL | 6799 NULL |
7462 }; | 6800 }; |
7463 | 6801 |
7464 // clang-format on | 6802 // clang-format on |
7465 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring, | 6803 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring, |
7466 kAllowHarmonyDefaultParameters, | 6804 kAllowHarmonyDefaultParameters}; |
7467 kAllowStrongMode}; | |
7468 | 6805 |
7469 RunParserSyncTest(sloppy_function_context_data, parameter_data, kSuccess, | 6806 RunParserSyncTest(sloppy_function_context_data, parameter_data, kSuccess, |
7470 NULL, 0, always_flags, arraysize(always_flags)); | 6807 NULL, 0, always_flags, arraysize(always_flags)); |
7471 RunParserSyncTest(sloppy_arrow_context_data, parameter_data, kSuccess, NULL, | 6808 RunParserSyncTest(sloppy_arrow_context_data, parameter_data, kSuccess, NULL, |
7472 0, always_flags, arraysize(always_flags)); | 6809 0, always_flags, arraysize(always_flags)); |
7473 | 6810 |
7474 RunParserSyncTest(strict_function_context_data, parameter_data, kError, NULL, | 6811 RunParserSyncTest(strict_function_context_data, parameter_data, kError, NULL, |
7475 0, always_flags, arraysize(always_flags)); | 6812 0, always_flags, arraysize(always_flags)); |
7476 RunParserSyncTest(strict_arrow_context_data, parameter_data, kError, NULL, 0, | 6813 RunParserSyncTest(strict_arrow_context_data, parameter_data, kError, NULL, 0, |
7477 always_flags, arraysize(always_flags)); | 6814 always_flags, arraysize(always_flags)); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7644 kAllowHarmonySloppyLet}; | 6981 kAllowHarmonySloppyLet}; |
7645 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, | 6982 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, |
7646 arraysize(always_flags)); | 6983 arraysize(always_flags)); |
7647 } | 6984 } |
7648 | 6985 |
7649 | 6986 |
7650 TEST(LanguageModeDirectivesNonSimpleParameterListErrors) { | 6987 TEST(LanguageModeDirectivesNonSimpleParameterListErrors) { |
7651 // TC39 deemed "use strict" directives to be an error when occurring in the | 6988 // TC39 deemed "use strict" directives to be an error when occurring in the |
7652 // body of a function with non-simple parameter list, on 29/7/2015. | 6989 // body of a function with non-simple parameter list, on 29/7/2015. |
7653 // https://goo.gl/ueA7Ln | 6990 // https://goo.gl/ueA7Ln |
7654 // | |
7655 // In V8, this also applies to "use strong " directives. | |
7656 const char* context_data[][2] = { | 6991 const char* context_data[][2] = { |
7657 {"function f(", ") { 'use strict'; }"}, | 6992 {"function f(", ") { 'use strict'; }"}, |
7658 {"function f(", ") { 'use strong'; }"}, | |
7659 {"function* g(", ") { 'use strict'; }"}, | 6993 {"function* g(", ") { 'use strict'; }"}, |
7660 {"function* g(", ") { 'use strong'; }"}, | |
7661 {"class c { foo(", ") { 'use strict' }"}, | 6994 {"class c { foo(", ") { 'use strict' }"}, |
7662 {"class c { foo(", ") { 'use strong' }"}, | |
7663 {"var a = (", ") => { 'use strict'; }"}, | 6995 {"var a = (", ") => { 'use strict'; }"}, |
7664 {"var a = (", ") => { 'use strong'; }"}, | |
7665 {"var o = { m(", ") { 'use strict'; }"}, | 6996 {"var o = { m(", ") { 'use strict'; }"}, |
7666 {"var o = { m(", ") { 'use strong'; }"}, | |
7667 {"var o = { *gm(", ") { 'use strict'; }"}, | 6997 {"var o = { *gm(", ") { 'use strict'; }"}, |
7668 {"var o = { *gm(", ") { 'use strong'; }"}, | |
7669 {"var c = { m(", ") { 'use strict'; }"}, | 6998 {"var c = { m(", ") { 'use strict'; }"}, |
7670 {"var c = { m(", ") { 'use strong'; }"}, | |
7671 {"var c = { *gm(", ") { 'use strict'; }"}, | 6999 {"var c = { *gm(", ") { 'use strict'; }"}, |
7672 {"var c = { *gm(", ") { 'use strong'; }"}, | |
7673 | 7000 |
7674 {"'use strict'; function f(", ") { 'use strict'; }"}, | 7001 {"'use strict'; function f(", ") { 'use strict'; }"}, |
7675 {"'use strict'; function f(", ") { 'use strong'; }"}, | |
7676 {"'use strict'; function* g(", ") { 'use strict'; }"}, | 7002 {"'use strict'; function* g(", ") { 'use strict'; }"}, |
7677 {"'use strict'; function* g(", ") { 'use strong'; }"}, | |
7678 {"'use strict'; class c { foo(", ") { 'use strict' }"}, | 7003 {"'use strict'; class c { foo(", ") { 'use strict' }"}, |
7679 {"'use strict'; class c { foo(", ") { 'use strong' }"}, | |
7680 {"'use strict'; var a = (", ") => { 'use strict'; }"}, | 7004 {"'use strict'; var a = (", ") => { 'use strict'; }"}, |
7681 {"'use strict'; var a = (", ") => { 'use strong'; }"}, | |
7682 {"'use strict'; var o = { m(", ") { 'use strict'; }"}, | 7005 {"'use strict'; var o = { m(", ") { 'use strict'; }"}, |
7683 {"'use strict'; var o = { m(", ") { 'use strong'; }"}, | |
7684 {"'use strict'; var o = { *gm(", ") { 'use strict'; }"}, | 7006 {"'use strict'; var o = { *gm(", ") { 'use strict'; }"}, |
7685 {"'use strict'; var o = { *gm(", ") { 'use strong'; }"}, | |
7686 {"'use strict'; var c = { m(", ") { 'use strict'; }"}, | 7007 {"'use strict'; var c = { m(", ") { 'use strict'; }"}, |
7687 {"'use strict'; var c = { m(", ") { 'use strong'; }"}, | |
7688 {"'use strict'; var c = { *gm(", ") { 'use strict'; }"}, | 7008 {"'use strict'; var c = { *gm(", ") { 'use strict'; }"}, |
7689 {"'use strict'; var c = { *gm(", ") { 'use strong'; }"}, | |
7690 | |
7691 {"'use strong'; function f(", ") { 'use strict'; }"}, | |
7692 {"'use strong'; function f(", ") { 'use strong'; }"}, | |
7693 {"'use strong'; function* g(", ") { 'use strict'; }"}, | |
7694 {"'use strong'; function* g(", ") { 'use strong'; }"}, | |
7695 {"'use strong'; class c { foo(", ") { 'use strict' }"}, | |
7696 {"'use strong'; class c { foo(", ") { 'use strong' }"}, | |
7697 {"'use strong'; var a = (", ") => { 'use strict'; }"}, | |
7698 {"'use strong'; var a = (", ") => { 'use strong'; }"}, | |
7699 {"'use strong'; var o = { m(", ") { 'use strict'; }"}, | |
7700 {"'use strong'; var o = { m(", ") { 'use strong'; }"}, | |
7701 {"'use strong'; var o = { *gm(", ") { 'use strict'; }"}, | |
7702 {"'use strong'; var o = { *gm(", ") { 'use strong'; }"}, | |
7703 {"'use strong'; var c = { m(", ") { 'use strict'; }"}, | |
7704 {"'use strong'; var c = { m(", ") { 'use strong'; }"}, | |
7705 {"'use strong'; var c = { *gm(", ") { 'use strict'; }"}, | |
7706 {"'use strong'; var c = { *gm(", ") { 'use strong'; }"}, | |
7707 | 7009 |
7708 {NULL, NULL}}; | 7010 {NULL, NULL}}; |
7709 | 7011 |
7710 const char* data[] = { | 7012 const char* data[] = { |
7711 // TODO(@caitp): support formal parameter initializers | 7013 // TODO(@caitp): support formal parameter initializers |
7712 "{}", | 7014 "{}", |
7713 "[]", | 7015 "[]", |
7714 "[{}]", | 7016 "[{}]", |
7715 "{a}", | 7017 "{a}", |
7716 "a, {b}", | 7018 "a, {b}", |
7717 "a, b, {c, d, e}", | 7019 "a, b, {c, d, e}", |
7718 "initializer = true", | 7020 "initializer = true", |
7719 "a, b, c = 1", | 7021 "a, b, c = 1", |
7720 "...args", | 7022 "...args", |
7721 "a, b, ...rest", | 7023 "a, b, ...rest", |
7722 "[a, b, ...rest]", | 7024 "[a, b, ...rest]", |
7723 "{ bindingPattern = {} }", | 7025 "{ bindingPattern = {} }", |
7724 "{ initializedBindingPattern } = { initializedBindingPattern: true }", | 7026 "{ initializedBindingPattern } = { initializedBindingPattern: true }", |
7725 NULL}; | 7027 NULL}; |
7726 | 7028 |
7727 static const ParserFlag always_flags[] = { | 7029 static const ParserFlag always_flags[] = { |
7728 kAllowHarmonyDefaultParameters, kAllowHarmonyDestructuring, | 7030 kAllowHarmonyDefaultParameters, kAllowHarmonyDestructuring, |
7729 kAllowHarmonySloppy, kAllowStrongMode}; | 7031 kAllowHarmonySloppy}; |
7730 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 7032 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, |
7731 arraysize(always_flags)); | 7033 arraysize(always_flags)); |
7732 } | 7034 } |
7733 | 7035 |
7734 | 7036 |
7735 TEST(LetSloppyOnly) { | 7037 TEST(LetSloppyOnly) { |
7736 // clang-format off | 7038 // clang-format off |
7737 const char* context_data[][2] = { | 7039 const char* context_data[][2] = { |
7738 {"", ""}, | 7040 {"", ""}, |
7739 {"{", "}"}, | 7041 {"{", "}"}, |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8078 RunParserSyncTest(sloppy_context, error_data, kError); | 7380 RunParserSyncTest(sloppy_context, error_data, kError); |
8079 RunParserSyncTest(sloppy_context, error_data, kError, NULL, 0, | 7381 RunParserSyncTest(sloppy_context, error_data, kError, NULL, 0, |
8080 restrictive_flags, arraysize(restrictive_flags)); | 7382 restrictive_flags, arraysize(restrictive_flags)); |
8081 RunParserSyncTest(sloppy_context, unrestricted_data, kSuccess); | 7383 RunParserSyncTest(sloppy_context, unrestricted_data, kSuccess); |
8082 RunParserSyncTest(sloppy_context, unrestricted_data, kError, NULL, 0, | 7384 RunParserSyncTest(sloppy_context, unrestricted_data, kError, NULL, 0, |
8083 restrictive_flags, arraysize(restrictive_flags)); | 7385 restrictive_flags, arraysize(restrictive_flags)); |
8084 RunParserSyncTest(sloppy_context, sloppy_data, kSuccess); | 7386 RunParserSyncTest(sloppy_context, sloppy_data, kSuccess); |
8085 RunParserSyncTest(sloppy_context, sloppy_data, kSuccess, restrictive_flags, | 7387 RunParserSyncTest(sloppy_context, sloppy_data, kSuccess, restrictive_flags, |
8086 arraysize(restrictive_flags)); | 7388 arraysize(restrictive_flags)); |
8087 } | 7389 } |
OLD | NEW |