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 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 "var w = /RegExp Literal\\u0020With Escape/gin;" | 220 "var w = /RegExp Literal\\u0020With Escape/gin;" |
221 "var y = { get getter() { return 42; }, " | 221 "var y = { get getter() { return 42; }, " |
222 " set setter(v) { this.value = v; }};" | 222 " set setter(v) { this.value = v; }};" |
223 "var f = a => function (b) { return a + b; };" | 223 "var f = a => function (b) { return a + b; };" |
224 "var g = a => b => a + b;"; | 224 "var g = a => b => a + b;"; |
225 int source_length = i::StrLength(source); | 225 int source_length = i::StrLength(source); |
226 | 226 |
227 // ScriptResource will be deleted when the corresponding String is GCd. | 227 // ScriptResource will be deleted when the corresponding String is GCd. |
228 v8::ScriptCompiler::Source script_source(v8::String::NewExternal( | 228 v8::ScriptCompiler::Source script_source(v8::String::NewExternal( |
229 isolate, new ScriptResource(source, source_length))); | 229 isolate, new ScriptResource(source, source_length))); |
230 i::FLAG_harmony_arrow_functions = true; | |
231 i::FLAG_min_preparse_length = 0; | 230 i::FLAG_min_preparse_length = 0; |
232 v8::ScriptCompiler::Compile(isolate, &script_source, | 231 v8::ScriptCompiler::Compile(isolate, &script_source, |
233 v8::ScriptCompiler::kProduceParserCache); | 232 v8::ScriptCompiler::kProduceParserCache); |
234 CHECK(script_source.GetCachedData()); | 233 CHECK(script_source.GetCachedData()); |
235 | 234 |
236 // Compile the script again, using the cached data. | 235 // Compile the script again, using the cached data. |
237 bool lazy_flag = i::FLAG_lazy; | 236 bool lazy_flag = i::FLAG_lazy; |
238 i::FLAG_lazy = true; | 237 i::FLAG_lazy = true; |
239 v8::ScriptCompiler::Compile(isolate, &script_source, | 238 v8::ScriptCompiler::Compile(isolate, &script_source, |
240 v8::ScriptCompiler::kConsumeParserCache); | 239 v8::ScriptCompiler::kConsumeParserCache); |
241 i::FLAG_lazy = false; | 240 i::FLAG_lazy = false; |
242 v8::ScriptCompiler::CompileUnbound(isolate, &script_source, | 241 v8::ScriptCompiler::CompileUnbound(isolate, &script_source, |
243 v8::ScriptCompiler::kConsumeParserCache); | 242 v8::ScriptCompiler::kConsumeParserCache); |
244 i::FLAG_lazy = lazy_flag; | 243 i::FLAG_lazy = lazy_flag; |
245 } | 244 } |
246 | 245 |
247 | 246 |
248 TEST(PreparseFunctionDataIsUsed) { | 247 TEST(PreparseFunctionDataIsUsed) { |
249 // This tests that we actually do use the function data generated by the | 248 // This tests that we actually do use the function data generated by the |
250 // preparser. | 249 // preparser. |
251 | 250 |
252 // Make preparsing work for short scripts. | 251 // Make preparsing work for short scripts. |
253 i::FLAG_min_preparse_length = 0; | 252 i::FLAG_min_preparse_length = 0; |
254 i::FLAG_harmony_arrow_functions = true; | |
255 | 253 |
256 v8::Isolate* isolate = CcTest::isolate(); | 254 v8::Isolate* isolate = CcTest::isolate(); |
257 v8::HandleScope handles(isolate); | 255 v8::HandleScope handles(isolate); |
258 v8::Local<v8::Context> context = v8::Context::New(isolate); | 256 v8::Local<v8::Context> context = v8::Context::New(isolate); |
259 v8::Context::Scope context_scope(context); | 257 v8::Context::Scope context_scope(context); |
260 CcTest::i_isolate()->stack_guard()->SetStackLimit( | 258 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
261 i::GetCurrentStackPosition() - 128 * 1024); | 259 i::GetCurrentStackPosition() - 128 * 1024); |
262 | 260 |
263 const char* good_code[] = { | 261 const char* good_code[] = { |
264 "function this_is_lazy() { var a; } function foo() { return 25; } foo();", | 262 "function this_is_lazy() { var a; } function foo() { return 25; } foo();", |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 321 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
324 scanner.Initialize(&stream); | 322 scanner.Initialize(&stream); |
325 | 323 |
326 i::Zone zone; | 324 i::Zone zone; |
327 i::AstValueFactory ast_value_factory( | 325 i::AstValueFactory ast_value_factory( |
328 &zone, CcTest::i_isolate()->heap()->HashSeed()); | 326 &zone, CcTest::i_isolate()->heap()->HashSeed()); |
329 i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log, | 327 i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log, |
330 stack_limit); | 328 stack_limit); |
331 preparser.set_allow_lazy(true); | 329 preparser.set_allow_lazy(true); |
332 preparser.set_allow_natives(true); | 330 preparser.set_allow_natives(true); |
333 preparser.set_allow_harmony_arrow_functions(true); | |
334 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 331 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
335 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 332 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
336 CHECK(!log.HasError()); | 333 CHECK(!log.HasError()); |
337 } | 334 } |
338 } | 335 } |
339 | 336 |
340 | 337 |
341 TEST(StandAlonePreParserNoNatives) { | 338 TEST(StandAlonePreParserNoNatives) { |
342 v8::V8::Initialize(); | 339 v8::V8::Initialize(); |
343 | 340 |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 i::CompleteParserRecorder log; | 514 i::CompleteParserRecorder log; |
518 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 515 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
519 scanner.Initialize(&stream); | 516 scanner.Initialize(&stream); |
520 | 517 |
521 i::Zone zone; | 518 i::Zone zone; |
522 i::AstValueFactory ast_value_factory(&zone, | 519 i::AstValueFactory ast_value_factory(&zone, |
523 CcTest::i_isolate()->heap()->HashSeed()); | 520 CcTest::i_isolate()->heap()->HashSeed()); |
524 i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log, | 521 i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log, |
525 stack_limit); | 522 stack_limit); |
526 preparser.set_allow_lazy(true); | 523 preparser.set_allow_lazy(true); |
527 preparser.set_allow_harmony_arrow_functions(true); | |
528 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 524 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
529 CHECK_EQ(i::PreParser::kPreParseStackOverflow, result); | 525 CHECK_EQ(i::PreParser::kPreParseStackOverflow, result); |
530 } | 526 } |
531 | 527 |
532 | 528 |
533 class TestExternalResource: public v8::String::ExternalStringResource { | 529 class TestExternalResource: public v8::String::ExternalStringResource { |
534 public: | 530 public: |
535 explicit TestExternalResource(uint16_t* data, int length) | 531 explicit TestExternalResource(uint16_t* data, int length) |
536 : data_(data), length_(static_cast<size_t>(length)) { } | 532 : data_(data), length_(static_cast<size_t>(length)) { } |
537 | 533 |
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1057 i::ScopedVector<char> program(kProgramByteSize + 1); | 1053 i::ScopedVector<char> program(kProgramByteSize + 1); |
1058 i::SNPrintF(program, "%s%s%s", surroundings[j].prefix, | 1054 i::SNPrintF(program, "%s%s%s", surroundings[j].prefix, |
1059 source_data[i].body, surroundings[j].suffix); | 1055 source_data[i].body, surroundings[j].suffix); |
1060 i::Handle<i::String> source = | 1056 i::Handle<i::String> source = |
1061 factory->NewStringFromUtf8(i::CStrVector(program.start())) | 1057 factory->NewStringFromUtf8(i::CStrVector(program.start())) |
1062 .ToHandleChecked(); | 1058 .ToHandleChecked(); |
1063 i::Handle<i::Script> script = factory->NewScript(source); | 1059 i::Handle<i::Script> script = factory->NewScript(source); |
1064 i::Zone zone; | 1060 i::Zone zone; |
1065 i::ParseInfo info(&zone, script); | 1061 i::ParseInfo info(&zone, script); |
1066 i::Parser parser(&info); | 1062 i::Parser parser(&info); |
1067 parser.set_allow_harmony_arrow_functions(true); | |
1068 parser.set_allow_harmony_sloppy(true); | 1063 parser.set_allow_harmony_sloppy(true); |
1069 info.set_global(); | 1064 info.set_global(); |
1070 CHECK(parser.Parse(&info)); | 1065 CHECK(parser.Parse(&info)); |
1071 CHECK(i::Rewriter::Rewrite(&info)); | 1066 CHECK(i::Rewriter::Rewrite(&info)); |
1072 CHECK(i::Scope::Analyze(&info)); | 1067 CHECK(i::Scope::Analyze(&info)); |
1073 CHECK(info.literal() != NULL); | 1068 CHECK(info.literal() != NULL); |
1074 | 1069 |
1075 i::Scope* script_scope = info.literal()->scope(); | 1070 i::Scope* script_scope = info.literal()->scope(); |
1076 CHECK(script_scope->is_script_scope()); | 1071 CHECK(script_scope->is_script_scope()); |
1077 CHECK_EQ(1, script_scope->inner_scopes()->length()); | 1072 CHECK_EQ(1, script_scope->inner_scopes()->length()); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1111 full_source += "; }"; | 1106 full_source += "; }"; |
1112 | 1107 |
1113 i::Handle<i::String> source_code = | 1108 i::Handle<i::String> source_code = |
1114 factory->NewStringFromUtf8(i::CStrVector(full_source.c_str())) | 1109 factory->NewStringFromUtf8(i::CStrVector(full_source.c_str())) |
1115 .ToHandleChecked(); | 1110 .ToHandleChecked(); |
1116 | 1111 |
1117 i::Handle<i::Script> script = factory->NewScript(source_code); | 1112 i::Handle<i::Script> script = factory->NewScript(source_code); |
1118 | 1113 |
1119 i::ParseInfo info(handles.main_zone(), script); | 1114 i::ParseInfo info(handles.main_zone(), script); |
1120 i::Parser parser(&info); | 1115 i::Parser parser(&info); |
1121 parser.set_allow_harmony_arrow_functions(true); | |
1122 parser.set_allow_harmony_sloppy(true); | 1116 parser.set_allow_harmony_sloppy(true); |
1123 info.set_global(); | 1117 info.set_global(); |
1124 info.set_lazy(false); | 1118 info.set_lazy(false); |
1125 info.set_allow_lazy_parsing(false); | 1119 info.set_allow_lazy_parsing(false); |
1126 info.set_toplevel(true); | 1120 info.set_toplevel(true); |
1127 | 1121 |
1128 i::CompilationInfo compilation_info(&info); | 1122 i::CompilationInfo compilation_info(&info); |
1129 CHECK(i::Compiler::ParseAndAnalyze(&info)); | 1123 CHECK(i::Compiler::ParseAndAnalyze(&info)); |
1130 | 1124 |
1131 CHECK(info.scope()->declarations()->length() == 1); | 1125 CHECK(info.scope()->declarations()->length() == 1); |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1368 | 1362 |
1369 // Parse program source. | 1363 // Parse program source. |
1370 i::Handle<i::String> source = factory->NewStringFromUtf8( | 1364 i::Handle<i::String> source = factory->NewStringFromUtf8( |
1371 i::CStrVector(program.start())).ToHandleChecked(); | 1365 i::CStrVector(program.start())).ToHandleChecked(); |
1372 CHECK_EQ(source->length(), kProgramSize); | 1366 CHECK_EQ(source->length(), kProgramSize); |
1373 i::Handle<i::Script> script = factory->NewScript(source); | 1367 i::Handle<i::Script> script = factory->NewScript(source); |
1374 i::Zone zone; | 1368 i::Zone zone; |
1375 i::ParseInfo info(&zone, script); | 1369 i::ParseInfo info(&zone, script); |
1376 i::Parser parser(&info); | 1370 i::Parser parser(&info); |
1377 parser.set_allow_lazy(true); | 1371 parser.set_allow_lazy(true); |
1378 parser.set_allow_harmony_arrow_functions(true); | |
1379 info.set_global(); | 1372 info.set_global(); |
1380 info.set_language_mode(source_data[i].language_mode); | 1373 info.set_language_mode(source_data[i].language_mode); |
1381 parser.Parse(&info); | 1374 parser.Parse(&info); |
1382 CHECK(info.literal() != NULL); | 1375 CHECK(info.literal() != NULL); |
1383 | 1376 |
1384 // Check scope types and positions. | 1377 // Check scope types and positions. |
1385 i::Scope* scope = info.literal()->scope(); | 1378 i::Scope* scope = info.literal()->scope(); |
1386 CHECK(scope->is_script_scope()); | 1379 CHECK(scope->is_script_scope()); |
1387 CHECK_EQ(scope->start_position(), 0); | 1380 CHECK_EQ(scope->start_position(), 0); |
1388 CHECK_EQ(scope->end_position(), kProgramSize); | 1381 CHECK_EQ(scope->end_position(), kProgramSize); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1490 } | 1483 } |
1491 | 1484 |
1492 data.Dispose(); | 1485 data.Dispose(); |
1493 return i::MessageTemplate::FormatMessage(isolate, message, arg_object); | 1486 return i::MessageTemplate::FormatMessage(isolate, message, arg_object); |
1494 } | 1487 } |
1495 | 1488 |
1496 | 1489 |
1497 enum ParserFlag { | 1490 enum ParserFlag { |
1498 kAllowLazy, | 1491 kAllowLazy, |
1499 kAllowNatives, | 1492 kAllowNatives, |
1500 kAllowHarmonyArrowFunctions, | |
1501 kAllowHarmonyDefaultParameters, | 1493 kAllowHarmonyDefaultParameters, |
1502 kAllowHarmonyRestParameters, | 1494 kAllowHarmonyRestParameters, |
1503 kAllowHarmonySloppy, | 1495 kAllowHarmonySloppy, |
1504 kAllowHarmonySloppyLet, | 1496 kAllowHarmonySloppyLet, |
1505 kAllowHarmonySpreadCalls, | 1497 kAllowHarmonySpreadCalls, |
1506 kAllowHarmonyDestructuring, | 1498 kAllowHarmonyDestructuring, |
1507 kAllowHarmonySpreadArrays, | 1499 kAllowHarmonySpreadArrays, |
1508 kAllowHarmonyNewTarget, | 1500 kAllowHarmonyNewTarget, |
1509 kAllowStrongMode, | 1501 kAllowStrongMode, |
1510 kNoLegacyConst | 1502 kNoLegacyConst |
1511 }; | 1503 }; |
1512 | 1504 |
1513 | 1505 |
1514 enum ParserSyncTestResult { | 1506 enum ParserSyncTestResult { |
1515 kSuccessOrError, | 1507 kSuccessOrError, |
1516 kSuccess, | 1508 kSuccess, |
1517 kError | 1509 kError |
1518 }; | 1510 }; |
1519 | 1511 |
1520 template <typename Traits> | 1512 template <typename Traits> |
1521 void SetParserFlags(i::ParserBase<Traits>* parser, | 1513 void SetParserFlags(i::ParserBase<Traits>* parser, |
1522 i::EnumSet<ParserFlag> flags) { | 1514 i::EnumSet<ParserFlag> flags) { |
1523 parser->set_allow_lazy(flags.Contains(kAllowLazy)); | 1515 parser->set_allow_lazy(flags.Contains(kAllowLazy)); |
1524 parser->set_allow_natives(flags.Contains(kAllowNatives)); | 1516 parser->set_allow_natives(flags.Contains(kAllowNatives)); |
1525 parser->set_allow_harmony_arrow_functions( | |
1526 flags.Contains(kAllowHarmonyArrowFunctions)); | |
1527 parser->set_allow_harmony_default_parameters( | 1517 parser->set_allow_harmony_default_parameters( |
1528 flags.Contains(kAllowHarmonyDefaultParameters)); | 1518 flags.Contains(kAllowHarmonyDefaultParameters)); |
1529 parser->set_allow_harmony_rest_parameters( | 1519 parser->set_allow_harmony_rest_parameters( |
1530 flags.Contains(kAllowHarmonyRestParameters)); | 1520 flags.Contains(kAllowHarmonyRestParameters)); |
1531 parser->set_allow_harmony_spread_calls( | 1521 parser->set_allow_harmony_spread_calls( |
1532 flags.Contains(kAllowHarmonySpreadCalls)); | 1522 flags.Contains(kAllowHarmonySpreadCalls)); |
1533 parser->set_allow_harmony_sloppy(flags.Contains(kAllowHarmonySloppy)); | 1523 parser->set_allow_harmony_sloppy(flags.Contains(kAllowHarmonySloppy)); |
1534 parser->set_allow_harmony_sloppy_let(flags.Contains(kAllowHarmonySloppyLet)); | 1524 parser->set_allow_harmony_sloppy_let(flags.Contains(kAllowHarmonySloppyLet)); |
1535 parser->set_allow_harmony_destructuring( | 1525 parser->set_allow_harmony_destructuring( |
1536 flags.Contains(kAllowHarmonyDestructuring)); | 1526 flags.Contains(kAllowHarmonyDestructuring)); |
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1999 "arguments;", | 1989 "arguments;", |
2000 "var foo = eval;", | 1990 "var foo = eval;", |
2001 "var foo = arguments;", | 1991 "var foo = arguments;", |
2002 "var foo = { eval: 1 };", | 1992 "var foo = { eval: 1 };", |
2003 "var foo = { arguments: 1 };", | 1993 "var foo = { arguments: 1 };", |
2004 "var foo = { }; foo.eval = {};", | 1994 "var foo = { }; foo.eval = {};", |
2005 "var foo = { }; foo.arguments = {};", | 1995 "var foo = { }; foo.arguments = {};", |
2006 NULL | 1996 NULL |
2007 }; | 1997 }; |
2008 | 1998 |
2009 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; | 1999 RunParserSyncTest(context_data, statement_data, kSuccess); |
2010 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | |
2011 always_flags, arraysize(always_flags)); | |
2012 } | 2000 } |
2013 | 2001 |
2014 | 2002 |
2015 #define FUTURE_STRICT_RESERVED_WORDS(V) \ | 2003 #define FUTURE_STRICT_RESERVED_WORDS(V) \ |
2016 V(implements) \ | 2004 V(implements) \ |
2017 V(interface) \ | 2005 V(interface) \ |
2018 V(let) \ | 2006 V(let) \ |
2019 V(package) \ | 2007 V(package) \ |
2020 V(private) \ | 2008 V(private) \ |
2021 V(protected) \ | 2009 V(protected) \ |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2080 { "function test_func() {", "}"}, | 2068 { "function test_func() {", "}"}, |
2081 { "() => {", "}" }, | 2069 { "() => {", "}" }, |
2082 { NULL, NULL } | 2070 { NULL, NULL } |
2083 }; | 2071 }; |
2084 | 2072 |
2085 const char* statement_data[] = { | 2073 const char* statement_data[] = { |
2086 FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) | 2074 FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) |
2087 NULL | 2075 NULL |
2088 }; | 2076 }; |
2089 | 2077 |
2090 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; | 2078 RunParserSyncTest(context_data, statement_data, kSuccess); |
2091 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | |
2092 always_flags, arraysize(always_flags)); | |
2093 | |
2094 static const ParserFlag classes_flags[] = {kAllowHarmonyArrowFunctions}; | |
2095 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | |
2096 classes_flags, arraysize(classes_flags)); | |
2097 } | 2079 } |
2098 | 2080 |
2099 | 2081 |
2100 TEST(ErrorsReservedWords) { | 2082 TEST(ErrorsReservedWords) { |
2101 // Tests that both preparsing and parsing produce the right kind of errors for | 2083 // Tests that both preparsing and parsing produce the right kind of errors for |
2102 // using future reserved words as identifiers. These tests don't depend on the | 2084 // using future reserved words as identifiers. These tests don't depend on the |
2103 // strict mode. | 2085 // strict mode. |
2104 const char* context_data[][2] = { | 2086 const char* context_data[][2] = { |
2105 { "", "" }, | 2087 { "", "" }, |
2106 { "\"use strict\";", "" }, | 2088 { "\"use strict\";", "" }, |
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2513 { NULL, NULL } | 2495 { NULL, NULL } |
2514 }; | 2496 }; |
2515 | 2497 |
2516 const char* statement_data[] = { | 2498 const char* statement_data[] = { |
2517 "mylabel: while(true) { break mylabel; }", | 2499 "mylabel: while(true) { break mylabel; }", |
2518 "eval: while(true) { break eval; }", | 2500 "eval: while(true) { break eval; }", |
2519 "arguments: while(true) { break arguments; }", | 2501 "arguments: while(true) { break arguments; }", |
2520 NULL | 2502 NULL |
2521 }; | 2503 }; |
2522 | 2504 |
2523 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; | 2505 RunParserSyncTest(context_data, statement_data, kSuccess); |
2524 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | |
2525 always_flags, arraysize(always_flags)); | |
2526 } | 2506 } |
2527 | 2507 |
2528 | 2508 |
2529 TEST(NoErrorsFutureStrictReservedAsLabelsSloppy) { | 2509 TEST(NoErrorsFutureStrictReservedAsLabelsSloppy) { |
2530 const char* context_data[][2] = { | 2510 const char* context_data[][2] = { |
2531 { "", ""}, | 2511 { "", ""}, |
2532 { "function test_func() {", "}" }, | 2512 { "function test_func() {", "}" }, |
2533 { "() => {", "}" }, | 2513 { "() => {", "}" }, |
2534 { NULL, NULL } | 2514 { NULL, NULL } |
2535 }; | 2515 }; |
2536 | 2516 |
2537 #define LABELLED_WHILE(NAME) #NAME ": while (true) { break " #NAME "; }", | 2517 #define LABELLED_WHILE(NAME) #NAME ": while (true) { break " #NAME "; }", |
2538 const char* statement_data[] { | 2518 const char* statement_data[] { |
2539 FUTURE_STRICT_RESERVED_WORDS(LABELLED_WHILE) | 2519 FUTURE_STRICT_RESERVED_WORDS(LABELLED_WHILE) |
2540 NULL | 2520 NULL |
2541 }; | 2521 }; |
2542 #undef LABELLED_WHILE | 2522 #undef LABELLED_WHILE |
2543 | 2523 |
2544 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; | 2524 RunParserSyncTest(context_data, statement_data, kSuccess); |
2545 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | |
2546 always_flags, arraysize(always_flags)); | |
2547 } | 2525 } |
2548 | 2526 |
2549 | 2527 |
2550 TEST(ErrorsParenthesizedLabels) { | 2528 TEST(ErrorsParenthesizedLabels) { |
2551 // Parenthesized identifiers shouldn't be recognized as labels. | 2529 // Parenthesized identifiers shouldn't be recognized as labels. |
2552 const char* context_data[][2] = { | 2530 const char* context_data[][2] = { |
2553 { "", ""}, | 2531 { "", ""}, |
2554 { "function test_func() {", "}" }, | 2532 { "function test_func() {", "}" }, |
2555 { "() => {", "}" }, | 2533 { "() => {", "}" }, |
2556 { NULL, NULL } | 2534 { NULL, NULL } |
(...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3611 "c++", | 3589 "c++", |
3612 "`c`", | 3590 "`c`", |
3613 "`${c}`", | 3591 "`${c}`", |
3614 "`template-head${c}`", | 3592 "`template-head${c}`", |
3615 "`${c}template-tail`", | 3593 "`${c}template-tail`", |
3616 "`template-head${c}template-tail`", | 3594 "`template-head${c}template-tail`", |
3617 "`${c}template-tail`", | 3595 "`${c}template-tail`", |
3618 nullptr | 3596 nullptr |
3619 }; | 3597 }; |
3620 | 3598 |
3621 static const ParserFlag always_flags[] = { kAllowHarmonyArrowFunctions, | 3599 static const ParserFlag always_flags[] = {kAllowHarmonyRestParameters}; |
3622 kAllowHarmonyRestParameters }; | |
3623 RunParserSyncTest(context_data, assignment_expression_suffix_data, kError, | 3600 RunParserSyncTest(context_data, assignment_expression_suffix_data, kError, |
3624 NULL, 0, always_flags, arraysize(always_flags)); | 3601 NULL, 0, always_flags, arraysize(always_flags)); |
3625 } | 3602 } |
3626 | 3603 |
3627 | 3604 |
3628 TEST(ErrorsArrowFunctions) { | 3605 TEST(ErrorsArrowFunctions) { |
3629 // Tests that parser and preparser generate the same kind of errors | 3606 // Tests that parser and preparser generate the same kind of errors |
3630 // on invalid arrow function syntax. | 3607 // on invalid arrow function syntax. |
3631 const char* context_data[][2] = { | 3608 const char* context_data[][2] = { |
3632 {"", ";"}, | 3609 {"", ";"}, |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3726 "(foo ? bar : baz, a) => {}", | 3703 "(foo ? bar : baz, a) => {}", |
3727 "(a.b, c) => {}", | 3704 "(a.b, c) => {}", |
3728 "(c, a.b) => {}", | 3705 "(c, a.b) => {}", |
3729 "(a['b'], c) => {}", | 3706 "(a['b'], c) => {}", |
3730 "(c, a['b']) => {}", | 3707 "(c, a['b']) => {}", |
3731 NULL | 3708 NULL |
3732 }; | 3709 }; |
3733 | 3710 |
3734 // The test is quite slow, so run it with a reduced set of flags. | 3711 // The test is quite slow, so run it with a reduced set of flags. |
3735 static const ParserFlag flags[] = {kAllowLazy}; | 3712 static const ParserFlag flags[] = {kAllowLazy}; |
3736 static const ParserFlag always_flags[] = { kAllowHarmonyArrowFunctions }; | |
3737 RunParserSyncTest(context_data, statement_data, kError, flags, | 3713 RunParserSyncTest(context_data, statement_data, kError, flags, |
3738 arraysize(flags), always_flags, arraysize(always_flags)); | 3714 arraysize(flags)); |
3739 } | 3715 } |
3740 | 3716 |
3741 | 3717 |
3742 TEST(NoErrorsArrowFunctions) { | 3718 TEST(NoErrorsArrowFunctions) { |
3743 // Tests that parser and preparser accept valid arrow functions syntax. | 3719 // Tests that parser and preparser accept valid arrow functions syntax. |
3744 const char* context_data[][2] = { | 3720 const char* context_data[][2] = { |
3745 {"", ";"}, | 3721 {"", ";"}, |
3746 {"bar ? (", ") : baz;"}, | 3722 {"bar ? (", ") : baz;"}, |
3747 {"bar ? baz : (", ");"}, | 3723 {"bar ? baz : (", ");"}, |
3748 {"bar, ", ";"}, | 3724 {"bar, ", ";"}, |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3798 "(x, y = 9, ...a) => {}", | 3774 "(x, y = 9, ...a) => {}", |
3799 "(x, y = 9, {b}, z = 8, ...a) => {}", | 3775 "(x, y = 9, {b}, z = 8, ...a) => {}", |
3800 // TODO(wingo, rossberg): This is not accepted right now. | 3776 // TODO(wingo, rossberg): This is not accepted right now. |
3801 // "({a} = {}) => {}", | 3777 // "({a} = {}) => {}", |
3802 // "([x] = []) => {}", | 3778 // "([x] = []) => {}", |
3803 "({a = 42}) => {}", | 3779 "({a = 42}) => {}", |
3804 "([x = 0]) => {}", | 3780 "([x = 0]) => {}", |
3805 NULL | 3781 NULL |
3806 }; | 3782 }; |
3807 | 3783 |
3808 static const ParserFlag always_flags[] = { | 3784 static const ParserFlag always_flags[] = {kAllowHarmonyDefaultParameters, |
3809 kAllowHarmonyArrowFunctions, kAllowHarmonyDefaultParameters, | 3785 kAllowHarmonyRestParameters, |
3810 kAllowHarmonyRestParameters, kAllowHarmonyDestructuring}; | 3786 kAllowHarmonyDestructuring}; |
3811 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 3787 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
3812 always_flags, arraysize(always_flags)); | 3788 always_flags, arraysize(always_flags)); |
3813 } | 3789 } |
3814 | 3790 |
3815 | 3791 |
3816 TEST(ArrowFunctionsSloppyParameterNames) { | 3792 TEST(ArrowFunctionsSloppyParameterNames) { |
3817 const char* strong_context_data[][2] = { | 3793 const char* strong_context_data[][2] = { |
3818 {"'use strong'; ", ";"}, | 3794 {"'use strong'; ", ";"}, |
3819 {"'use strong'; bar ? (", ") : baz;"}, | 3795 {"'use strong'; bar ? (", ") : baz;"}, |
3820 {"'use strong'; bar ? baz : (", ");"}, | 3796 {"'use strong'; bar ? baz : (", ");"}, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3855 "(bar, arguments) => {}", | 3831 "(bar, arguments) => {}", |
3856 "(bar, yield) => {}", | 3832 "(bar, yield) => {}", |
3857 "(bar, interface) => {}", | 3833 "(bar, interface) => {}", |
3858 "(interface, eval) => {}", | 3834 "(interface, eval) => {}", |
3859 "(interface, arguments) => {}", | 3835 "(interface, arguments) => {}", |
3860 "(eval, interface) => {}", | 3836 "(eval, interface) => {}", |
3861 "(arguments, interface) => {}", | 3837 "(arguments, interface) => {}", |
3862 NULL | 3838 NULL |
3863 }; | 3839 }; |
3864 | 3840 |
3865 static const ParserFlag always_flags[] = { kAllowHarmonyArrowFunctions, | 3841 static const ParserFlag always_flags[] = {kAllowStrongMode}; |
3866 kAllowStrongMode}; | |
3867 RunParserSyncTest(strong_context_data, statement_data, kError, NULL, 0, | 3842 RunParserSyncTest(strong_context_data, statement_data, kError, NULL, 0, |
3868 always_flags, arraysize(always_flags)); | 3843 always_flags, arraysize(always_flags)); |
3869 RunParserSyncTest(strict_context_data, statement_data, kError, NULL, 0, | 3844 RunParserSyncTest(strict_context_data, statement_data, kError, NULL, 0, |
3870 always_flags, arraysize(always_flags)); | 3845 always_flags, arraysize(always_flags)); |
3871 RunParserSyncTest(sloppy_context_data, statement_data, kSuccess, NULL, 0, | 3846 RunParserSyncTest(sloppy_context_data, statement_data, kSuccess, NULL, 0, |
3872 always_flags, arraysize(always_flags)); | 3847 always_flags, arraysize(always_flags)); |
3873 } | 3848 } |
3874 | 3849 |
3875 | 3850 |
3876 TEST(ArrowFunctionsYieldParameterNameInGenerator) { | 3851 TEST(ArrowFunctionsYieldParameterNameInGenerator) { |
(...skipping 22 matching lines...) Expand all Loading... |
3899 "(yield, a) => {}", | 3874 "(yield, a) => {}", |
3900 "(yield, ...a) => {}", | 3875 "(yield, ...a) => {}", |
3901 "(a, ...yield) => {}", | 3876 "(a, ...yield) => {}", |
3902 "({yield}) => {}", | 3877 "({yield}) => {}", |
3903 "([yield]) => {}", | 3878 "([yield]) => {}", |
3904 NULL | 3879 NULL |
3905 }; | 3880 }; |
3906 | 3881 |
3907 static const ParserFlag always_flags[] = { kAllowHarmonyDestructuring, | 3882 static const ParserFlag always_flags[] = { kAllowHarmonyDestructuring, |
3908 kAllowHarmonyRestParameters, | 3883 kAllowHarmonyRestParameters, |
3909 kAllowHarmonyArrowFunctions, | |
3910 kAllowStrongMode}; | 3884 kAllowStrongMode}; |
3911 RunParserSyncTest(sloppy_function_context_data, arrow_data, kSuccess, NULL, 0, | 3885 RunParserSyncTest(sloppy_function_context_data, arrow_data, kSuccess, NULL, 0, |
3912 always_flags, arraysize(always_flags)); | 3886 always_flags, arraysize(always_flags)); |
3913 RunParserSyncTest(strict_function_context_data, arrow_data, kError, NULL, 0, | 3887 RunParserSyncTest(strict_function_context_data, arrow_data, kError, NULL, 0, |
3914 always_flags, arraysize(always_flags)); | 3888 always_flags, arraysize(always_flags)); |
3915 RunParserSyncTest(generator_context_data, arrow_data, kError, NULL, 0, | 3889 RunParserSyncTest(generator_context_data, arrow_data, kError, NULL, 0, |
3916 always_flags, arraysize(always_flags)); | 3890 always_flags, arraysize(always_flags)); |
3917 } | 3891 } |
3918 | 3892 |
3919 | 3893 |
(...skipping 12 matching lines...) Expand all Loading... |
3932 "super[27]", | 3906 "super[27]", |
3933 "new super.x", | 3907 "new super.x", |
3934 "new super.x()", | 3908 "new super.x()", |
3935 "new super[27]", | 3909 "new super[27]", |
3936 "new super[27]()", | 3910 "new super[27]()", |
3937 "z.super", // Ok, property lookup. | 3911 "z.super", // Ok, property lookup. |
3938 NULL | 3912 NULL |
3939 }; | 3913 }; |
3940 | 3914 |
3941 static const ParserFlag always_flags[] = { | 3915 static const ParserFlag always_flags[] = { |
3942 kAllowHarmonyArrowFunctions, | |
3943 kAllowHarmonySloppy | 3916 kAllowHarmonySloppy |
3944 }; | 3917 }; |
3945 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 3918 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
3946 always_flags, arraysize(always_flags)); | 3919 always_flags, arraysize(always_flags)); |
3947 } | 3920 } |
3948 | 3921 |
3949 | 3922 |
3950 TEST(SuperErrors) { | 3923 TEST(SuperErrors) { |
3951 const char* context_data[][2] = { | 3924 const char* context_data[][2] = { |
3952 {"class C { m() { ", "; } }"}, | 3925 {"class C { m() { ", "; } }"}, |
(...skipping 26 matching lines...) Expand all Loading... |
3979 TEST(SuperCall) { | 3952 TEST(SuperCall) { |
3980 const char* context_data[][2] = {{"", ""}, | 3953 const char* context_data[][2] = {{"", ""}, |
3981 {NULL, NULL}}; | 3954 {NULL, NULL}}; |
3982 | 3955 |
3983 const char* success_data[] = { | 3956 const char* success_data[] = { |
3984 "class C extends B { constructor() { super(); } }", | 3957 "class C extends B { constructor() { super(); } }", |
3985 "class C extends B { constructor() { () => super(); } }", | 3958 "class C extends B { constructor() { () => super(); } }", |
3986 NULL | 3959 NULL |
3987 }; | 3960 }; |
3988 | 3961 |
3989 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions, | 3962 static const ParserFlag always_flags[] = {kAllowHarmonySloppy}; |
3990 kAllowHarmonySloppy}; | |
3991 RunParserSyncTest(context_data, success_data, kSuccess, NULL, 0, | 3963 RunParserSyncTest(context_data, success_data, kSuccess, NULL, 0, |
3992 always_flags, arraysize(always_flags)); | 3964 always_flags, arraysize(always_flags)); |
3993 | 3965 |
3994 const char* error_data[] = { | 3966 const char* error_data[] = { |
3995 "class C { constructor() { super(); } }", | 3967 "class C { constructor() { super(); } }", |
3996 "class C { method() { super(); } }", | 3968 "class C { method() { super(); } }", |
3997 "class C { method() { () => super(); } }", | 3969 "class C { method() { () => super(); } }", |
3998 "class C { *method() { super(); } }", | 3970 "class C { *method() { super(); } }", |
3999 "class C { get x() { super(); } }", | 3971 "class C { get x() { super(); } }", |
4000 "class C { set x(_) { super(); } }", | 3972 "class C { set x(_) { super(); } }", |
(...skipping 29 matching lines...) Expand all Loading... |
4030 }; | 4002 }; |
4031 | 4003 |
4032 const char* expression_data[] = { | 4004 const char* expression_data[] = { |
4033 "new super.x;", | 4005 "new super.x;", |
4034 "new super.x();", | 4006 "new super.x();", |
4035 "() => new super.x;", | 4007 "() => new super.x;", |
4036 "() => new super.x();", | 4008 "() => new super.x();", |
4037 NULL | 4009 NULL |
4038 }; | 4010 }; |
4039 | 4011 |
4040 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions, | 4012 static const ParserFlag always_flags[] = {kAllowHarmonySloppy}; |
4041 kAllowHarmonySloppy}; | |
4042 RunParserSyncTest(context_data, expression_data, kSuccess, NULL, 0, | 4013 RunParserSyncTest(context_data, expression_data, kSuccess, NULL, 0, |
4043 always_flags, arraysize(always_flags)); | 4014 always_flags, arraysize(always_flags)); |
4044 } | 4015 } |
4045 | 4016 |
4046 | 4017 |
4047 TEST(SuperNewErrors) { | 4018 TEST(SuperNewErrors) { |
4048 const char* context_data[][2] = { | 4019 const char* context_data[][2] = { |
4049 {"class C { method() { ", " } }"}, | 4020 {"class C { method() { ", " } }"}, |
4050 {"class C { *method() { ", " } }"}, | 4021 {"class C { *method() { ", " } }"}, |
4051 {"class C { get x() { ", " } }"}, | 4022 {"class C { get x() { ", " } }"}, |
(...skipping 12 matching lines...) Expand all Loading... |
4064 }; | 4035 }; |
4065 | 4036 |
4066 const char* statement_data[] = { | 4037 const char* statement_data[] = { |
4067 "new super;", | 4038 "new super;", |
4068 "new super();", | 4039 "new super();", |
4069 "() => new super;", | 4040 "() => new super;", |
4070 "() => new super();", | 4041 "() => new super();", |
4071 NULL | 4042 NULL |
4072 }; | 4043 }; |
4073 | 4044 |
4074 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions, | 4045 static const ParserFlag always_flags[] = {kAllowHarmonySloppy}; |
4075 kAllowHarmonySloppy}; | |
4076 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, | 4046 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, |
4077 always_flags, arraysize(always_flags)); | 4047 always_flags, arraysize(always_flags)); |
4078 } | 4048 } |
4079 | 4049 |
4080 | 4050 |
4081 TEST(SuperErrorsNonMethods) { | 4051 TEST(SuperErrorsNonMethods) { |
4082 // super is only allowed in methods, accessors and constructors. | 4052 // super is only allowed in methods, accessors and constructors. |
4083 const char* context_data[][2] = { | 4053 const char* context_data[][2] = { |
4084 {"", ";"}, | 4054 {"", ";"}, |
4085 {"k = ", ";"}, | 4055 {"k = ", ";"}, |
(...skipping 1960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6046 "class C { constructor() { this.a = {b: 1}; this.a.b } }", | 6016 "class C { constructor() { this.a = {b: 1}; this.a.b } }", |
6047 "class C { constructor() { this.a = {b: 1}; this.a.b = 0 } }", | 6017 "class C { constructor() { this.a = {b: 1}; this.a.b = 0 } }", |
6048 "class C { constructor() { this.a = function(){}; this.a() } }", | 6018 "class C { constructor() { this.a = function(){}; this.a() } }", |
6049 NULL}; | 6019 NULL}; |
6050 | 6020 |
6051 const char* success_data[] = { | 6021 const char* success_data[] = { |
6052 "class C { constructor() { this.a = 0; } }", | 6022 "class C { constructor() { this.a = 0; } }", |
6053 "class C { constructor() { label: 0; this.a = 0; this.b = 6; } }", | 6023 "class C { constructor() { label: 0; this.a = 0; this.b = 6; } }", |
6054 NULL}; | 6024 NULL}; |
6055 | 6025 |
6056 static const ParserFlag always_flags[] = {kAllowStrongMode, | 6026 static const ParserFlag always_flags[] = {kAllowStrongMode}; |
6057 kAllowHarmonyArrowFunctions}; | |
6058 RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0, | 6027 RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0, |
6059 always_flags, arraysize(always_flags)); | 6028 always_flags, arraysize(always_flags)); |
6060 RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0, | 6029 RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0, |
6061 always_flags, arraysize(always_flags)); | 6030 always_flags, arraysize(always_flags)); |
6062 RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0, | 6031 RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0, |
6063 always_flags, arraysize(always_flags)); | 6032 always_flags, arraysize(always_flags)); |
6064 | 6033 |
6065 RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0, | 6034 RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0, |
6066 always_flags, arraysize(always_flags)); | 6035 always_flags, arraysize(always_flags)); |
6067 RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0, | 6036 RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6100 "class C extends Object { constructor() { super().a; } }", | 6069 "class C extends Object { constructor() { super().a; } }", |
6101 NULL}; | 6070 NULL}; |
6102 | 6071 |
6103 const char* success_data[] = { | 6072 const char* success_data[] = { |
6104 "class C extends Object { constructor() { super(); } }", | 6073 "class C extends Object { constructor() { super(); } }", |
6105 "class C extends Object { constructor() { label: 66; super(); } }", | 6074 "class C extends Object { constructor() { label: 66; super(); } }", |
6106 "class C extends Object { constructor() { super(3); this.x = 0; } }", | 6075 "class C extends Object { constructor() { super(3); this.x = 0; } }", |
6107 "class C extends Object { constructor() { 3; super(3); this.x = 0; } }", | 6076 "class C extends Object { constructor() { 3; super(3); this.x = 0; } }", |
6108 NULL}; | 6077 NULL}; |
6109 | 6078 |
6110 static const ParserFlag always_flags[] = {kAllowStrongMode, | 6079 static const ParserFlag always_flags[] = {kAllowStrongMode}; |
6111 kAllowHarmonyArrowFunctions}; | |
6112 RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0, | 6080 RunParserSyncTest(sloppy_context_data, error_data, kError, NULL, 0, |
6113 always_flags, arraysize(always_flags)); | 6081 always_flags, arraysize(always_flags)); |
6114 RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0, | 6082 RunParserSyncTest(strict_context_data, error_data, kSuccess, NULL, 0, |
6115 always_flags, arraysize(always_flags)); | 6083 always_flags, arraysize(always_flags)); |
6116 RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0, | 6084 RunParserSyncTest(strong_context_data, error_data, kError, NULL, 0, |
6117 always_flags, arraysize(always_flags)); | 6085 always_flags, arraysize(always_flags)); |
6118 | 6086 |
6119 RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0, | 6087 RunParserSyncTest(sloppy_context_data, success_data, kError, NULL, 0, |
6120 always_flags, arraysize(always_flags)); | 6088 always_flags, arraysize(always_flags)); |
6121 RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0, | 6089 RunParserSyncTest(strict_context_data, success_data, kSuccess, NULL, 0, |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6242 "((a, b, undefined) => {return});", | 6210 "((a, b, undefined) => {return});", |
6243 NULL}; | 6211 NULL}; |
6244 | 6212 |
6245 const char* local_strong[] = { | 6213 const char* local_strong[] = { |
6246 "(undefined => {'use strong';});", | 6214 "(undefined => {'use strong';});", |
6247 "((undefined, b, c) => {'use strong';});", | 6215 "((undefined, b, c) => {'use strong';});", |
6248 "((a, undefined, c) => {'use strong';});", | 6216 "((a, undefined, c) => {'use strong';});", |
6249 "((a, b, undefined) => {'use strong';});", | 6217 "((a, b, undefined) => {'use strong';});", |
6250 NULL}; | 6218 NULL}; |
6251 | 6219 |
6252 static const ParserFlag always_flags[] = { | 6220 static const ParserFlag always_flags[] = {kAllowStrongMode}; |
6253 kAllowStrongMode, kAllowHarmonyArrowFunctions | |
6254 }; | |
6255 RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, always_flags, | 6221 RunParserSyncTest(sloppy_context_data, data, kSuccess, NULL, 0, always_flags, |
6256 arraysize(always_flags)); | 6222 arraysize(always_flags)); |
6257 RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags, | 6223 RunParserSyncTest(strict_context_data, data, kSuccess, NULL, 0, always_flags, |
6258 arraysize(always_flags)); | 6224 arraysize(always_flags)); |
6259 RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags, | 6225 RunParserSyncTest(strong_context_data, data, kError, NULL, 0, always_flags, |
6260 arraysize(always_flags)); | 6226 arraysize(always_flags)); |
6261 RunParserSyncTest(sloppy_context_data, local_strong, kError, NULL, 0, | 6227 RunParserSyncTest(sloppy_context_data, local_strong, kError, NULL, 0, |
6262 always_flags, arraysize(always_flags)); | 6228 always_flags, arraysize(always_flags)); |
6263 } | 6229 } |
6264 | 6230 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6360 {NULL, NULL}}; | 6326 {NULL, NULL}}; |
6361 | 6327 |
6362 const char* data[] = { | 6328 const char* data[] = { |
6363 "(a\n=> a)(1)", | 6329 "(a\n=> a)(1)", |
6364 "(a/*\n*/=> a)(1)", | 6330 "(a/*\n*/=> a)(1)", |
6365 "((a)\n=> a)(1)", | 6331 "((a)\n=> a)(1)", |
6366 "((a)/*\n*/=> a)(1)", | 6332 "((a)/*\n*/=> a)(1)", |
6367 "((a, b)\n=> a + b)(1, 2)", | 6333 "((a, b)\n=> a + b)(1, 2)", |
6368 "((a, b)/*\n*/=> a + b)(1, 2)", | 6334 "((a, b)/*\n*/=> a + b)(1, 2)", |
6369 NULL}; | 6335 NULL}; |
6370 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; | 6336 RunParserSyncTest(context_data, data, kError); |
6371 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | |
6372 arraysize(always_flags)); | |
6373 } | 6337 } |
6374 | 6338 |
6375 | 6339 |
6376 TEST(StrongModeFreeVariablesDeclaredByPreviousScript) { | 6340 TEST(StrongModeFreeVariablesDeclaredByPreviousScript) { |
6377 i::FLAG_strong_mode = true; | 6341 i::FLAG_strong_mode = true; |
6378 v8::V8::Initialize(); | 6342 v8::V8::Initialize(); |
6379 v8::HandleScope scope(CcTest::isolate()); | 6343 v8::HandleScope scope(CcTest::isolate()); |
6380 v8::Context::Scope context_scope(v8::Context::New(CcTest::isolate())); | 6344 v8::Context::Scope context_scope(v8::Context::New(CcTest::isolate())); |
6381 v8::TryCatch try_catch(CcTest::isolate()); | 6345 v8::TryCatch try_catch(CcTest::isolate()); |
6382 | 6346 |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6518 strcmp( | 6482 strcmp( |
6519 "ReferenceError: In strong mode, using an undeclared global " | 6483 "ReferenceError: In strong mode, using an undeclared global " |
6520 "variable 'not_there3' is not allowed", | 6484 "variable 'not_there3' is not allowed", |
6521 *exception)); | 6485 *exception)); |
6522 } | 6486 } |
6523 } | 6487 } |
6524 | 6488 |
6525 | 6489 |
6526 TEST(DestructuringPositiveTests) { | 6490 TEST(DestructuringPositiveTests) { |
6527 i::FLAG_harmony_destructuring = true; | 6491 i::FLAG_harmony_destructuring = true; |
6528 i::FLAG_harmony_arrow_functions = true; | |
6529 | 6492 |
6530 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, | 6493 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, |
6531 {"var ", " = {};"}, | 6494 {"var ", " = {};"}, |
6532 {"'use strict'; const ", " = {};"}, | 6495 {"'use strict'; const ", " = {};"}, |
6533 {"function f(", ") {}"}, | 6496 {"function f(", ") {}"}, |
6534 {"function f(argument1, ", ") {}"}, | 6497 {"function f(argument1, ", ") {}"}, |
6535 {"var f = (", ") => {};"}, | 6498 {"var f = (", ") => {};"}, |
6536 {"var f = (argument1,", ") => {};"}, | 6499 {"var f = (argument1,", ") => {};"}, |
6537 {NULL, NULL}}; | 6500 {NULL, NULL}}; |
6538 | 6501 |
(...skipping 30 matching lines...) Expand all Loading... |
6569 "{var: x = 42}", | 6532 "{var: x = 42}", |
6570 "{[x] : z}", | 6533 "{[x] : z}", |
6571 "{[1+1] : z}", | 6534 "{[1+1] : z}", |
6572 "{[foo()] : z}", | 6535 "{[foo()] : z}", |
6573 "{}", | 6536 "{}", |
6574 "[...rest]", | 6537 "[...rest]", |
6575 "[a,b,...rest]", | 6538 "[a,b,...rest]", |
6576 "[a,,...rest]", | 6539 "[a,,...rest]", |
6577 NULL}; | 6540 NULL}; |
6578 // clang-format on | 6541 // clang-format on |
6579 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions, | 6542 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; |
6580 kAllowHarmonyDestructuring}; | |
6581 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, | 6543 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, |
6582 arraysize(always_flags)); | 6544 arraysize(always_flags)); |
6583 } | 6545 } |
6584 | 6546 |
6585 | 6547 |
6586 TEST(DestructuringNegativeTests) { | 6548 TEST(DestructuringNegativeTests) { |
6587 i::FLAG_harmony_destructuring = true; | 6549 i::FLAG_harmony_destructuring = true; |
6588 i::FLAG_harmony_arrow_functions = true; | 6550 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; |
6589 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions, | |
6590 kAllowHarmonyDestructuring}; | |
6591 | 6551 |
6592 { // All modes. | 6552 { // All modes. |
6593 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, | 6553 const char* context_data[][2] = {{"'use strict'; let ", " = {};"}, |
6594 {"var ", " = {};"}, | 6554 {"var ", " = {};"}, |
6595 {"'use strict'; const ", " = {};"}, | 6555 {"'use strict'; const ", " = {};"}, |
6596 {"function f(", ") {}"}, | 6556 {"function f(", ") {}"}, |
6597 {"function f(argument1, ", ") {}"}, | 6557 {"function f(argument1, ", ") {}"}, |
6598 {"var f = (", ") => {};"}, | 6558 {"var f = (", ") => {};"}, |
6599 {"var f = ", " => {};"}, | 6559 {"var f = ", " => {};"}, |
6600 {"var f = (argument1,", ") => {};"}, | 6560 {"var f = (argument1,", ") => {};"}, |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6747 "for (var x = {} in null);", | 6707 "for (var x = {} in null);", |
6748 NULL}; | 6708 NULL}; |
6749 // clang-format on | 6709 // clang-format on |
6750 RunParserSyncTest(context_data, success_data, kSuccess, NULL, 0, always_flags, | 6710 RunParserSyncTest(context_data, success_data, kSuccess, NULL, 0, always_flags, |
6751 arraysize(always_flags)); | 6711 arraysize(always_flags)); |
6752 } | 6712 } |
6753 | 6713 |
6754 | 6714 |
6755 TEST(DestructuringDuplicateParams) { | 6715 TEST(DestructuringDuplicateParams) { |
6756 i::FLAG_harmony_destructuring = true; | 6716 i::FLAG_harmony_destructuring = true; |
6757 i::FLAG_harmony_arrow_functions = true; | 6717 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; |
6758 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions, | |
6759 kAllowHarmonyDestructuring}; | |
6760 const char* context_data[][2] = {{"'use strict';", ""}, | 6718 const char* context_data[][2] = {{"'use strict';", ""}, |
6761 {"function outer() { 'use strict';", "}"}, | 6719 {"function outer() { 'use strict';", "}"}, |
6762 {nullptr, nullptr}}; | 6720 {nullptr, nullptr}}; |
6763 | 6721 |
6764 | 6722 |
6765 // clang-format off | 6723 // clang-format off |
6766 const char* error_data[] = { | 6724 const char* error_data[] = { |
6767 "function f(x,x){}", | 6725 "function f(x,x){}", |
6768 "function f(x, {x : x}){}", | 6726 "function f(x, {x : x}){}", |
6769 "function f(x, {x}){}", | 6727 "function f(x, {x}){}", |
6770 "function f({x,x}) {}", | 6728 "function f({x,x}) {}", |
6771 "function f([x,x]) {}", | 6729 "function f([x,x]) {}", |
6772 "function f(x, [y,{z:x}]) {}", | 6730 "function f(x, [y,{z:x}]) {}", |
6773 "function f([x,{y:x}]) {}", | 6731 "function f([x,{y:x}]) {}", |
6774 // non-simple parameter list causes duplicates to be errors in sloppy mode. | 6732 // non-simple parameter list causes duplicates to be errors in sloppy mode. |
6775 "function f(x, x, {a}) {}", | 6733 "function f(x, x, {a}) {}", |
6776 nullptr}; | 6734 nullptr}; |
6777 // clang-format on | 6735 // clang-format on |
6778 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, | 6736 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, |
6779 arraysize(always_flags)); | 6737 arraysize(always_flags)); |
6780 } | 6738 } |
6781 | 6739 |
6782 | 6740 |
6783 TEST(DestructuringDuplicateParamsSloppy) { | 6741 TEST(DestructuringDuplicateParamsSloppy) { |
6784 i::FLAG_harmony_destructuring = true; | 6742 i::FLAG_harmony_destructuring = true; |
6785 i::FLAG_harmony_arrow_functions = true; | 6743 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; |
6786 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions, | |
6787 kAllowHarmonyDestructuring}; | |
6788 const char* context_data[][2] = { | 6744 const char* context_data[][2] = { |
6789 {"", ""}, {"function outer() {", "}"}, {nullptr, nullptr}}; | 6745 {"", ""}, {"function outer() {", "}"}, {nullptr, nullptr}}; |
6790 | 6746 |
6791 | 6747 |
6792 // clang-format off | 6748 // clang-format off |
6793 const char* error_data[] = { | 6749 const char* error_data[] = { |
6794 // non-simple parameter list causes duplicates to be errors in sloppy mode. | 6750 // non-simple parameter list causes duplicates to be errors in sloppy mode. |
6795 "function f(x, {x : x}){}", | 6751 "function f(x, {x : x}){}", |
6796 "function f(x, {x}){}", | 6752 "function f(x, {x}){}", |
6797 "function f({x,x}) {}", | 6753 "function f({x,x}) {}", |
6798 "function f(x, x, {a}) {}", | 6754 "function f(x, x, {a}) {}", |
6799 nullptr}; | 6755 nullptr}; |
6800 // clang-format on | 6756 // clang-format on |
6801 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, | 6757 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, |
6802 arraysize(always_flags)); | 6758 arraysize(always_flags)); |
6803 } | 6759 } |
6804 | 6760 |
6805 | 6761 |
6806 TEST(DestructuringDisallowPatternsInSingleParamArrows) { | 6762 TEST(DestructuringDisallowPatternsInSingleParamArrows) { |
6807 i::FLAG_harmony_destructuring = true; | 6763 i::FLAG_harmony_destructuring = true; |
6808 i::FLAG_harmony_arrow_functions = true; | 6764 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring}; |
6809 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions, | |
6810 kAllowHarmonyDestructuring}; | |
6811 const char* context_data[][2] = {{"'use strict';", ""}, | 6765 const char* context_data[][2] = {{"'use strict';", ""}, |
6812 {"function outer() { 'use strict';", "}"}, | 6766 {"function outer() { 'use strict';", "}"}, |
6813 {"", ""}, | 6767 {"", ""}, |
6814 {"function outer() { ", "}"}, | 6768 {"function outer() { ", "}"}, |
6815 {nullptr, nullptr}}; | 6769 {nullptr, nullptr}}; |
6816 | 6770 |
6817 // clang-format off | 6771 // clang-format off |
6818 const char* error_data[] = { | 6772 const char* error_data[] = { |
6819 "var f = {x} => {};", | 6773 "var f = {x} => {};", |
6820 "var f = {x,y} => {};", | 6774 "var f = {x,y} => {};", |
6821 nullptr}; | 6775 nullptr}; |
6822 // clang-format on | 6776 // clang-format on |
6823 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, | 6777 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, |
6824 arraysize(always_flags)); | 6778 arraysize(always_flags)); |
6825 } | 6779 } |
6826 | 6780 |
6827 | 6781 |
6828 TEST(DestructuringDisallowPatternsInRestParams) { | 6782 TEST(DestructuringDisallowPatternsInRestParams) { |
6829 i::FLAG_harmony_destructuring = true; | 6783 i::FLAG_harmony_destructuring = true; |
6830 i::FLAG_harmony_arrow_functions = true; | |
6831 i::FLAG_harmony_rest_parameters = true; | 6784 i::FLAG_harmony_rest_parameters = true; |
6832 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions, | 6785 static const ParserFlag always_flags[] = {kAllowHarmonyRestParameters, |
6833 kAllowHarmonyRestParameters, | |
6834 kAllowHarmonyDestructuring}; | 6786 kAllowHarmonyDestructuring}; |
6835 const char* context_data[][2] = {{"'use strict';", ""}, | 6787 const char* context_data[][2] = {{"'use strict';", ""}, |
6836 {"function outer() { 'use strict';", "}"}, | 6788 {"function outer() { 'use strict';", "}"}, |
6837 {"", ""}, | 6789 {"", ""}, |
6838 {"function outer() { ", "}"}, | 6790 {"function outer() { ", "}"}, |
6839 {nullptr, nullptr}}; | 6791 {nullptr, nullptr}}; |
6840 | 6792 |
6841 // clang-format off | 6793 // clang-format off |
6842 const char* error_data[] = { | 6794 const char* error_data[] = { |
6843 "function(...{}) {}", | 6795 "function(...{}) {}", |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6912 | 6864 |
6913 "{x}=(yield)", | 6865 "{x}=(yield)", |
6914 "[x]=(yield)", | 6866 "[x]=(yield)", |
6915 | 6867 |
6916 "{x}=f(yield)", | 6868 "{x}=f(yield)", |
6917 "[x]=f(yield)", | 6869 "[x]=f(yield)", |
6918 NULL | 6870 NULL |
6919 }; | 6871 }; |
6920 | 6872 |
6921 // clang-format on | 6873 // clang-format on |
6922 static const ParserFlag always_flags[] = { | 6874 static const ParserFlag always_flags[] = {kAllowHarmonyDestructuring, |
6923 kAllowHarmonyDestructuring, kAllowHarmonyDefaultParameters, | 6875 kAllowHarmonyDefaultParameters, |
6924 kAllowHarmonyArrowFunctions, kAllowStrongMode}; | 6876 kAllowStrongMode}; |
6925 | 6877 |
6926 RunParserSyncTest(sloppy_function_context_data, parameter_data, kSuccess, | 6878 RunParserSyncTest(sloppy_function_context_data, parameter_data, kSuccess, |
6927 NULL, 0, always_flags, arraysize(always_flags)); | 6879 NULL, 0, always_flags, arraysize(always_flags)); |
6928 RunParserSyncTest(sloppy_function_context_data, destructuring_assignment_data, | 6880 RunParserSyncTest(sloppy_function_context_data, destructuring_assignment_data, |
6929 kSuccess, NULL, 0, always_flags, arraysize(always_flags)); | 6881 kSuccess, NULL, 0, always_flags, arraysize(always_flags)); |
6930 RunParserSyncTest(sloppy_arrow_context_data, parameter_data, kSuccess, NULL, | 6882 RunParserSyncTest(sloppy_arrow_context_data, parameter_data, kSuccess, NULL, |
6931 0, always_flags, arraysize(always_flags)); | 6883 0, always_flags, arraysize(always_flags)); |
6932 // TODO(wingo): Will change to kSuccess when destructuring assignment lands. | 6884 // TODO(wingo): Will change to kSuccess when destructuring assignment lands. |
6933 RunParserSyncTest(sloppy_arrow_context_data, destructuring_assignment_data, | 6885 RunParserSyncTest(sloppy_arrow_context_data, destructuring_assignment_data, |
6934 kError, NULL, 0, always_flags, arraysize(always_flags)); | 6886 kError, NULL, 0, always_flags, arraysize(always_flags)); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7029 "() => { new.target }", | 6981 "() => { new.target }", |
7030 "() => new.target", | 6982 "() => new.target", |
7031 "if (1) { new.target }", | 6983 "if (1) { new.target }", |
7032 "if (1) {} else { new.target }", | 6984 "if (1) {} else { new.target }", |
7033 "while (0) { new.target }", | 6985 "while (0) { new.target }", |
7034 "do { new.target } while (0)", | 6986 "do { new.target } while (0)", |
7035 NULL | 6987 NULL |
7036 }; | 6988 }; |
7037 | 6989 |
7038 static const ParserFlag always_flags[] = { | 6990 static const ParserFlag always_flags[] = { |
7039 kAllowHarmonyArrowFunctions, | |
7040 kAllowHarmonyNewTarget, | 6991 kAllowHarmonyNewTarget, |
7041 kAllowHarmonySloppy, | 6992 kAllowHarmonySloppy, |
7042 }; | 6993 }; |
7043 // clang-format on | 6994 // clang-format on |
7044 | 6995 |
7045 RunParserSyncTest(good_context_data, data, kSuccess, NULL, 0, always_flags, | 6996 RunParserSyncTest(good_context_data, data, kSuccess, NULL, 0, always_flags, |
7046 arraysize(always_flags)); | 6997 arraysize(always_flags)); |
7047 RunParserSyncTest(bad_context_data, data, kError, NULL, 0, always_flags, | 6998 RunParserSyncTest(bad_context_data, data, kError, NULL, 0, always_flags, |
7048 arraysize(always_flags)); | 6999 arraysize(always_flags)); |
7049 } | 7000 } |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7195 "initializer = true", | 7146 "initializer = true", |
7196 "a, b, c = 1", | 7147 "a, b, c = 1", |
7197 "...args", | 7148 "...args", |
7198 "a, b, ...rest", | 7149 "a, b, ...rest", |
7199 "[a, b, ...rest]", | 7150 "[a, b, ...rest]", |
7200 "{ bindingPattern = {} }", | 7151 "{ bindingPattern = {} }", |
7201 "{ initializedBindingPattern } = { initializedBindingPattern: true }", | 7152 "{ initializedBindingPattern } = { initializedBindingPattern: true }", |
7202 NULL}; | 7153 NULL}; |
7203 | 7154 |
7204 static const ParserFlag always_flags[] = { | 7155 static const ParserFlag always_flags[] = { |
7205 kAllowHarmonyArrowFunctions, kAllowHarmonyDefaultParameters, | 7156 kAllowHarmonyDefaultParameters, kAllowHarmonyDestructuring, |
7206 kAllowHarmonyDestructuring, kAllowHarmonyRestParameters, | 7157 kAllowHarmonyRestParameters, kAllowHarmonySloppy, kAllowStrongMode}; |
7207 kAllowHarmonySloppy, kAllowStrongMode | |
7208 }; | |
7209 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 7158 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, |
7210 arraysize(always_flags)); | 7159 arraysize(always_flags)); |
7211 } | 7160 } |
7212 | 7161 |
7213 | 7162 |
7214 TEST(LetSloppyOnly) { | 7163 TEST(LetSloppyOnly) { |
7215 // clang-format off | 7164 // clang-format off |
7216 const char* context_data[][2] = { | 7165 const char* context_data[][2] = { |
7217 {"", ""}, | 7166 {"", ""}, |
7218 {"{", "}"}, | 7167 {"{", "}"}, |
(...skipping 12 matching lines...) Expand all Loading... |
7231 "for (let in {}) {}", | 7180 "for (let in {}) {}", |
7232 NULL | 7181 NULL |
7233 }; | 7182 }; |
7234 // clang-format on | 7183 // clang-format on |
7235 | 7184 |
7236 static const ParserFlag always_flags[] = {kAllowHarmonySloppy, | 7185 static const ParserFlag always_flags[] = {kAllowHarmonySloppy, |
7237 kAllowHarmonySloppyLet}; | 7186 kAllowHarmonySloppyLet}; |
7238 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, | 7187 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags, |
7239 arraysize(always_flags)); | 7188 arraysize(always_flags)); |
7240 } | 7189 } |
OLD | NEW |