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 6694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6705 CHECK(try_catch2.HasCaught()); | 6705 CHECK(try_catch2.HasCaught()); |
6706 v8::String::Utf8Value exception(try_catch2.Exception()); | 6706 v8::String::Utf8Value exception(try_catch2.Exception()); |
6707 CHECK_EQ(0, | 6707 CHECK_EQ(0, |
6708 strcmp( | 6708 strcmp( |
6709 "ReferenceError: In strong mode, using an undeclared global " | 6709 "ReferenceError: In strong mode, using an undeclared global " |
6710 "variable 'not_there3' is not allowed", | 6710 "variable 'not_there3' is not allowed", |
6711 *exception)); | 6711 *exception)); |
6712 } | 6712 } |
6713 } | 6713 } |
6714 | 6714 |
| 6715 static const ParserFlag kAllDestructuringFlags[] = { |
| 6716 kAllowHarmonyDestructuring, kAllowHarmonyDestructuringAssignment, |
| 6717 kAllowHarmonyDefaultParameters}; |
6715 | 6718 |
6716 TEST(DestructuringPositiveTests) { | 6719 TEST(DestructuringPositiveTests) { |
6717 i::FLAG_harmony_destructuring_bind = true; | 6720 i::FLAG_harmony_destructuring_bind = true; |
6718 | 6721 |
6719 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, | 6722 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, |
6720 {"var ", " = {};"}, | 6723 {"var ", " = {};"}, |
6721 {"'use strict'; const ", " = {};"}, | 6724 {"'use strict'; const ", " = {};"}, |
6722 {"function f(", ") {}"}, | 6725 {"function f(", ") {}"}, |
6723 {"function f(argument1, ", ") {}"}, | 6726 {"function f(argument1, ", ") {}"}, |
6724 {"var f = (", ") => {};"}, | 6727 {"var f = (", ") => {};"}, |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6762 "{[foo()] : z}", | 6765 "{[foo()] : z}", |
6763 "{}", | 6766 "{}", |
6764 "[...rest]", | 6767 "[...rest]", |
6765 "[a,b,...rest]", | 6768 "[a,b,...rest]", |
6766 "[a,,...rest]", | 6769 "[a,,...rest]", |
6767 NULL}; | 6770 NULL}; |
6768 // clang-format on | 6771 // clang-format on |
6769 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; | 6772 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; |
6770 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, | 6773 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, |
6771 arraysize(always_flags)); | 6774 arraysize(always_flags)); |
| 6775 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, |
| 6776 kAllDestructuringFlags, arraysize(kAllDestructuringFlags)); |
6772 } | 6777 } |
6773 | 6778 |
6774 | 6779 |
6775 TEST(DestructuringNegativeTests) { | 6780 TEST(DestructuringNegativeTests) { |
6776 i::FLAG_harmony_destructuring_bind = true; | 6781 i::FLAG_harmony_destructuring_bind = true; |
6777 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; | 6782 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; |
6778 | 6783 |
6779 { // All modes. | 6784 { // All modes. |
6780 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, | 6785 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, |
6781 {"var ", " = {};"}, | 6786 {"var ", " = {};"}, |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6839 "{[1+1]}", | 6844 "{[1+1]}", |
6840 "[...rest, x]", | 6845 "[...rest, x]", |
6841 "[a,b,...rest, x]", | 6846 "[a,b,...rest, x]", |
6842 "[a,,...rest, x]", | 6847 "[a,,...rest, x]", |
6843 "[...rest,]", | 6848 "[...rest,]", |
6844 "[a,b,...rest,]", | 6849 "[a,b,...rest,]", |
6845 "[a,,...rest,]", | 6850 "[a,,...rest,]", |
6846 "[...rest,...rest1]", | 6851 "[...rest,...rest1]", |
6847 "[a,b,...rest,...rest1]", | 6852 "[a,b,...rest,...rest1]", |
6848 "[a,,..rest,...rest1]", | 6853 "[a,,..rest,...rest1]", |
| 6854 "[x, y, ...z = 1]", |
| 6855 "[...z = 1]", |
| 6856 "[x, y, ...[z] = [1]]", |
| 6857 "[...[z] = [1]]", |
6849 "{ x : 3 }", | 6858 "{ x : 3 }", |
6850 "{ x : 'foo' }", | 6859 "{ x : 'foo' }", |
6851 "{ x : /foo/ }", | 6860 "{ x : /foo/ }", |
6852 "{ x : `foo` }", | 6861 "{ x : `foo` }", |
6853 "{ get a() {} }", | 6862 "{ get a() {} }", |
6854 "{ set a() {} }", | 6863 "{ set a() {} }", |
6855 "{ method() {} }", | 6864 "{ method() {} }", |
6856 "{ *method() {} }", | 6865 "{ *method() {} }", |
6857 NULL}; | 6866 NULL}; |
6858 // clang-format on | 6867 // clang-format on |
6859 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 6868 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, |
6860 arraysize(always_flags)); | 6869 arraysize(always_flags)); |
| 6870 RunParserSyncTest(context_data, data, kError, NULL, 0, |
| 6871 kAllDestructuringFlags, |
| 6872 arraysize(kAllDestructuringFlags)); |
6861 } | 6873 } |
6862 | 6874 |
6863 { // All modes. | 6875 { // All modes. |
6864 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, | 6876 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, |
6865 {"var ", " = {};"}, | 6877 {"var ", " = {};"}, |
6866 {"'use strict'; const ", " = {};"}, | 6878 {"'use strict'; const ", " = {};"}, |
6867 {"function f(", ") {}"}, | 6879 {"function f(", ") {}"}, |
6868 {"function f(argument1, ", ") {}"}, | 6880 {"function f(argument1, ", ") {}"}, |
6869 {"var f = (", ") => {};"}, | 6881 {"var f = (", ") => {};"}, |
6870 {"var f = (argument1,", ") => {};"}, | 6882 {"var f = (argument1,", ") => {};"}, |
6871 {NULL, NULL}}; | 6883 {NULL, NULL}}; |
6872 | 6884 |
6873 // clang-format off | 6885 // clang-format off |
6874 const char* data[] = { | 6886 const char* data[] = { |
6875 "x => x", | 6887 "x => x", |
6876 "() => x", | 6888 "() => x", |
6877 NULL}; | 6889 NULL}; |
6878 // clang-format on | 6890 // clang-format on |
6879 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 6891 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, |
6880 arraysize(always_flags)); | 6892 arraysize(always_flags)); |
| 6893 RunParserSyncTest(context_data, data, kError, NULL, 0, |
| 6894 kAllDestructuringFlags, |
| 6895 arraysize(kAllDestructuringFlags)); |
6881 } | 6896 } |
6882 | 6897 |
6883 { // Strict mode. | 6898 { // Strict mode. |
6884 const char* context_data[][2] = { | 6899 const char* context_data[][2] = { |
6885 {"'use strict'; let ", " = {};"}, | 6900 {"'use strict'; let ", " = {};"}, |
6886 {"'use strict'; const ", " = {};"}, | 6901 {"'use strict'; const ", " = {};"}, |
6887 {"'use strict'; function f(", ") {}"}, | 6902 {"'use strict'; function f(", ") {}"}, |
6888 {"'use strict'; function f(argument1, ", ") {}"}, | 6903 {"'use strict'; function f(argument1, ", ") {}"}, |
6889 {NULL, NULL}}; | 6904 {NULL, NULL}}; |
6890 | 6905 |
6891 // clang-format off | 6906 // clang-format off |
6892 const char* data[] = { | 6907 const char* data[] = { |
6893 "[eval]", | 6908 "[eval]", |
6894 "{ a : arguments }", | 6909 "{ a : arguments }", |
6895 "[public]", | 6910 "[public]", |
6896 "{ x : private }", | 6911 "{ x : private }", |
6897 NULL}; | 6912 NULL}; |
6898 // clang-format on | 6913 // clang-format on |
6899 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 6914 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, |
6900 arraysize(always_flags)); | 6915 arraysize(always_flags)); |
| 6916 RunParserSyncTest(context_data, data, kError, NULL, 0, |
| 6917 kAllDestructuringFlags, |
| 6918 arraysize(kAllDestructuringFlags)); |
6901 } | 6919 } |
6902 | 6920 |
6903 { // 'yield' in generators. | 6921 { // 'yield' in generators. |
6904 const char* context_data[][2] = { | 6922 const char* context_data[][2] = { |
6905 {"function*() { var ", " = {};"}, | 6923 {"function*() { var ", " = {};"}, |
6906 {"function*() { 'use strict'; let ", " = {};"}, | 6924 {"function*() { 'use strict'; let ", " = {};"}, |
6907 {"function*() { 'use strict'; const ", " = {};"}, | 6925 {"function*() { 'use strict'; const ", " = {};"}, |
6908 {NULL, NULL}}; | 6926 {NULL, NULL}}; |
6909 | 6927 |
6910 // clang-format off | 6928 // clang-format off |
6911 const char* data[] = { | 6929 const char* data[] = { |
6912 "yield", | 6930 "yield", |
6913 "[yield]", | 6931 "[yield]", |
6914 "{ x : yield }", | 6932 "{ x : yield }", |
6915 NULL}; | 6933 NULL}; |
6916 // clang-format on | 6934 // clang-format on |
6917 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 6935 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, |
6918 arraysize(always_flags)); | 6936 arraysize(always_flags)); |
| 6937 RunParserSyncTest(context_data, data, kError, NULL, 0, |
| 6938 kAllDestructuringFlags, |
| 6939 arraysize(kAllDestructuringFlags)); |
6919 } | 6940 } |
6920 | 6941 |
6921 { // Declaration-specific errors | 6942 { // Declaration-specific errors |
6922 const char* context_data[][2] = {{"'use strict'; var ", ""}, | 6943 const char* context_data[][2] = {{"'use strict'; var ", ""}, |
6923 {"'use strict'; let ", ""}, | 6944 {"'use strict'; let ", ""}, |
6924 {"'use strict'; const ", ""}, | 6945 {"'use strict'; const ", ""}, |
6925 {"'use strict'; for (var ", ";;) {}"}, | 6946 {"'use strict'; for (var ", ";;) {}"}, |
6926 {"'use strict'; for (let ", ";;) {}"}, | 6947 {"'use strict'; for (let ", ";;) {}"}, |
6927 {"'use strict'; for (const ", ";;) {}"}, | 6948 {"'use strict'; for (const ", ";;) {}"}, |
6928 {"var ", ""}, | 6949 {"var ", ""}, |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7195 "{ x: (foo()) }", | 7216 "{ x: (foo()) }", |
7196 "{ x: (function() {}) }", | 7217 "{ x: (function() {}) }", |
7197 "{ x: y } = 'str'", | 7218 "{ x: y } = 'str'", |
7198 "[x, y] = 'str'", | 7219 "[x, y] = 'str'", |
7199 "[(x,y) => z]", | 7220 "[(x,y) => z]", |
7200 "{x: (y) => z}", | 7221 "{x: (y) => z}", |
7201 "[x, ...y, z]", | 7222 "[x, ...y, z]", |
7202 "[...x,]", | 7223 "[...x,]", |
7203 "[x, y, ...z = 1]", | 7224 "[x, y, ...z = 1]", |
7204 "[...z = 1]", | 7225 "[...z = 1]", |
| 7226 "[x, y, ...[z] = [1]]", |
| 7227 "[...[z] = [1]]", |
7205 | 7228 |
7206 // v8:4657 | 7229 // v8:4657 |
7207 "({ x: x4, x: (x+=1e4) })", | 7230 "({ x: x4, x: (x+=1e4) })", |
7208 "(({ x: x4, x: (x+=1e4) }))", | 7231 "(({ x: x4, x: (x+=1e4) }))", |
7209 "({ x: x4, x: (x+=1e4) } = {})", | 7232 "({ x: x4, x: (x+=1e4) } = {})", |
7210 "(({ x: x4, x: (x+=1e4) } = {}))", | 7233 "(({ x: x4, x: (x+=1e4) } = {}))", |
7211 "(({ x: x4, x: (x+=1e4) }) = {})", | 7234 "(({ x: x4, x: (x+=1e4) }) = {})", |
7212 "({ x: y } = {})", | 7235 "({ x: y } = {})", |
7213 "(({ x: y } = {}))", | 7236 "(({ x: y } = {}))", |
7214 "(({ x: y }) = {})", | 7237 "(({ x: y }) = {})", |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7445 | 7468 |
7446 "x=(yield)", | 7469 "x=(yield)", |
7447 "x, y=(yield)", | 7470 "x, y=(yield)", |
7448 "{x=(yield)}", | 7471 "{x=(yield)}", |
7449 "[x=(yield)]", | 7472 "[x=(yield)]", |
7450 | 7473 |
7451 "x=f(yield)", | 7474 "x=f(yield)", |
7452 "x, y=f(yield)", | 7475 "x, y=f(yield)", |
7453 "{x=f(yield)}", | 7476 "{x=f(yield)}", |
7454 "[x=f(yield)]", | 7477 "[x=f(yield)]", |
7455 NULL | |
7456 }; | |
7457 | 7478 |
7458 // TODO(wingo): These aren't really destructuring assignment patterns; we're | |
7459 // just splitting them for now until the parser gets support for arrow | |
7460 // function arguments that look like destructuring assignments. When that | |
7461 // happens we should unify destructuring_assignment_data and parameter_data. | |
7462 const char* destructuring_assignment_data[] = { | |
7463 "{x}=yield", | 7479 "{x}=yield", |
7464 "[x]=yield", | 7480 "[x]=yield", |
7465 | 7481 |
7466 "{x}=(yield)", | 7482 "{x}=(yield)", |
7467 "[x]=(yield)", | 7483 "[x]=(yield)", |
7468 | 7484 |
7469 "{x}=f(yield)", | 7485 "{x}=f(yield)", |
7470 "[x]=f(yield)", | 7486 "[x]=f(yield)", |
7471 NULL | 7487 NULL |
7472 }; | 7488 }; |
7473 | 7489 |
7474 // clang-format on | 7490 // clang-format on |
7475 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring, | 7491 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring, |
7476 kAllowHarmonyDefaultParameters, | 7492 kAllowHarmonyDefaultParameters, |
7477 kAllowStrongMode}; | 7493 kAllowStrongMode}; |
7478 | 7494 |
7479 RunParserSyncTest(sloppy_function_context_data, parameter_data, kSuccess, | 7495 RunParserSyncTest(sloppy_function_context_data, parameter_data, kSuccess, |
7480 NULL, 0, always_flags, arraysize(always_flags)); | 7496 NULL, 0, always_flags, arraysize(always_flags)); |
7481 RunParserSyncTest(sloppy_function_context_data, destructuring_assignment_data, | |
7482 kSuccess, NULL, 0, always_flags, arraysize(always_flags)); | |
7483 RunParserSyncTest(sloppy_arrow_context_data, parameter_data, kSuccess, NULL, | 7497 RunParserSyncTest(sloppy_arrow_context_data, parameter_data, kSuccess, NULL, |
7484 0, always_flags, arraysize(always_flags)); | 7498 0, always_flags, arraysize(always_flags)); |
7485 RunParserSyncTest(sloppy_arrow_context_data, destructuring_assignment_data, | |
7486 kSuccess, NULL, 0, always_flags, arraysize(always_flags)); | |
7487 | 7499 |
7488 RunParserSyncTest(strict_function_context_data, parameter_data, kError, NULL, | 7500 RunParserSyncTest(strict_function_context_data, parameter_data, kError, NULL, |
7489 0, always_flags, arraysize(always_flags)); | 7501 0, always_flags, arraysize(always_flags)); |
7490 RunParserSyncTest(strict_function_context_data, destructuring_assignment_data, | |
7491 kError, NULL, 0, always_flags, arraysize(always_flags)); | |
7492 RunParserSyncTest(strict_arrow_context_data, parameter_data, kError, NULL, 0, | 7502 RunParserSyncTest(strict_arrow_context_data, parameter_data, kError, NULL, 0, |
7493 always_flags, arraysize(always_flags)); | 7503 always_flags, arraysize(always_flags)); |
7494 RunParserSyncTest(strict_arrow_context_data, destructuring_assignment_data, | |
7495 kError, NULL, 0, always_flags, arraysize(always_flags)); | |
7496 | 7504 |
7497 RunParserSyncTest(generator_context_data, parameter_data, kError, NULL, 0, | 7505 RunParserSyncTest(generator_context_data, parameter_data, kError, NULL, 0, |
7498 always_flags, arraysize(always_flags)); | 7506 always_flags, arraysize(always_flags)); |
7499 RunParserSyncTest(generator_context_data, destructuring_assignment_data, | |
7500 kError, NULL, 0, always_flags, arraysize(always_flags)); | |
7501 } | 7507 } |
7502 | 7508 |
7503 | 7509 |
7504 TEST(SpreadArray) { | 7510 TEST(SpreadArray) { |
7505 const char* context_data[][2] = { | 7511 const char* context_data[][2] = { |
7506 {"'use strict';", ""}, {"", ""}, {NULL, NULL}}; | 7512 {"'use strict';", ""}, {"", ""}, {NULL, NULL}}; |
7507 | 7513 |
7508 // clang-format off | 7514 // clang-format off |
7509 const char* data[] = { | 7515 const char* data[] = { |
7510 "[...a]", | 7516 "[...a]", |
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7994 "for (();;) {}", | 8000 "for (();;) {}", |
7995 | 8001 |
7996 // crbug.com/582626 | 8002 // crbug.com/582626 |
7997 "{ NaN ,chA((evarA=new t ( l = !.0[((... co -a0([1]))=> greturnkf", | 8003 "{ NaN ,chA((evarA=new t ( l = !.0[((... co -a0([1]))=> greturnkf", |
7998 NULL | 8004 NULL |
7999 }; | 8005 }; |
8000 // clang-format on | 8006 // clang-format on |
8001 | 8007 |
8002 RunParserSyncTest(context_data, error_data, kError, NULL, 0, NULL, 0); | 8008 RunParserSyncTest(context_data, error_data, kError, NULL, 0, NULL, 0); |
8003 } | 8009 } |
OLD | NEW |