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 1268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1279 | 1279 |
1280 enum ParserFlag { | 1280 enum ParserFlag { |
1281 kAllowLazy, | 1281 kAllowLazy, |
1282 kAllowNatives, | 1282 kAllowNatives, |
1283 kAllowHarmonyFunctionSent, | 1283 kAllowHarmonyFunctionSent, |
1284 kAllowHarmonyRestrictiveGenerators, | 1284 kAllowHarmonyRestrictiveGenerators, |
1285 kAllowHarmonyTrailingCommas, | 1285 kAllowHarmonyTrailingCommas, |
1286 kAllowHarmonyClassFields, | 1286 kAllowHarmonyClassFields, |
1287 kAllowHarmonyObjectRestSpread, | 1287 kAllowHarmonyObjectRestSpread, |
1288 kAllowHarmonyDynamicImport, | 1288 kAllowHarmonyDynamicImport, |
1289 kAllowHarmonyTemplateEscapes, | |
1289 }; | 1290 }; |
1290 | 1291 |
1291 enum ParserSyncTestResult { | 1292 enum ParserSyncTestResult { |
1292 kSuccessOrError, | 1293 kSuccessOrError, |
1293 kSuccess, | 1294 kSuccess, |
1294 kError | 1295 kError |
1295 }; | 1296 }; |
1296 | 1297 |
1297 void SetGlobalFlags(i::EnumSet<ParserFlag> flags) { | 1298 void SetGlobalFlags(i::EnumSet<ParserFlag> flags) { |
1298 i::FLAG_allow_natives_syntax = flags.Contains(kAllowNatives); | 1299 i::FLAG_allow_natives_syntax = flags.Contains(kAllowNatives); |
1299 i::FLAG_harmony_function_sent = flags.Contains(kAllowHarmonyFunctionSent); | 1300 i::FLAG_harmony_function_sent = flags.Contains(kAllowHarmonyFunctionSent); |
1300 i::FLAG_harmony_restrictive_generators = | 1301 i::FLAG_harmony_restrictive_generators = |
1301 flags.Contains(kAllowHarmonyRestrictiveGenerators); | 1302 flags.Contains(kAllowHarmonyRestrictiveGenerators); |
1302 i::FLAG_harmony_trailing_commas = flags.Contains(kAllowHarmonyTrailingCommas); | 1303 i::FLAG_harmony_trailing_commas = flags.Contains(kAllowHarmonyTrailingCommas); |
1303 i::FLAG_harmony_class_fields = flags.Contains(kAllowHarmonyClassFields); | 1304 i::FLAG_harmony_class_fields = flags.Contains(kAllowHarmonyClassFields); |
1304 i::FLAG_harmony_object_rest_spread = | 1305 i::FLAG_harmony_object_rest_spread = |
1305 flags.Contains(kAllowHarmonyObjectRestSpread); | 1306 flags.Contains(kAllowHarmonyObjectRestSpread); |
1306 i::FLAG_harmony_dynamic_import = flags.Contains(kAllowHarmonyDynamicImport); | 1307 i::FLAG_harmony_dynamic_import = flags.Contains(kAllowHarmonyDynamicImport); |
1308 i::FLAG_harmony_template_escapes = | |
1309 flags.Contains(kAllowHarmonyTemplateEscapes); | |
1307 } | 1310 } |
1308 | 1311 |
1309 void SetParserFlags(i::PreParser* parser, i::EnumSet<ParserFlag> flags) { | 1312 void SetParserFlags(i::PreParser* parser, i::EnumSet<ParserFlag> flags) { |
1310 parser->set_allow_natives(flags.Contains(kAllowNatives)); | 1313 parser->set_allow_natives(flags.Contains(kAllowNatives)); |
1311 parser->set_allow_harmony_function_sent( | 1314 parser->set_allow_harmony_function_sent( |
1312 flags.Contains(kAllowHarmonyFunctionSent)); | 1315 flags.Contains(kAllowHarmonyFunctionSent)); |
1313 parser->set_allow_harmony_restrictive_generators( | 1316 parser->set_allow_harmony_restrictive_generators( |
1314 flags.Contains(kAllowHarmonyRestrictiveGenerators)); | 1317 flags.Contains(kAllowHarmonyRestrictiveGenerators)); |
1315 parser->set_allow_harmony_trailing_commas( | 1318 parser->set_allow_harmony_trailing_commas( |
1316 flags.Contains(kAllowHarmonyTrailingCommas)); | 1319 flags.Contains(kAllowHarmonyTrailingCommas)); |
1317 parser->set_allow_harmony_class_fields( | 1320 parser->set_allow_harmony_class_fields( |
1318 flags.Contains(kAllowHarmonyClassFields)); | 1321 flags.Contains(kAllowHarmonyClassFields)); |
1319 parser->set_allow_harmony_object_rest_spread( | 1322 parser->set_allow_harmony_object_rest_spread( |
1320 flags.Contains(kAllowHarmonyObjectRestSpread)); | 1323 flags.Contains(kAllowHarmonyObjectRestSpread)); |
1321 parser->set_allow_harmony_dynamic_import( | 1324 parser->set_allow_harmony_dynamic_import( |
1322 flags.Contains(kAllowHarmonyDynamicImport)); | 1325 flags.Contains(kAllowHarmonyDynamicImport)); |
1326 parser->set_allow_harmony_template_escapes( | |
1327 flags.Contains(kAllowHarmonyTemplateEscapes)); | |
1323 } | 1328 } |
1324 | 1329 |
1325 void TestParserSyncWithFlags(i::Handle<i::String> source, | 1330 void TestParserSyncWithFlags(i::Handle<i::String> source, |
1326 i::EnumSet<ParserFlag> flags, | 1331 i::EnumSet<ParserFlag> flags, |
1327 ParserSyncTestResult result, | 1332 ParserSyncTestResult result, |
1328 bool is_module = false, bool test_preparser = true, | 1333 bool is_module = false, bool test_preparser = true, |
1329 bool ignore_error_msg = false) { | 1334 bool ignore_error_msg = false) { |
1330 i::Isolate* isolate = CcTest::i_isolate(); | 1335 i::Isolate* isolate = CcTest::i_isolate(); |
1331 i::Factory* factory = isolate->factory(); | 1336 i::Factory* factory = isolate->factory(); |
1332 | 1337 |
(...skipping 5407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6740 "{ ...y, b: 1}", | 6745 "{ ...y, b: 1}", |
6741 "{ ...1}", | 6746 "{ ...1}", |
6742 "{ ...null}", | 6747 "{ ...null}", |
6743 "{ ...undefined}", | 6748 "{ ...undefined}", |
6744 "{ ...1 in {}}", | 6749 "{ ...1 in {}}", |
6745 "{ ...[]}", | 6750 "{ ...[]}", |
6746 "{ ...async function() { }}", | 6751 "{ ...async function() { }}", |
6747 "{ ...async () => { }}", | 6752 "{ ...async () => { }}", |
6748 "{ ...new Foo()}", | 6753 "{ ...new Foo()}", |
6749 NULL}; | 6754 NULL}; |
6755 // clang-format on | |
6750 | 6756 |
6751 static const ParserFlag flags[] = {kAllowHarmonyObjectRestSpread}; | 6757 static const ParserFlag flags[] = {kAllowHarmonyObjectRestSpread}; |
6752 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, flags, | 6758 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, flags, |
6753 arraysize(flags)); | 6759 arraysize(flags)); |
6754 } | 6760 } |
6755 | 6761 |
6756 TEST(ObjectSpreadNegativeTests) { | 6762 TEST(ObjectSpreadNegativeTests) { |
6757 const char* context_data[][2] = {{"x = ", ""}, | 6763 const char* context_data[][2] = {{"x = ", ""}, |
6758 {"'use strict'; x = ", ""}, | 6764 {"'use strict'; x = ", ""}, |
6759 {NULL, NULL}}; | 6765 {NULL, NULL}}; |
6760 | 6766 |
6761 // clang-format off | 6767 // clang-format off |
6762 const char* data[] = { | 6768 const char* data[] = { |
6763 "{ ...var z = y}", | 6769 "{ ...var z = y}", |
6764 "{ ...var}", | 6770 "{ ...var}", |
6765 "{ ...foo bar}", | 6771 "{ ...foo bar}", |
6766 NULL}; | 6772 NULL}; |
6767 | 6773 |
6768 static const ParserFlag flags[] = {kAllowHarmonyObjectRestSpread}; | 6774 static const ParserFlag flags[] = {kAllowHarmonyObjectRestSpread}; |
6769 RunParserSyncTest(context_data, data, kError, NULL, 0, flags, | 6775 RunParserSyncTest(context_data, data, kError, NULL, 0, flags, |
6770 arraysize(flags)); | 6776 arraysize(flags)); |
6771 } | 6777 } |
6772 | 6778 |
6779 TEST(TemplateEscapesPositiveTests) { | |
6780 // clang-format off | |
6781 const char* context_data[][2] = { | |
6782 {"", ""}, | |
6783 {"'use strict';", ""}, | |
6784 {NULL, NULL}}; | |
6785 | |
6786 // clang-format off | |
6787 const char* data[] = { | |
6788 "tag`\\01`", | |
6789 "tag`\\01${0}right`", | |
6790 "tag`left${0}\\01`", | |
6791 "tag`left${0}\\01${1}right`", | |
6792 "tag`\\1`", | |
6793 "tag`\\1${0}right`", | |
6794 "tag`left${0}\\1`", | |
6795 "tag`left${0}\\1${1}right`", | |
6796 "tag`\\xg`", | |
6797 "tag`\\xg${0}right`", | |
6798 "tag`left${0}\\xg`", | |
6799 "tag`left${0}\\xg${1}right`", | |
6800 "tag`\\xAg`", | |
6801 "tag`\\xAg${0}right`", | |
6802 "tag`left${0}\\xAg`", | |
6803 "tag`left${0}\\xAg${1}right`", | |
6804 "tag`\\u0`", | |
6805 "tag`\\u0${0}right`", | |
6806 "tag`left${0}\\u0`", | |
6807 "tag`left${0}\\u0${1}right`", | |
6808 "tag`\\u0g`", | |
6809 "tag`\\u0g${0}right`", | |
6810 "tag`left${0}\\u0g`", | |
6811 "tag`left${0}\\u0g${1}right`", | |
6812 "tag`\\u00g`", | |
6813 "tag`\\u00g${0}right`", | |
6814 "tag`left${0}\\u00g`", | |
6815 "tag`left${0}\\u00g${1}right`", | |
6816 "tag`\\u000g`", | |
6817 "tag`\\u000g${0}right`", | |
6818 "tag`left${0}\\u000g`", | |
6819 "tag`left${0}\\u000g${1}right`", | |
6820 "tag`\\u{}`", | |
6821 "tag`\\u{}${0}right`", | |
6822 "tag`left${0}\\u{}`", | |
6823 "tag`left${0}\\u{}${1}right`", | |
6824 "tag`\\u{-0}`", | |
6825 "tag`\\u{-0}${0}right`", | |
6826 "tag`left${0}\\u{-0}`", | |
6827 "tag`left${0}\\u{-0}${1}right`", | |
6828 "tag`\\u{g}`", | |
6829 "tag`\\u{g}${0}right`", | |
6830 "tag`left${0}\\u{g}`", | |
6831 "tag`left${0}\\u{g}${1}right`", | |
6832 "tag`\\u{0`", | |
6833 "tag`\\u{0${0}right`", | |
6834 "tag`left${0}\\u{0`", | |
6835 "tag`left${0}\\u{0${1}right`", | |
6836 "tag`\\u{\\u{0}`", | |
6837 "tag`\\u{\\u{0}${0}right`", | |
6838 "tag`left${0}\\u{\\u{0}`", | |
6839 "tag`left${0}\\u{\\u{0}${1}right`", | |
6840 "tag`\\u{110000}`", | |
6841 "tag`\\u{110000}${0}right`", | |
6842 "tag`left${0}\\u{110000}`", | |
6843 "tag`left${0}\\u{110000}${1}right`", | |
6844 NULL}; | |
6845 // clang-format on | |
6846 | |
6847 static const ParserFlag flags[] = {kAllowHarmonyTemplateEscapes}; | |
6848 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, flags, | |
vogelheim
2017/02/13 17:36:06
If I read this correctly, this tests the behaviour
bakkot1
2017/02/13 20:22:24
I was figuring the existing tests would suffice fo
vogelheim
2017/02/17 16:33:53
Well, I was thinking more about also running the n
bakkot1
2017/02/17 20:42:18
Done.
| |
6849 arraysize(flags)); | |
6850 } | |
6851 | |
6852 TEST(TemplateEscapesNegativeTests) { | |
6853 // clang-format off | |
6854 const char* context_data[][2] = { | |
6855 {"", ""}, | |
6856 {"'use strict';", ""}, | |
6857 {NULL, NULL}}; | |
6858 | |
6859 // clang-format off | |
6860 const char* data[] = { | |
6861 "`\\01`", | |
6862 "`\\01${0}right`", | |
6863 "`left${0}\\01`", | |
6864 "`left${0}\\01${1}right`", | |
6865 "`\\1`", | |
6866 "`\\1${0}right`", | |
6867 "`left${0}\\1`", | |
6868 "`left${0}\\1${1}right`", | |
6869 "`\\xg`", | |
6870 "`\\xg${0}right`", | |
6871 "`left${0}\\xg`", | |
6872 "`left${0}\\xg${1}right`", | |
6873 "`\\xAg`", | |
6874 "`\\xAg${0}right`", | |
6875 "`left${0}\\xAg`", | |
6876 "`left${0}\\xAg${1}right`", | |
6877 "`\\u0`", | |
6878 "`\\u0${0}right`", | |
6879 "`left${0}\\u0`", | |
6880 "`left${0}\\u0${1}right`", | |
6881 "`\\u0g`", | |
6882 "`\\u0g${0}right`", | |
6883 "`left${0}\\u0g`", | |
6884 "`left${0}\\u0g${1}right`", | |
6885 "`\\u00g`", | |
6886 "`\\u00g${0}right`", | |
6887 "`left${0}\\u00g`", | |
6888 "`left${0}\\u00g${1}right`", | |
6889 "`\\u000g`", | |
6890 "`\\u000g${0}right`", | |
6891 "`left${0}\\u000g`", | |
6892 "`left${0}\\u000g${1}right`", | |
6893 "`\\u{}`", | |
6894 "`\\u{}${0}right`", | |
6895 "`left${0}\\u{}`", | |
6896 "`left${0}\\u{}${1}right`", | |
6897 "`\\u{-0}`", | |
6898 "`\\u{-0}${0}right`", | |
6899 "`left${0}\\u{-0}`", | |
6900 "`left${0}\\u{-0}${1}right`", | |
6901 "`\\u{g}`", | |
6902 "`\\u{g}${0}right`", | |
6903 "`left${0}\\u{g}`", | |
6904 "`left${0}\\u{g}${1}right`", | |
6905 "`\\u{0`", | |
6906 "`\\u{0${0}right`", | |
6907 "`left${0}\\u{0`", | |
6908 "`left${0}\\u{0${1}right`", | |
6909 "`\\u{\\u{0}`", | |
6910 "`\\u{\\u{0}${0}right`", | |
6911 "`left${0}\\u{\\u{0}`", | |
6912 "`left${0}\\u{\\u{0}${1}right`", | |
6913 "`\\u{110000}`", | |
6914 "`\\u{110000}${0}right`", | |
6915 "`left${0}\\u{110000}`", | |
6916 "`left${0}\\u{110000}${1}right`", | |
6917 NULL}; | |
6918 // clang-format on | |
6919 | |
6920 static const ParserFlag flags[] = {kAllowHarmonyTemplateEscapes}; | |
6921 RunParserSyncTest(context_data, data, kError, NULL, 0, flags, | |
6922 arraysize(flags)); | |
6923 } | |
6924 | |
6773 TEST(DestructuringPositiveTests) { | 6925 TEST(DestructuringPositiveTests) { |
6774 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, | 6926 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, |
6775 {"var ", " = {};"}, | 6927 {"var ", " = {};"}, |
6776 {"'use strict'; const ", " = {};"}, | 6928 {"'use strict'; const ", " = {};"}, |
6777 {"function f(", ") {}"}, | 6929 {"function f(", ") {}"}, |
6778 {"function f(argument1, ", ") {}"}, | 6930 {"function f(argument1, ", ") {}"}, |
6779 {"var f = (", ") => {};"}, | 6931 {"var f = (", ") => {};"}, |
6780 {"var f = (argument1,", ") => {};"}, | 6932 {"var f = (argument1,", ") => {};"}, |
6781 {"try {} catch(", ") {}"}, | 6933 {"try {} catch(", ") {}"}, |
6782 {NULL, NULL}}; | 6934 {NULL, NULL}}; |
(...skipping 2745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9528 eager_info.literal()->scope()->inner_scope()->inner_scope(); | 9680 eager_info.literal()->scope()->inner_scope()->inner_scope(); |
9529 DCHECK_NOT_NULL(scope); | 9681 DCHECK_NOT_NULL(scope); |
9530 DCHECK_NULL(scope->sibling()); | 9682 DCHECK_NULL(scope->sibling()); |
9531 DCHECK(scope->is_function_scope()); | 9683 DCHECK(scope->is_function_scope()); |
9532 | 9684 |
9533 size_t index = 0; | 9685 size_t index = 0; |
9534 i::ScopeTestHelper::CompareScopeToData( | 9686 i::ScopeTestHelper::CompareScopeToData( |
9535 scope, lazy_info.preparsed_scope_data(), index); | 9687 scope, lazy_info.preparsed_scope_data(), index); |
9536 } | 9688 } |
9537 } | 9689 } |
OLD | NEW |