| 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 1485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1496 arg_object = isolate->factory()->undefined_value(); | 1496 arg_object = isolate->factory()->undefined_value(); |
| 1497 } | 1497 } |
| 1498 | 1498 |
| 1499 data.Dispose(); | 1499 data.Dispose(); |
| 1500 return i::MessageTemplate::FormatMessage(isolate, message, arg_object); | 1500 return i::MessageTemplate::FormatMessage(isolate, message, arg_object); |
| 1501 } | 1501 } |
| 1502 | 1502 |
| 1503 enum ParserFlag { | 1503 enum ParserFlag { |
| 1504 kAllowLazy, | 1504 kAllowLazy, |
| 1505 kAllowNatives, | 1505 kAllowNatives, |
| 1506 kAllowHarmonyDefaultParameters, | |
| 1507 kAllowHarmonySloppy, | 1506 kAllowHarmonySloppy, |
| 1508 kAllowHarmonySloppyLet, | 1507 kAllowHarmonySloppyLet, |
| 1509 kAllowHarmonyDestructuring, | |
| 1510 kAllowHarmonyDestructuringAssignment, | |
| 1511 kAllowHarmonyNewTarget, | 1508 kAllowHarmonyNewTarget, |
| 1512 kNoLegacyConst, | 1509 kNoLegacyConst, |
| 1513 kAllowHarmonyFunctionSent, | 1510 kAllowHarmonyFunctionSent, |
| 1514 kAllowHarmonyRestrictiveDeclarations, | 1511 kAllowHarmonyRestrictiveDeclarations, |
| 1515 }; | 1512 }; |
| 1516 | 1513 |
| 1517 enum ParserSyncTestResult { | 1514 enum ParserSyncTestResult { |
| 1518 kSuccessOrError, | 1515 kSuccessOrError, |
| 1519 kSuccess, | 1516 kSuccess, |
| 1520 kError | 1517 kError |
| 1521 }; | 1518 }; |
| 1522 | 1519 |
| 1523 template <typename Traits> | 1520 template <typename Traits> |
| 1524 void SetParserFlags(i::ParserBase<Traits>* parser, | 1521 void SetParserFlags(i::ParserBase<Traits>* parser, |
| 1525 i::EnumSet<ParserFlag> flags) { | 1522 i::EnumSet<ParserFlag> flags) { |
| 1526 parser->set_allow_lazy(flags.Contains(kAllowLazy)); | 1523 parser->set_allow_lazy(flags.Contains(kAllowLazy)); |
| 1527 parser->set_allow_natives(flags.Contains(kAllowNatives)); | 1524 parser->set_allow_natives(flags.Contains(kAllowNatives)); |
| 1528 parser->set_allow_harmony_default_parameters( | |
| 1529 flags.Contains(kAllowHarmonyDefaultParameters)); | |
| 1530 parser->set_allow_harmony_sloppy(flags.Contains(kAllowHarmonySloppy)); | 1525 parser->set_allow_harmony_sloppy(flags.Contains(kAllowHarmonySloppy)); |
| 1531 parser->set_allow_harmony_sloppy_let(flags.Contains(kAllowHarmonySloppyLet)); | 1526 parser->set_allow_harmony_sloppy_let(flags.Contains(kAllowHarmonySloppyLet)); |
| 1532 parser->set_allow_harmony_destructuring_bind( | |
| 1533 flags.Contains(kAllowHarmonyDestructuring)); | |
| 1534 parser->set_allow_harmony_destructuring_assignment( | |
| 1535 flags.Contains(kAllowHarmonyDestructuringAssignment)); | |
| 1536 parser->set_allow_legacy_const(!flags.Contains(kNoLegacyConst)); | 1527 parser->set_allow_legacy_const(!flags.Contains(kNoLegacyConst)); |
| 1537 parser->set_allow_harmony_function_sent( | 1528 parser->set_allow_harmony_function_sent( |
| 1538 flags.Contains(kAllowHarmonyFunctionSent)); | 1529 flags.Contains(kAllowHarmonyFunctionSent)); |
| 1539 parser->set_allow_harmony_restrictive_declarations( | 1530 parser->set_allow_harmony_restrictive_declarations( |
| 1540 flags.Contains(kAllowHarmonyRestrictiveDeclarations)); | 1531 flags.Contains(kAllowHarmonyRestrictiveDeclarations)); |
| 1541 } | 1532 } |
| 1542 | 1533 |
| 1543 | 1534 |
| 1544 void TestParserSyncWithFlags(i::Handle<i::String> source, | 1535 void TestParserSyncWithFlags(i::Handle<i::String> source, |
| 1545 i::EnumSet<ParserFlag> flags, | 1536 i::EnumSet<ParserFlag> flags, |
| (...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2343 "yield, yield", | 2334 "yield, yield", |
| 2344 "yield; yield", | 2335 "yield; yield", |
| 2345 "(yield) ? yield : yield", | 2336 "(yield) ? yield : yield", |
| 2346 "(yield) \n ? yield : yield", | 2337 "(yield) \n ? yield : yield", |
| 2347 // If there is a newline before the next token, we don't look for RHS. | 2338 // If there is a newline before the next token, we don't look for RHS. |
| 2348 "yield\nfor (;;) {}", | 2339 "yield\nfor (;;) {}", |
| 2349 NULL | 2340 NULL |
| 2350 }; | 2341 }; |
| 2351 // clang-format on | 2342 // clang-format on |
| 2352 | 2343 |
| 2353 static const ParserFlag always_flags[] = { | 2344 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 2354 kAllowHarmonyDestructuringAssignment}; | |
| 2355 RunParserSyncTest(context_data, statement_data, kSuccess, nullptr, 0, | |
| 2356 always_flags, arraysize(always_flags)); | |
| 2357 } | 2345 } |
| 2358 | 2346 |
| 2359 | 2347 |
| 2360 TEST(ErrorsYieldGenerator) { | 2348 TEST(ErrorsYieldGenerator) { |
| 2361 // clang-format off | 2349 // clang-format off |
| 2362 const char* context_data[][2] = { | 2350 const char* context_data[][2] = { |
| 2363 { "function * gen() {", "}" }, | 2351 { "function * gen() {", "}" }, |
| 2364 { "\"use strict\"; function * gen() {", "}" }, | 2352 { "\"use strict\"; function * gen() {", "}" }, |
| 2365 { NULL, NULL } | 2353 { NULL, NULL } |
| 2366 }; | 2354 }; |
| (...skipping 1368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3735 "(a, b - c) => {}", | 3723 "(a, b - c) => {}", |
| 3736 "\"a\" => {}", | 3724 "\"a\" => {}", |
| 3737 "(\"a\") => {}", | 3725 "(\"a\") => {}", |
| 3738 "(\"a\", b) => {}", | 3726 "(\"a\", b) => {}", |
| 3739 "(a, \"b\") => {}", | 3727 "(a, \"b\") => {}", |
| 3740 "-a => {}", | 3728 "-a => {}", |
| 3741 "(-a) => {}", | 3729 "(-a) => {}", |
| 3742 "(-a, b) => {}", | 3730 "(-a, b) => {}", |
| 3743 "(a, -b) => {}", | 3731 "(a, -b) => {}", |
| 3744 "{} => {}", | 3732 "{} => {}", |
| 3745 "({}) => {}", | |
| 3746 "(a, {}) => {}", | |
| 3747 "({}, a) => {}", | |
| 3748 "a++ => {}", | 3733 "a++ => {}", |
| 3749 "(a++) => {}", | 3734 "(a++) => {}", |
| 3750 "(a++, b) => {}", | 3735 "(a++, b) => {}", |
| 3751 "(a, b++) => {}", | 3736 "(a, b++) => {}", |
| 3752 "[] => {}", | 3737 "[] => {}", |
| 3753 "([]) => {}", | |
| 3754 "(a, []) => {}", | |
| 3755 "([], a) => {}", | |
| 3756 "(a = b) => {}", | |
| 3757 "(a = b, c) => {}", | |
| 3758 "(a, b = c) => {}", | |
| 3759 "(foo ? bar : baz) => {}", | 3738 "(foo ? bar : baz) => {}", |
| 3760 "(a, foo ? bar : baz) => {}", | 3739 "(a, foo ? bar : baz) => {}", |
| 3761 "(foo ? bar : baz, a) => {}", | 3740 "(foo ? bar : baz, a) => {}", |
| 3762 "(a.b, c) => {}", | 3741 "(a.b, c) => {}", |
| 3763 "(c, a.b) => {}", | 3742 "(c, a.b) => {}", |
| 3764 "(a['b'], c) => {}", | 3743 "(a['b'], c) => {}", |
| 3765 "(c, a['b']) => {}", | 3744 "(c, a['b']) => {}", |
| 3766 | 3745 |
| 3767 // crbug.com/582626 | 3746 // crbug.com/582626 |
| 3768 "(...rest - a) => b", | 3747 "(...rest - a) => b", |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3782 const char* loop_context_data[][2] = {{"for (", "; 0;);"}, | 3761 const char* loop_context_data[][2] = {{"for (", "; 0;);"}, |
| 3783 {nullptr, nullptr}}; | 3762 {nullptr, nullptr}}; |
| 3784 const char* loop_expr_data[] = {"f => 'key' in {}", nullptr}; | 3763 const char* loop_expr_data[] = {"f => 'key' in {}", nullptr}; |
| 3785 RunParserSyncTest(loop_context_data, loop_expr_data, kError, flags, | 3764 RunParserSyncTest(loop_context_data, loop_expr_data, kError, flags, |
| 3786 arraysize(flags)); | 3765 arraysize(flags)); |
| 3787 } | 3766 } |
| 3788 | 3767 |
| 3789 | 3768 |
| 3790 TEST(NoErrorsArrowFunctions) { | 3769 TEST(NoErrorsArrowFunctions) { |
| 3791 // Tests that parser and preparser accept valid arrow functions syntax. | 3770 // Tests that parser and preparser accept valid arrow functions syntax. |
| 3771 // clang-format off |
| 3792 const char* context_data[][2] = { | 3772 const char* context_data[][2] = { |
| 3793 {"", ";"}, | 3773 {"", ";"}, |
| 3794 {"bar ? (", ") : baz;"}, | 3774 {"bar ? (", ") : baz;"}, |
| 3795 {"bar ? baz : (", ");"}, | 3775 {"bar ? baz : (", ");"}, |
| 3796 {"bar, ", ";"}, | 3776 {"bar, ", ";"}, |
| 3797 {"", ", bar;"}, | 3777 {"", ", bar;"}, |
| 3798 {NULL, NULL} | 3778 {NULL, NULL} |
| 3799 }; | 3779 }; |
| 3800 | 3780 |
| 3801 const char* statement_data[] = { | 3781 const char* statement_data[] = { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 3827 "(a, b, (c, d) => 0)", | 3807 "(a, b, (c, d) => 0)", |
| 3828 "(a, b) => 0, (c, d) => 1", | 3808 "(a, b) => 0, (c, d) => 1", |
| 3829 "(a, b => {}, a => a + 1)", | 3809 "(a, b => {}, a => a + 1)", |
| 3830 "((a, b) => {}, (a => a + 1))", | 3810 "((a, b) => {}, (a => a + 1))", |
| 3831 "(a, (a, (b, c) => 0))", | 3811 "(a, (a, (b, c) => 0))", |
| 3832 | 3812 |
| 3833 // Arrow has more precedence, this is the same as: foo ? bar : (baz = {}) | 3813 // Arrow has more precedence, this is the same as: foo ? bar : (baz = {}) |
| 3834 "foo ? bar : baz => {}", | 3814 "foo ? bar : baz => {}", |
| 3835 | 3815 |
| 3836 // Arrows with non-simple parameters. | 3816 // Arrows with non-simple parameters. |
| 3817 "({}) => {}", |
| 3818 "(a, {}) => {}", |
| 3819 "({}, a) => {}", |
| 3820 "([]) => {}", |
| 3821 "(a, []) => {}", |
| 3822 "([], a) => {}", |
| 3823 "(a = b) => {}", |
| 3824 "(a = b, c) => {}", |
| 3825 "(a, b = c) => {}", |
| 3837 "({a}) => {}", | 3826 "({a}) => {}", |
| 3838 "(x = 9) => {}", | 3827 "(x = 9) => {}", |
| 3839 "(x, y = 9) => {}", | 3828 "(x, y = 9) => {}", |
| 3840 "(x = 9, y) => {}", | 3829 "(x = 9, y) => {}", |
| 3841 "(x, y = 9, z) => {}", | 3830 "(x, y = 9, z) => {}", |
| 3842 "(x, y = 9, z = 8) => {}", | 3831 "(x, y = 9, z = 8) => {}", |
| 3843 "(...a) => {}", | 3832 "(...a) => {}", |
| 3844 "(x, ...a) => {}", | 3833 "(x, ...a) => {}", |
| 3845 "(x = 9, ...a) => {}", | 3834 "(x = 9, ...a) => {}", |
| 3846 "(x, y = 9, ...a) => {}", | 3835 "(x, y = 9, ...a) => {}", |
| 3847 "(x, y = 9, {b}, z = 8, ...a) => {}", | 3836 "(x, y = 9, {b}, z = 8, ...a) => {}", |
| 3848 // TODO(wingo, rossberg): This is not accepted right now. | 3837 "({a} = {}) => {}", |
| 3849 // "({a} = {}) => {}", | 3838 "([x] = []) => {}", |
| 3850 // "([x] = []) => {}", | |
| 3851 "({a = 42}) => {}", | 3839 "({a = 42}) => {}", |
| 3852 "([x = 0]) => {}", | 3840 "([x = 0]) => {}", |
| 3853 NULL | 3841 NULL |
| 3854 }; | 3842 }; |
| 3843 // clang-format on |
| 3855 | 3844 |
| 3856 static const ParserFlag always_flags[] = {kAllowHarmonyDefaultParameters, | 3845 RunParserSyncTest(context_data, statement_data, kSuccess); |
| 3857 kAllowHarmonyDestructuring}; | |
| 3858 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | |
| 3859 always_flags, arraysize(always_flags)); | |
| 3860 | 3846 |
| 3861 static const ParserFlag flags[] = {kAllowLazy}; | 3847 static const ParserFlag flags[] = {kAllowLazy}; |
| 3862 // In a context where a concise arrow body is parsed with [~In] variant, | 3848 // In a context where a concise arrow body is parsed with [~In] variant, |
| 3863 // ensure that nested expressions can still use the 'in' operator, | 3849 // ensure that nested expressions can still use the 'in' operator, |
| 3864 const char* loop_context_data[][2] = {{"for (", "; 0;);"}, | 3850 const char* loop_context_data[][2] = {{"for (", "; 0;);"}, |
| 3865 {nullptr, nullptr}}; | 3851 {nullptr, nullptr}}; |
| 3866 const char* loop_expr_data[] = {"f => ('key' in {})", nullptr}; | 3852 const char* loop_expr_data[] = {"f => ('key' in {})", nullptr}; |
| 3867 RunParserSyncTest(loop_context_data, loop_expr_data, kSuccess, flags, | 3853 RunParserSyncTest(loop_context_data, loop_expr_data, kSuccess, flags, |
| 3868 arraysize(flags)); | 3854 arraysize(flags)); |
| 3869 } | 3855 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3936 "(yield) => {}", | 3922 "(yield) => {}", |
| 3937 "(a, yield) => {}", | 3923 "(a, yield) => {}", |
| 3938 "(yield, a) => {}", | 3924 "(yield, a) => {}", |
| 3939 "(yield, ...a) => {}", | 3925 "(yield, ...a) => {}", |
| 3940 "(a, ...yield) => {}", | 3926 "(a, ...yield) => {}", |
| 3941 "({yield}) => {}", | 3927 "({yield}) => {}", |
| 3942 "([yield]) => {}", | 3928 "([yield]) => {}", |
| 3943 NULL | 3929 NULL |
| 3944 }; | 3930 }; |
| 3945 | 3931 |
| 3946 static const ParserFlag always_flags[] = { kAllowHarmonyDestructuring }; | 3932 RunParserSyncTest(sloppy_function_context_data, arrow_data, kSuccess); |
| 3947 RunParserSyncTest(sloppy_function_context_data, arrow_data, kSuccess, NULL, 0, | 3933 RunParserSyncTest(strict_function_context_data, arrow_data, kError); |
| 3948 always_flags, arraysize(always_flags)); | 3934 RunParserSyncTest(generator_context_data, arrow_data, kError); |
| 3949 RunParserSyncTest(strict_function_context_data, arrow_data, kError, NULL, 0, | |
| 3950 always_flags, arraysize(always_flags)); | |
| 3951 RunParserSyncTest(generator_context_data, arrow_data, kError, NULL, 0, | |
| 3952 always_flags, arraysize(always_flags)); | |
| 3953 } | 3935 } |
| 3954 | 3936 |
| 3955 | 3937 |
| 3956 TEST(SuperNoErrors) { | 3938 TEST(SuperNoErrors) { |
| 3957 // Tests that parser and preparser accept 'super' keyword in right places. | 3939 // Tests that parser and preparser accept 'super' keyword in right places. |
| 3958 const char* context_data[][2] = { | 3940 const char* context_data[][2] = { |
| 3959 {"class C { m() { ", "; } }"}, | 3941 {"class C { m() { ", "; } }"}, |
| 3960 {"class C { m() { k = ", "; } }"}, | 3942 {"class C { m() { k = ", "; } }"}, |
| 3961 {"class C { m() { foo(", "); } }"}, | 3943 {"class C { m() { foo(", "); } }"}, |
| 3962 {"class C { m() { () => ", "; } }"}, | 3944 {"class C { m() { () => ", "; } }"}, |
| (...skipping 1406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5369 "...\rargs", | 5351 "...\rargs", |
| 5370 "a, ...\rargs", | 5352 "a, ...\rargs", |
| 5371 "...\t\n\t\t\n args", | 5353 "...\t\n\t\t\n args", |
| 5372 "a, ... \n \n args", | 5354 "a, ... \n \n args", |
| 5373 "...{ length, 0: a, 1: b}", | 5355 "...{ length, 0: a, 1: b}", |
| 5374 "...{}", | 5356 "...{}", |
| 5375 "...[a, b]", | 5357 "...[a, b]", |
| 5376 "...[]", | 5358 "...[]", |
| 5377 "...[...[a, b, ...c]]", | 5359 "...[...[a, b, ...c]]", |
| 5378 NULL}; | 5360 NULL}; |
| 5379 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; | 5361 RunParserSyncTest(context_data, data, kSuccess); |
| 5380 RunParserSyncTest(context_data, data, kSuccess, nullptr, 0, always_flags, | |
| 5381 arraysize(always_flags)); | |
| 5382 } | 5362 } |
| 5383 | 5363 |
| 5384 | 5364 |
| 5385 TEST(ParseRestParametersErrors) { | 5365 TEST(ParseRestParametersErrors) { |
| 5386 const char* context_data[][2] = {{"'use strict';(function(", | 5366 const char* context_data[][2] = {{"'use strict';(function(", |
| 5387 "){ return args;}(1, [], /regexp/, 'str'," | 5367 "){ return args;}(1, [], /regexp/, 'str'," |
| 5388 "function(){});"}, | 5368 "function(){});"}, |
| 5389 {"(function(", "){ return args;}(1, []," | 5369 {"(function(", "){ return args;}(1, []," |
| 5390 "/regexp/, 'str', function(){});"}, | 5370 "/regexp/, 'str', function(){});"}, |
| 5391 {NULL, NULL}}; | 5371 {NULL, NULL}}; |
| (...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6020 "(a/*\n*/=> a)(1)", | 6000 "(a/*\n*/=> a)(1)", |
| 6021 "((a)\n=> a)(1)", | 6001 "((a)\n=> a)(1)", |
| 6022 "((a)/*\n*/=> a)(1)", | 6002 "((a)/*\n*/=> a)(1)", |
| 6023 "((a, b)\n=> a + b)(1, 2)", | 6003 "((a, b)\n=> a + b)(1, 2)", |
| 6024 "((a, b)/*\n*/=> a + b)(1, 2)", | 6004 "((a, b)/*\n*/=> a + b)(1, 2)", |
| 6025 NULL}; | 6005 NULL}; |
| 6026 RunParserSyncTest(context_data, data, kError); | 6006 RunParserSyncTest(context_data, data, kError); |
| 6027 } | 6007 } |
| 6028 | 6008 |
| 6029 | 6009 |
| 6030 static const ParserFlag kAllDestructuringFlags[] = { | |
| 6031 kAllowHarmonyDestructuring, kAllowHarmonyDestructuringAssignment, | |
| 6032 kAllowHarmonyDefaultParameters}; | |
| 6033 | |
| 6034 TEST(DestructuringPositiveTests) { | 6010 TEST(DestructuringPositiveTests) { |
| 6035 i::FLAG_harmony_destructuring_bind = true; | |
| 6036 | |
| 6037 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, | 6011 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, |
| 6038 {"var ", " = {};"}, | 6012 {"var ", " = {};"}, |
| 6039 {"'use strict'; const ", " = {};"}, | 6013 {"'use strict'; const ", " = {};"}, |
| 6040 {"function f(", ") {}"}, | 6014 {"function f(", ") {}"}, |
| 6041 {"function f(argument1, ", ") {}"}, | 6015 {"function f(argument1, ", ") {}"}, |
| 6042 {"var f = (", ") => {};"}, | 6016 {"var f = (", ") => {};"}, |
| 6043 {"var f = (argument1,", ") => {};"}, | 6017 {"var f = (argument1,", ") => {};"}, |
| 6044 {"try {} catch(", ") {}"}, | 6018 {"try {} catch(", ") {}"}, |
| 6045 {NULL, NULL}}; | 6019 {NULL, NULL}}; |
| 6046 | 6020 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 6077 "{var: x = 42}", | 6051 "{var: x = 42}", |
| 6078 "{[x] : z}", | 6052 "{[x] : z}", |
| 6079 "{[1+1] : z}", | 6053 "{[1+1] : z}", |
| 6080 "{[foo()] : z}", | 6054 "{[foo()] : z}", |
| 6081 "{}", | 6055 "{}", |
| 6082 "[...rest]", | 6056 "[...rest]", |
| 6083 "[a,b,...rest]", | 6057 "[a,b,...rest]", |
| 6084 "[a,,...rest]", | 6058 "[a,,...rest]", |
| 6085 NULL}; | 6059 NULL}; |
| 6086 // clang-format on | 6060 // clang-format on |
| 6087 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; | 6061 RunParserSyncTest(context_data, data, kSuccess); |
| 6088 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, | |
| 6089 arraysize(always_flags)); | |
| 6090 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, | |
| 6091 kAllDestructuringFlags, arraysize(kAllDestructuringFlags)); | |
| 6092 } | 6062 } |
| 6093 | 6063 |
| 6094 | 6064 |
| 6095 TEST(DestructuringNegativeTests) { | 6065 TEST(DestructuringNegativeTests) { |
| 6096 i::FLAG_harmony_destructuring_bind = true; | |
| 6097 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; | |
| 6098 | |
| 6099 { // All modes. | 6066 { // All modes. |
| 6100 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, | 6067 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, |
| 6101 {"var ", " = {};"}, | 6068 {"var ", " = {};"}, |
| 6102 {"'use strict'; const ", " = {};"}, | 6069 {"'use strict'; const ", " = {};"}, |
| 6103 {"function f(", ") {}"}, | 6070 {"function f(", ") {}"}, |
| 6104 {"function f(argument1, ", ") {}"}, | 6071 {"function f(argument1, ", ") {}"}, |
| 6105 {"var f = (", ") => {};"}, | 6072 {"var f = (", ") => {};"}, |
| 6106 {"var f = ", " => {};"}, | 6073 {"var f = ", " => {};"}, |
| 6107 {"var f = (argument1,", ") => {};"}, | 6074 {"var f = (argument1,", ") => {};"}, |
| 6108 {"try {} catch(", ") {}"}, | 6075 {"try {} catch(", ") {}"}, |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6173 "{ x : 3 }", | 6140 "{ x : 3 }", |
| 6174 "{ x : 'foo' }", | 6141 "{ x : 'foo' }", |
| 6175 "{ x : /foo/ }", | 6142 "{ x : /foo/ }", |
| 6176 "{ x : `foo` }", | 6143 "{ x : `foo` }", |
| 6177 "{ get a() {} }", | 6144 "{ get a() {} }", |
| 6178 "{ set a() {} }", | 6145 "{ set a() {} }", |
| 6179 "{ method() {} }", | 6146 "{ method() {} }", |
| 6180 "{ *method() {} }", | 6147 "{ *method() {} }", |
| 6181 NULL}; | 6148 NULL}; |
| 6182 // clang-format on | 6149 // clang-format on |
| 6183 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 6150 RunParserSyncTest(context_data, data, kError); |
| 6184 arraysize(always_flags)); | |
| 6185 RunParserSyncTest(context_data, data, kError, NULL, 0, | |
| 6186 kAllDestructuringFlags, | |
| 6187 arraysize(kAllDestructuringFlags)); | |
| 6188 } | 6151 } |
| 6189 | 6152 |
| 6190 { // All modes. | 6153 { // All modes. |
| 6191 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, | 6154 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, |
| 6192 {"var ", " = {};"}, | 6155 {"var ", " = {};"}, |
| 6193 {"'use strict'; const ", " = {};"}, | 6156 {"'use strict'; const ", " = {};"}, |
| 6194 {"function f(", ") {}"}, | 6157 {"function f(", ") {}"}, |
| 6195 {"function f(argument1, ", ") {}"}, | 6158 {"function f(argument1, ", ") {}"}, |
| 6196 {"var f = (", ") => {};"}, | 6159 {"var f = (", ") => {};"}, |
| 6197 {"var f = (argument1,", ") => {};"}, | 6160 {"var f = (argument1,", ") => {};"}, |
| 6198 {NULL, NULL}}; | 6161 {NULL, NULL}}; |
| 6199 | 6162 |
| 6200 // clang-format off | 6163 // clang-format off |
| 6201 const char* data[] = { | 6164 const char* data[] = { |
| 6202 "x => x", | 6165 "x => x", |
| 6203 "() => x", | 6166 "() => x", |
| 6204 NULL}; | 6167 NULL}; |
| 6205 // clang-format on | 6168 // clang-format on |
| 6206 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 6169 RunParserSyncTest(context_data, data, kError); |
| 6207 arraysize(always_flags)); | |
| 6208 RunParserSyncTest(context_data, data, kError, NULL, 0, | |
| 6209 kAllDestructuringFlags, | |
| 6210 arraysize(kAllDestructuringFlags)); | |
| 6211 } | 6170 } |
| 6212 | 6171 |
| 6213 { // Strict mode. | 6172 { // Strict mode. |
| 6214 const char* context_data[][2] = { | 6173 const char* context_data[][2] = { |
| 6215 {"'use strict'; let ", " = {};"}, | 6174 {"'use strict'; let ", " = {};"}, |
| 6216 {"'use strict'; const ", " = {};"}, | 6175 {"'use strict'; const ", " = {};"}, |
| 6217 {"'use strict'; function f(", ") {}"}, | 6176 {"'use strict'; function f(", ") {}"}, |
| 6218 {"'use strict'; function f(argument1, ", ") {}"}, | 6177 {"'use strict'; function f(argument1, ", ") {}"}, |
| 6219 {NULL, NULL}}; | 6178 {NULL, NULL}}; |
| 6220 | 6179 |
| 6221 // clang-format off | 6180 // clang-format off |
| 6222 const char* data[] = { | 6181 const char* data[] = { |
| 6223 "[eval]", | 6182 "[eval]", |
| 6224 "{ a : arguments }", | 6183 "{ a : arguments }", |
| 6225 "[public]", | 6184 "[public]", |
| 6226 "{ x : private }", | 6185 "{ x : private }", |
| 6227 NULL}; | 6186 NULL}; |
| 6228 // clang-format on | 6187 // clang-format on |
| 6229 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 6188 RunParserSyncTest(context_data, data, kError); |
| 6230 arraysize(always_flags)); | |
| 6231 RunParserSyncTest(context_data, data, kError, NULL, 0, | |
| 6232 kAllDestructuringFlags, | |
| 6233 arraysize(kAllDestructuringFlags)); | |
| 6234 } | 6189 } |
| 6235 | 6190 |
| 6236 { // 'yield' in generators. | 6191 { // 'yield' in generators. |
| 6237 const char* context_data[][2] = { | 6192 const char* context_data[][2] = { |
| 6238 {"function*() { var ", " = {};"}, | 6193 {"function*() { var ", " = {};"}, |
| 6239 {"function*() { 'use strict'; let ", " = {};"}, | 6194 {"function*() { 'use strict'; let ", " = {};"}, |
| 6240 {"function*() { 'use strict'; const ", " = {};"}, | 6195 {"function*() { 'use strict'; const ", " = {};"}, |
| 6241 {NULL, NULL}}; | 6196 {NULL, NULL}}; |
| 6242 | 6197 |
| 6243 // clang-format off | 6198 // clang-format off |
| 6244 const char* data[] = { | 6199 const char* data[] = { |
| 6245 "yield", | 6200 "yield", |
| 6246 "[yield]", | 6201 "[yield]", |
| 6247 "{ x : yield }", | 6202 "{ x : yield }", |
| 6248 NULL}; | 6203 NULL}; |
| 6249 // clang-format on | 6204 // clang-format on |
| 6250 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 6205 RunParserSyncTest(context_data, data, kError); |
| 6251 arraysize(always_flags)); | |
| 6252 RunParserSyncTest(context_data, data, kError, NULL, 0, | |
| 6253 kAllDestructuringFlags, | |
| 6254 arraysize(kAllDestructuringFlags)); | |
| 6255 } | 6206 } |
| 6256 | 6207 |
| 6257 { // Declaration-specific errors | 6208 { // Declaration-specific errors |
| 6258 const char* context_data[][2] = {{"'use strict'; var ", ""}, | 6209 const char* context_data[][2] = {{"'use strict'; var ", ""}, |
| 6259 {"'use strict'; let ", ""}, | 6210 {"'use strict'; let ", ""}, |
| 6260 {"'use strict'; const ", ""}, | 6211 {"'use strict'; const ", ""}, |
| 6261 {"'use strict'; for (var ", ";;) {}"}, | 6212 {"'use strict'; for (var ", ";;) {}"}, |
| 6262 {"'use strict'; for (let ", ";;) {}"}, | 6213 {"'use strict'; for (let ", ";;) {}"}, |
| 6263 {"'use strict'; for (const ", ";;) {}"}, | 6214 {"'use strict'; for (const ", ";;) {}"}, |
| 6264 {"var ", ""}, | 6215 {"var ", ""}, |
| 6265 {"let ", ""}, | 6216 {"let ", ""}, |
| 6266 {"const ", ""}, | 6217 {"const ", ""}, |
| 6267 {"for (var ", ";;) {}"}, | 6218 {"for (var ", ";;) {}"}, |
| 6268 {"for (let ", ";;) {}"}, | 6219 {"for (let ", ";;) {}"}, |
| 6269 {"for (const ", ";;) {}"}, | 6220 {"for (const ", ";;) {}"}, |
| 6270 {NULL, NULL}}; | 6221 {NULL, NULL}}; |
| 6271 | 6222 |
| 6272 // clang-format off | 6223 // clang-format off |
| 6273 const char* data[] = { | 6224 const char* data[] = { |
| 6274 "{ a }", | 6225 "{ a }", |
| 6275 "[ a ]", | 6226 "[ a ]", |
| 6276 NULL}; | 6227 NULL}; |
| 6277 // clang-format on | 6228 // clang-format on |
| 6278 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring, | 6229 static const ParserFlag always_flags[] = {kAllowHarmonySloppyLet}; |
| 6279 kAllowHarmonySloppyLet}; | |
| 6280 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 6230 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, |
| 6281 arraysize(always_flags)); | 6231 arraysize(always_flags)); |
| 6282 } | 6232 } |
| 6283 } | 6233 } |
| 6284 | 6234 |
| 6285 | 6235 |
| 6286 TEST(DestructuringAssignmentPositiveTests) { | 6236 TEST(DestructuringAssignmentPositiveTests) { |
| 6287 const char* context_data[][2] = { | 6237 const char* context_data[][2] = { |
| 6288 {"'use strict'; let x, y, z; (", " = {});"}, | 6238 {"'use strict'; let x, y, z; (", " = {});"}, |
| 6289 {"var x, y, z; (", " = {});"}, | 6239 {"var x, y, z; (", " = {});"}, |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6442 "{ x: (foo['bar']) }", | 6392 "{ x: (foo['bar']) }", |
| 6443 "[ ...(a) ]", | 6393 "[ ...(a) ]", |
| 6444 "[ ...(foo['bar']) ]", | 6394 "[ ...(foo['bar']) ]", |
| 6445 "[ ...(foo.bar) ]", | 6395 "[ ...(foo.bar) ]", |
| 6446 "[ (y) ]", | 6396 "[ (y) ]", |
| 6447 "[ (foo.bar) ]", | 6397 "[ (foo.bar) ]", |
| 6448 "[ (foo['bar']) ]", | 6398 "[ (foo['bar']) ]", |
| 6449 | 6399 |
| 6450 NULL}; | 6400 NULL}; |
| 6451 // clang-format on | 6401 // clang-format on |
| 6452 static const ParserFlag always_flags[] = { | 6402 RunParserSyncTest(context_data, data, kSuccess); |
| 6453 kAllowHarmonyDestructuringAssignment, kAllowHarmonyDestructuring, | |
| 6454 kAllowHarmonyDefaultParameters}; | |
| 6455 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, | |
| 6456 arraysize(always_flags)); | |
| 6457 | 6403 |
| 6458 RunParserSyncTest(mixed_assignments_context_data, data, kSuccess, NULL, 0, | 6404 RunParserSyncTest(mixed_assignments_context_data, data, kSuccess); |
| 6459 always_flags, arraysize(always_flags)); | |
| 6460 | 6405 |
| 6461 const char* empty_context_data[][2] = { | 6406 const char* empty_context_data[][2] = { |
| 6462 {"'use strict';", ""}, {"", ""}, {NULL, NULL}}; | 6407 {"'use strict';", ""}, {"", ""}, {NULL, NULL}}; |
| 6463 | 6408 |
| 6464 // CoverInitializedName ambiguity handling in various contexts | 6409 // CoverInitializedName ambiguity handling in various contexts |
| 6465 const char* ambiguity_data[] = { | 6410 const char* ambiguity_data[] = { |
| 6466 "var foo = { x = 10 } = {};", | 6411 "var foo = { x = 10 } = {};", |
| 6467 "var foo = { q } = { x = 10 } = {};", | 6412 "var foo = { q } = { x = 10 } = {};", |
| 6468 "var foo; foo = { x = 10 } = {};", | 6413 "var foo; foo = { x = 10 } = {};", |
| 6469 "var foo; foo = { q } = { x = 10 } = {};", | 6414 "var foo; foo = { q } = { x = 10 } = {};", |
| 6470 "var x; ({ x = 10 } = {});", | 6415 "var x; ({ x = 10 } = {});", |
| 6471 "var q, x; ({ q } = { x = 10 } = {});", | 6416 "var q, x; ({ q } = { x = 10 } = {});", |
| 6472 "var x; [{ x = 10 } = {}]", | 6417 "var x; [{ x = 10 } = {}]", |
| 6473 "var x; (true ? { x = true } = {} : { x = false } = {})", | 6418 "var x; (true ? { x = true } = {} : { x = false } = {})", |
| 6474 "var q, x; (q, { x = 10 } = {});", | 6419 "var q, x; (q, { x = 10 } = {});", |
| 6475 "var { x = 10 } = { x = 20 } = {};", | 6420 "var { x = 10 } = { x = 20 } = {};", |
| 6476 "var { x = 10 } = (o = { x = 20 } = {});", | 6421 "var { x = 10 } = (o = { x = 20 } = {});", |
| 6477 "var x; (({ x = 10 } = { x = 20 } = {}) => x)({})", | 6422 "var x; (({ x = 10 } = { x = 20 } = {}) => x)({})", |
| 6478 NULL, | 6423 NULL, |
| 6479 }; | 6424 }; |
| 6480 RunParserSyncTest(empty_context_data, ambiguity_data, kSuccess, NULL, 0, | 6425 RunParserSyncTest(empty_context_data, ambiguity_data, kSuccess); |
| 6481 always_flags, arraysize(always_flags)); | |
| 6482 } | 6426 } |
| 6483 | 6427 |
| 6484 | 6428 |
| 6485 TEST(DestructuringAssignmentNegativeTests) { | 6429 TEST(DestructuringAssignmentNegativeTests) { |
| 6486 const char* context_data[][2] = { | 6430 const char* context_data[][2] = { |
| 6487 {"'use strict'; let x, y, z; (", " = {});"}, | 6431 {"'use strict'; let x, y, z; (", " = {});"}, |
| 6488 {"var x, y, z; (", " = {});"}, | 6432 {"var x, y, z; (", " = {});"}, |
| 6489 {"'use strict'; let x, y, z; for (x in ", " = {});"}, | 6433 {"'use strict'; let x, y, z; for (x in ", " = {});"}, |
| 6490 {"'use strict'; let x, y, z; for (x of ", " = {});"}, | 6434 {"'use strict'; let x, y, z; for (x of ", " = {});"}, |
| 6491 {"var x, y, z; for (x in ", " = {});"}, | 6435 {"var x, y, z; for (x in ", " = {});"}, |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6570 "[ (...[a]) ]", | 6514 "[ (...[a]) ]", |
| 6571 "[ ([a] = []) ]", | 6515 "[ ([a] = []) ]", |
| 6572 "[ (++y) ]", | 6516 "[ (++y) ]", |
| 6573 "[ ...(++y) ]", | 6517 "[ ...(++y) ]", |
| 6574 | 6518 |
| 6575 "[ x += x ]", | 6519 "[ x += x ]", |
| 6576 "{ foo: x += x }", | 6520 "{ foo: x += x }", |
| 6577 | 6521 |
| 6578 NULL}; | 6522 NULL}; |
| 6579 // clang-format on | 6523 // clang-format on |
| 6580 static const ParserFlag always_flags[] = { | 6524 RunParserSyncTest(context_data, data, kError); |
| 6581 kAllowHarmonyDestructuringAssignment, kAllowHarmonyDestructuring, | |
| 6582 kAllowHarmonyDefaultParameters}; | |
| 6583 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | |
| 6584 arraysize(always_flags)); | |
| 6585 | 6525 |
| 6586 const char* empty_context_data[][2] = { | 6526 const char* empty_context_data[][2] = { |
| 6587 {"'use strict';", ""}, {"", ""}, {NULL, NULL}}; | 6527 {"'use strict';", ""}, {"", ""}, {NULL, NULL}}; |
| 6588 | 6528 |
| 6589 // CoverInitializedName ambiguity handling in various contexts | 6529 // CoverInitializedName ambiguity handling in various contexts |
| 6590 const char* ambiguity_data[] = { | 6530 const char* ambiguity_data[] = { |
| 6591 "var foo = { x = 10 };", | 6531 "var foo = { x = 10 };", |
| 6592 "var foo = { q } = { x = 10 };", | 6532 "var foo = { q } = { x = 10 };", |
| 6593 "var foo; foo = { x = 10 };", | 6533 "var foo; foo = { x = 10 };", |
| 6594 "var foo; foo = { q } = { x = 10 };", | 6534 "var foo; foo = { q } = { x = 10 };", |
| 6595 "var x; ({ x = 10 });", | 6535 "var x; ({ x = 10 });", |
| 6596 "var q, x; ({ q } = { x = 10 });", | 6536 "var q, x; ({ q } = { x = 10 });", |
| 6597 "var x; [{ x = 10 }]", | 6537 "var x; [{ x = 10 }]", |
| 6598 "var x; (true ? { x = true } : { x = false })", | 6538 "var x; (true ? { x = true } : { x = false })", |
| 6599 "var q, x; (q, { x = 10 });", | 6539 "var q, x; (q, { x = 10 });", |
| 6600 "var { x = 10 } = { x = 20 };", | 6540 "var { x = 10 } = { x = 20 };", |
| 6601 "var { x = 10 } = (o = { x = 20 });", | 6541 "var { x = 10 } = (o = { x = 20 });", |
| 6602 "var x; (({ x = 10 } = { x = 20 }) => x)({})", | 6542 "var x; (({ x = 10 } = { x = 20 }) => x)({})", |
| 6603 | 6543 |
| 6604 // Not ambiguous, but uses same context data | 6544 // Not ambiguous, but uses same context data |
| 6605 "switch([window %= []] = []) { default: }", | 6545 "switch([window %= []] = []) { default: }", |
| 6606 | 6546 |
| 6607 NULL, | 6547 NULL, |
| 6608 }; | 6548 }; |
| 6609 RunParserSyncTest(empty_context_data, ambiguity_data, kError, NULL, 0, | 6549 RunParserSyncTest(empty_context_data, ambiguity_data, kError); |
| 6610 always_flags, arraysize(always_flags)); | |
| 6611 | 6550 |
| 6612 // Strict mode errors | 6551 // Strict mode errors |
| 6613 const char* strict_context_data[][2] = {{"'use strict'; (", " = {})"}, | 6552 const char* strict_context_data[][2] = {{"'use strict'; (", " = {})"}, |
| 6614 {"'use strict'; for (", " of {}) {}"}, | 6553 {"'use strict'; for (", " of {}) {}"}, |
| 6615 {"'use strict'; for (", " in {}) {}"}, | 6554 {"'use strict'; for (", " in {}) {}"}, |
| 6616 {NULL, NULL}}; | 6555 {NULL, NULL}}; |
| 6617 const char* strict_data[] = {"{ eval }", | 6556 const char* strict_data[] = {"{ eval }", |
| 6618 "{ arguments }", | 6557 "{ arguments }", |
| 6619 "{ foo: eval }", | 6558 "{ foo: eval }", |
| 6620 "{ foo: arguments }", | 6559 "{ foo: arguments }", |
| (...skipping 20 matching lines...) Expand all Loading... |
| 6641 "[ (eval) = 0 ]", | 6580 "[ (eval) = 0 ]", |
| 6642 "[ (arguments) = 0 ]", | 6581 "[ (arguments) = 0 ]", |
| 6643 "[ ...(eval) ]", | 6582 "[ ...(eval) ]", |
| 6644 "[ ...(arguments) ]", | 6583 "[ ...(arguments) ]", |
| 6645 "[ ...(eval = 0) ]", | 6584 "[ ...(eval = 0) ]", |
| 6646 "[ ...(arguments = 0) ]", | 6585 "[ ...(arguments = 0) ]", |
| 6647 "[ ...(eval) = 0 ]", | 6586 "[ ...(eval) = 0 ]", |
| 6648 "[ ...(arguments) = 0 ]", | 6587 "[ ...(arguments) = 0 ]", |
| 6649 | 6588 |
| 6650 NULL}; | 6589 NULL}; |
| 6651 RunParserSyncTest(strict_context_data, strict_data, kError, NULL, 0, | 6590 RunParserSyncTest(strict_context_data, strict_data, kError); |
| 6652 always_flags, arraysize(always_flags)); | |
| 6653 } | 6591 } |
| 6654 | 6592 |
| 6655 | 6593 |
| 6656 TEST(DestructuringDisallowPatternsInForVarIn) { | 6594 TEST(DestructuringDisallowPatternsInForVarIn) { |
| 6657 i::FLAG_harmony_destructuring_bind = true; | |
| 6658 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; | |
| 6659 const char* context_data[][2] = { | 6595 const char* context_data[][2] = { |
| 6660 {"", ""}, {"function f() {", "}"}, {NULL, NULL}}; | 6596 {"", ""}, {"function f() {", "}"}, {NULL, NULL}}; |
| 6661 // clang-format off | 6597 // clang-format off |
| 6662 const char* error_data[] = { | 6598 const char* error_data[] = { |
| 6663 "for (let x = {} in null);", | 6599 "for (let x = {} in null);", |
| 6664 "for (let x = {} of null);", | 6600 "for (let x = {} of null);", |
| 6665 NULL}; | 6601 NULL}; |
| 6666 // clang-format on | 6602 // clang-format on |
| 6667 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, | 6603 RunParserSyncTest(context_data, error_data, kError); |
| 6668 arraysize(always_flags)); | |
| 6669 | 6604 |
| 6670 // clang-format off | 6605 // clang-format off |
| 6671 const char* success_data[] = { | 6606 const char* success_data[] = { |
| 6672 "for (var x = {} in null);", | 6607 "for (var x = {} in null);", |
| 6673 NULL}; | 6608 NULL}; |
| 6674 // clang-format on | 6609 // clang-format on |
| 6675 RunParserSyncTest(context_data, success_data, kSuccess, NULL, 0, always_flags, | 6610 RunParserSyncTest(context_data, success_data, kSuccess); |
| 6676 arraysize(always_flags)); | |
| 6677 } | 6611 } |
| 6678 | 6612 |
| 6679 | 6613 |
| 6680 TEST(DestructuringDuplicateParams) { | 6614 TEST(DestructuringDuplicateParams) { |
| 6681 i::FLAG_harmony_destructuring_bind = true; | |
| 6682 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; | |
| 6683 const char* context_data[][2] = {{"'use strict';", ""}, | 6615 const char* context_data[][2] = {{"'use strict';", ""}, |
| 6684 {"function outer() { 'use strict';", "}"}, | 6616 {"function outer() { 'use strict';", "}"}, |
| 6685 {nullptr, nullptr}}; | 6617 {nullptr, nullptr}}; |
| 6686 | 6618 |
| 6687 | 6619 |
| 6688 // clang-format off | 6620 // clang-format off |
| 6689 const char* error_data[] = { | 6621 const char* error_data[] = { |
| 6690 "function f(x,x){}", | 6622 "function f(x,x){}", |
| 6691 "function f(x, {x : x}){}", | 6623 "function f(x, {x : x}){}", |
| 6692 "function f(x, {x}){}", | 6624 "function f(x, {x}){}", |
| 6693 "function f({x,x}) {}", | 6625 "function f({x,x}) {}", |
| 6694 "function f([x,x]) {}", | 6626 "function f([x,x]) {}", |
| 6695 "function f(x, [y,{z:x}]) {}", | 6627 "function f(x, [y,{z:x}]) {}", |
| 6696 "function f([x,{y:x}]) {}", | 6628 "function f([x,{y:x}]) {}", |
| 6697 // non-simple parameter list causes duplicates to be errors in sloppy mode. | 6629 // non-simple parameter list causes duplicates to be errors in sloppy mode. |
| 6698 "function f(x, x, {a}) {}", | 6630 "function f(x, x, {a}) {}", |
| 6699 nullptr}; | 6631 nullptr}; |
| 6700 // clang-format on | 6632 // clang-format on |
| 6701 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, | 6633 RunParserSyncTest(context_data, error_data, kError); |
| 6702 arraysize(always_flags)); | |
| 6703 } | 6634 } |
| 6704 | 6635 |
| 6705 | 6636 |
| 6706 TEST(DestructuringDuplicateParamsSloppy) { | 6637 TEST(DestructuringDuplicateParamsSloppy) { |
| 6707 i::FLAG_harmony_destructuring_bind = true; | |
| 6708 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; | |
| 6709 const char* context_data[][2] = { | 6638 const char* context_data[][2] = { |
| 6710 {"", ""}, {"function outer() {", "}"}, {nullptr, nullptr}}; | 6639 {"", ""}, {"function outer() {", "}"}, {nullptr, nullptr}}; |
| 6711 | 6640 |
| 6712 | 6641 |
| 6713 // clang-format off | 6642 // clang-format off |
| 6714 const char* error_data[] = { | 6643 const char* error_data[] = { |
| 6715 // non-simple parameter list causes duplicates to be errors in sloppy mode. | 6644 // non-simple parameter list causes duplicates to be errors in sloppy mode. |
| 6716 "function f(x, {x : x}){}", | 6645 "function f(x, {x : x}){}", |
| 6717 "function f(x, {x}){}", | 6646 "function f(x, {x}){}", |
| 6718 "function f({x,x}) {}", | 6647 "function f({x,x}) {}", |
| 6719 "function f(x, x, {a}) {}", | 6648 "function f(x, x, {a}) {}", |
| 6720 nullptr}; | 6649 nullptr}; |
| 6721 // clang-format on | 6650 // clang-format on |
| 6722 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, | 6651 RunParserSyncTest(context_data, error_data, kError); |
| 6723 arraysize(always_flags)); | |
| 6724 } | 6652 } |
| 6725 | 6653 |
| 6726 | 6654 |
| 6727 TEST(DestructuringDisallowPatternsInSingleParamArrows) { | 6655 TEST(DestructuringDisallowPatternsInSingleParamArrows) { |
| 6728 i::FLAG_harmony_destructuring_bind = true; | |
| 6729 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; | |
| 6730 const char* context_data[][2] = {{"'use strict';", ""}, | 6656 const char* context_data[][2] = {{"'use strict';", ""}, |
| 6731 {"function outer() { 'use strict';", "}"}, | 6657 {"function outer() { 'use strict';", "}"}, |
| 6732 {"", ""}, | 6658 {"", ""}, |
| 6733 {"function outer() { ", "}"}, | 6659 {"function outer() { ", "}"}, |
| 6734 {nullptr, nullptr}}; | 6660 {nullptr, nullptr}}; |
| 6735 | 6661 |
| 6736 // clang-format off | 6662 // clang-format off |
| 6737 const char* error_data[] = { | 6663 const char* error_data[] = { |
| 6738 "var f = {x} => {};", | 6664 "var f = {x} => {};", |
| 6739 "var f = {x,y} => {};", | 6665 "var f = {x,y} => {};", |
| 6740 nullptr}; | 6666 nullptr}; |
| 6741 // clang-format on | 6667 // clang-format on |
| 6742 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, | 6668 RunParserSyncTest(context_data, error_data, kError); |
| 6743 arraysize(always_flags)); | |
| 6744 } | 6669 } |
| 6745 | 6670 |
| 6746 | 6671 |
| 6747 TEST(DefaultParametersYieldInInitializers) { | 6672 TEST(DefaultParametersYieldInInitializers) { |
| 6748 // clang-format off | 6673 // clang-format off |
| 6749 const char* sloppy_function_context_data[][2] = { | 6674 const char* sloppy_function_context_data[][2] = { |
| 6750 {"(function f(", ") { });"}, | 6675 {"(function f(", ") { });"}, |
| 6751 {NULL, NULL} | 6676 {NULL, NULL} |
| 6752 }; | 6677 }; |
| 6753 | 6678 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6793 | 6718 |
| 6794 "{x}=(yield)", | 6719 "{x}=(yield)", |
| 6795 "[x]=(yield)", | 6720 "[x]=(yield)", |
| 6796 | 6721 |
| 6797 "{x}=f(yield)", | 6722 "{x}=f(yield)", |
| 6798 "[x]=f(yield)", | 6723 "[x]=f(yield)", |
| 6799 NULL | 6724 NULL |
| 6800 }; | 6725 }; |
| 6801 | 6726 |
| 6802 // clang-format on | 6727 // clang-format on |
| 6803 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring, | |
| 6804 kAllowHarmonyDefaultParameters}; | |
| 6805 | 6728 |
| 6806 RunParserSyncTest(sloppy_function_context_data, parameter_data, kSuccess, | 6729 RunParserSyncTest(sloppy_function_context_data, parameter_data, kSuccess); |
| 6807 NULL, 0, always_flags, arraysize(always_flags)); | 6730 RunParserSyncTest(sloppy_arrow_context_data, parameter_data, kSuccess); |
| 6808 RunParserSyncTest(sloppy_arrow_context_data, parameter_data, kSuccess, NULL, | |
| 6809 0, always_flags, arraysize(always_flags)); | |
| 6810 | 6731 |
| 6811 RunParserSyncTest(strict_function_context_data, parameter_data, kError, NULL, | 6732 RunParserSyncTest(strict_function_context_data, parameter_data, kError); |
| 6812 0, always_flags, arraysize(always_flags)); | 6733 RunParserSyncTest(strict_arrow_context_data, parameter_data, kError); |
| 6813 RunParserSyncTest(strict_arrow_context_data, parameter_data, kError, NULL, 0, | |
| 6814 always_flags, arraysize(always_flags)); | |
| 6815 | 6734 |
| 6816 RunParserSyncTest(generator_context_data, parameter_data, kError, NULL, 0, | 6735 RunParserSyncTest(generator_context_data, parameter_data, kError); |
| 6817 always_flags, arraysize(always_flags)); | |
| 6818 } | 6736 } |
| 6819 | 6737 |
| 6820 | 6738 |
| 6821 TEST(SpreadArray) { | 6739 TEST(SpreadArray) { |
| 6822 const char* context_data[][2] = { | 6740 const char* context_data[][2] = { |
| 6823 {"'use strict';", ""}, {"", ""}, {NULL, NULL}}; | 6741 {"'use strict';", ""}, {"", ""}, {NULL, NULL}}; |
| 6824 | 6742 |
| 6825 // clang-format off | 6743 // clang-format off |
| 6826 const char* data[] = { | 6744 const char* data[] = { |
| 6827 "[...a]", | 6745 "[...a]", |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7019 "a, b, {c, d, e}", | 6937 "a, b, {c, d, e}", |
| 7020 "initializer = true", | 6938 "initializer = true", |
| 7021 "a, b, c = 1", | 6939 "a, b, c = 1", |
| 7022 "...args", | 6940 "...args", |
| 7023 "a, b, ...rest", | 6941 "a, b, ...rest", |
| 7024 "[a, b, ...rest]", | 6942 "[a, b, ...rest]", |
| 7025 "{ bindingPattern = {} }", | 6943 "{ bindingPattern = {} }", |
| 7026 "{ initializedBindingPattern } = { initializedBindingPattern: true }", | 6944 "{ initializedBindingPattern } = { initializedBindingPattern: true }", |
| 7027 NULL}; | 6945 NULL}; |
| 7028 | 6946 |
| 7029 static const ParserFlag always_flags[] = { | 6947 static const ParserFlag always_flags[] = {kAllowHarmonySloppy}; |
| 7030 kAllowHarmonyDefaultParameters, kAllowHarmonyDestructuring, | |
| 7031 kAllowHarmonySloppy}; | |
| 7032 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 6948 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, |
| 7033 arraysize(always_flags)); | 6949 arraysize(always_flags)); |
| 7034 } | 6950 } |
| 7035 | 6951 |
| 7036 | 6952 |
| 7037 TEST(LetSloppyOnly) { | 6953 TEST(LetSloppyOnly) { |
| 7038 // clang-format off | 6954 // clang-format off |
| 7039 const char* context_data[][2] = { | 6955 const char* context_data[][2] = { |
| 7040 {"", ""}, | 6956 {"", ""}, |
| 7041 {"{", "}"}, | 6957 {"{", "}"}, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 7057 "for (const let = 1; let < 1; let++) {}", | 6973 "for (const let = 1; let < 1; let++) {}", |
| 7058 "for (const let in {}) {}", | 6974 "for (const let in {}) {}", |
| 7059 "for (const [let] = 1; let < 1; let++) {}", | 6975 "for (const [let] = 1; let < 1; let++) {}", |
| 7060 "for (const [let] in {}) {}", | 6976 "for (const [let] in {}) {}", |
| 7061 "const let", | 6977 "const let", |
| 7062 "const [let] = []", | 6978 "const [let] = []", |
| 7063 NULL | 6979 NULL |
| 7064 }; | 6980 }; |
| 7065 // clang-format on | 6981 // clang-format on |
| 7066 | 6982 |
| 7067 static const ParserFlag always_flags[] = { | 6983 static const ParserFlag always_flags[] = {kAllowHarmonySloppy, |
| 7068 kAllowHarmonySloppy, kAllowHarmonySloppyLet, kAllowHarmonyDestructuring}; | 6984 kAllowHarmonySloppyLet}; |
| 7069 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, | 6985 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, |
| 7070 arraysize(always_flags)); | 6986 arraysize(always_flags)); |
| 7071 | 6987 |
| 7072 // Some things should be rejected even in sloppy mode | 6988 // Some things should be rejected even in sloppy mode |
| 7073 // This addresses BUG(v8:4403). | 6989 // This addresses BUG(v8:4403). |
| 7074 | 6990 |
| 7075 // clang-format off | 6991 // clang-format off |
| 7076 const char* fail_data[] = { | 6992 const char* fail_data[] = { |
| 7077 "let let = 1", | 6993 "let let = 1", |
| 7078 "for (let let = 1; let < 1; let++) {}", | 6994 "for (let let = 1; let < 1; let++) {}", |
| (...skipping 16 matching lines...) Expand all Loading... |
| 7095 "let l\\u0065t = 1", | 7011 "let l\\u0065t = 1", |
| 7096 "const l\\u0065t = 1", | 7012 "const l\\u0065t = 1", |
| 7097 "let [l\\u0065t] = 1", | 7013 "let [l\\u0065t] = 1", |
| 7098 "const [l\\u0065t] = 1", | 7014 "const [l\\u0065t] = 1", |
| 7099 "for (let l\\u0065t in {}) {}", | 7015 "for (let l\\u0065t in {}) {}", |
| 7100 NULL | 7016 NULL |
| 7101 }; | 7017 }; |
| 7102 // clang-format on | 7018 // clang-format on |
| 7103 | 7019 |
| 7104 static const ParserFlag fail_flags[] = { | 7020 static const ParserFlag fail_flags[] = { |
| 7105 kAllowHarmonySloppy, kAllowHarmonySloppyLet, kNoLegacyConst, | 7021 kAllowHarmonySloppy, kAllowHarmonySloppyLet, kNoLegacyConst}; |
| 7106 kAllowHarmonyDestructuring}; | |
| 7107 RunParserSyncTest(context_data, fail_data, kError, NULL, 0, fail_flags, | 7022 RunParserSyncTest(context_data, fail_data, kError, NULL, 0, fail_flags, |
| 7108 arraysize(fail_flags)); | 7023 arraysize(fail_flags)); |
| 7109 } | 7024 } |
| 7110 | 7025 |
| 7111 | 7026 |
| 7112 TEST(EscapedKeywords) { | 7027 TEST(EscapedKeywords) { |
| 7113 // clang-format off | 7028 // clang-format off |
| 7114 const char* sloppy_context_data[][2] = { | 7029 const char* sloppy_context_data[][2] = { |
| 7115 {"", ""}, | 7030 {"", ""}, |
| 7116 {NULL, NULL} | 7031 {NULL, NULL} |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7198 "class C { st\\u0061tic set bar() {} }", | 7113 "class C { st\\u0061tic set bar() {} }", |
| 7199 | 7114 |
| 7200 // TODO(adamk): These should not be errors in sloppy mode. | 7115 // TODO(adamk): These should not be errors in sloppy mode. |
| 7201 "(y\\u0069eld);", | 7116 "(y\\u0069eld);", |
| 7202 "var y\\u0069eld = 1;", | 7117 "var y\\u0069eld = 1;", |
| 7203 "var { y\\u0069eld } = {};", | 7118 "var { y\\u0069eld } = {};", |
| 7204 NULL | 7119 NULL |
| 7205 }; | 7120 }; |
| 7206 // clang-format on | 7121 // clang-format on |
| 7207 | 7122 |
| 7208 static const ParserFlag always_flags[] = {kAllowHarmonySloppy, | 7123 static const ParserFlag always_flags[] = {kAllowHarmonySloppy}; |
| 7209 kAllowHarmonyDestructuring}; | |
| 7210 RunParserSyncTest(sloppy_context_data, fail_data, kError, NULL, 0, | 7124 RunParserSyncTest(sloppy_context_data, fail_data, kError, NULL, 0, |
| 7211 always_flags, arraysize(always_flags)); | 7125 always_flags, arraysize(always_flags)); |
| 7212 RunParserSyncTest(strict_context_data, fail_data, kError, NULL, 0, | 7126 RunParserSyncTest(strict_context_data, fail_data, kError, NULL, 0, |
| 7213 always_flags, arraysize(always_flags)); | 7127 always_flags, arraysize(always_flags)); |
| 7214 RunModuleParserSyncTest(sloppy_context_data, fail_data, kError, NULL, 0, | 7128 RunModuleParserSyncTest(sloppy_context_data, fail_data, kError, NULL, 0, |
| 7215 always_flags, arraysize(always_flags)); | 7129 always_flags, arraysize(always_flags)); |
| 7216 | 7130 |
| 7217 // clang-format off | 7131 // clang-format off |
| 7218 const char* let_data[] = { | 7132 const char* let_data[] = { |
| 7219 "var l\\u0065t = 1;", | 7133 "var l\\u0065t = 1;", |
| 7220 "l\\u0065t = 1;", | 7134 "l\\u0065t = 1;", |
| 7221 "(l\\u0065t === 1);", | 7135 "(l\\u0065t === 1);", |
| 7222 NULL | 7136 NULL |
| 7223 }; | 7137 }; |
| 7224 // clang-format on | 7138 // clang-format on |
| 7225 | 7139 |
| 7226 RunParserSyncTest(sloppy_context_data, let_data, kSuccess, NULL, 0, | 7140 RunParserSyncTest(sloppy_context_data, let_data, kSuccess, NULL, 0, |
| 7227 always_flags, arraysize(always_flags)); | 7141 always_flags, arraysize(always_flags)); |
| 7228 RunParserSyncTest(strict_context_data, let_data, kError, NULL, 0, | 7142 RunParserSyncTest(strict_context_data, let_data, kError, NULL, 0, |
| 7229 always_flags, arraysize(always_flags)); | 7143 always_flags, arraysize(always_flags)); |
| 7230 | 7144 |
| 7231 static const ParserFlag sloppy_let_flags[] = { | 7145 static const ParserFlag sloppy_let_flags[] = {kAllowHarmonySloppy, |
| 7232 kAllowHarmonySloppy, kAllowHarmonySloppyLet, kAllowHarmonyDestructuring}; | 7146 kAllowHarmonySloppyLet}; |
| 7233 RunParserSyncTest(sloppy_context_data, let_data, kSuccess, NULL, 0, | 7147 RunParserSyncTest(sloppy_context_data, let_data, kSuccess, NULL, 0, |
| 7234 sloppy_let_flags, arraysize(sloppy_let_flags)); | 7148 sloppy_let_flags, arraysize(sloppy_let_flags)); |
| 7235 | 7149 |
| 7236 // Non-errors in sloppy mode | 7150 // Non-errors in sloppy mode |
| 7237 const char* valid_data[] = {"(\\u0069mplements = 1);", | 7151 const char* valid_data[] = {"(\\u0069mplements = 1);", |
| 7238 "var impl\\u0065ments = 1;", | 7152 "var impl\\u0065ments = 1;", |
| 7239 "var { impl\\u0065ments } = {};", | 7153 "var { impl\\u0065ments } = {};", |
| 7240 "(\\u0069nterface = 1);", | 7154 "(\\u0069nterface = 1);", |
| 7241 "var int\\u0065rface = 1;", | 7155 "var int\\u0065rface = 1;", |
| 7242 "var { int\\u0065rface } = {};", | 7156 "var { int\\u0065rface } = {};", |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7380 RunParserSyncTest(sloppy_context, error_data, kError); | 7294 RunParserSyncTest(sloppy_context, error_data, kError); |
| 7381 RunParserSyncTest(sloppy_context, error_data, kError, NULL, 0, | 7295 RunParserSyncTest(sloppy_context, error_data, kError, NULL, 0, |
| 7382 restrictive_flags, arraysize(restrictive_flags)); | 7296 restrictive_flags, arraysize(restrictive_flags)); |
| 7383 RunParserSyncTest(sloppy_context, unrestricted_data, kSuccess); | 7297 RunParserSyncTest(sloppy_context, unrestricted_data, kSuccess); |
| 7384 RunParserSyncTest(sloppy_context, unrestricted_data, kError, NULL, 0, | 7298 RunParserSyncTest(sloppy_context, unrestricted_data, kError, NULL, 0, |
| 7385 restrictive_flags, arraysize(restrictive_flags)); | 7299 restrictive_flags, arraysize(restrictive_flags)); |
| 7386 RunParserSyncTest(sloppy_context, sloppy_data, kSuccess); | 7300 RunParserSyncTest(sloppy_context, sloppy_data, kSuccess); |
| 7387 RunParserSyncTest(sloppy_context, sloppy_data, kSuccess, restrictive_flags, | 7301 RunParserSyncTest(sloppy_context, sloppy_data, kSuccess, restrictive_flags, |
| 7388 arraysize(restrictive_flags)); | 7302 arraysize(restrictive_flags)); |
| 7389 } | 7303 } |
| OLD | NEW |