Chromium Code Reviews| 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 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 312 const char* program = programs[i]; | 312 const char* program = programs[i]; |
| 313 i::Utf8ToUtf16CharacterStream stream( | 313 i::Utf8ToUtf16CharacterStream stream( |
| 314 reinterpret_cast<const i::byte*>(program), | 314 reinterpret_cast<const i::byte*>(program), |
| 315 static_cast<unsigned>(strlen(program))); | 315 static_cast<unsigned>(strlen(program))); |
| 316 i::CompleteParserRecorder log; | 316 i::CompleteParserRecorder log; |
| 317 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 317 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
| 318 scanner.Initialize(&stream); | 318 scanner.Initialize(&stream); |
| 319 | 319 |
| 320 i::PreParser preparser(&scanner, &log, stack_limit); | 320 i::PreParser preparser(&scanner, &log, stack_limit); |
| 321 preparser.set_allow_lazy(true); | 321 preparser.set_allow_lazy(true); |
| 322 preparser.set_allow_natives_syntax(true); | 322 preparser.set_allow_natives(true); |
| 323 preparser.set_allow_arrow_functions(true); | 323 preparser.set_allow_harmony_arrow_functions(true); |
| 324 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 324 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
| 325 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 325 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
| 326 CHECK(!log.HasError()); | 326 CHECK(!log.HasError()); |
| 327 } | 327 } |
| 328 } | 328 } |
| 329 | 329 |
| 330 | 330 |
| 331 TEST(StandAlonePreParserNoNatives) { | 331 TEST(StandAlonePreParserNoNatives) { |
| 332 v8::V8::Initialize(); | 332 v8::V8::Initialize(); |
| 333 | 333 |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 492 | 492 |
| 493 i::Utf8ToUtf16CharacterStream stream( | 493 i::Utf8ToUtf16CharacterStream stream( |
| 494 reinterpret_cast<const i::byte*>(program.get()), | 494 reinterpret_cast<const i::byte*>(program.get()), |
| 495 static_cast<unsigned>(kProgramSize)); | 495 static_cast<unsigned>(kProgramSize)); |
| 496 i::CompleteParserRecorder log; | 496 i::CompleteParserRecorder log; |
| 497 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 497 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
| 498 scanner.Initialize(&stream); | 498 scanner.Initialize(&stream); |
| 499 | 499 |
| 500 i::PreParser preparser(&scanner, &log, stack_limit); | 500 i::PreParser preparser(&scanner, &log, stack_limit); |
| 501 preparser.set_allow_lazy(true); | 501 preparser.set_allow_lazy(true); |
| 502 preparser.set_allow_arrow_functions(true); | 502 preparser.set_allow_harmony_arrow_functions(true); |
| 503 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 503 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
| 504 CHECK_EQ(i::PreParser::kPreParseStackOverflow, result); | 504 CHECK_EQ(i::PreParser::kPreParseStackOverflow, result); |
| 505 } | 505 } |
| 506 | 506 |
| 507 | 507 |
| 508 class TestExternalResource: public v8::String::ExternalStringResource { | 508 class TestExternalResource: public v8::String::ExternalStringResource { |
| 509 public: | 509 public: |
| 510 explicit TestExternalResource(uint16_t* data, int length) | 510 explicit TestExternalResource(uint16_t* data, int length) |
| 511 : data_(data), length_(static_cast<size_t>(length)) { } | 511 : data_(data), length_(static_cast<size_t>(length)) { } |
| 512 | 512 |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1010 source_data[i].body, surroundings[j].suffix); | 1010 source_data[i].body, surroundings[j].suffix); |
| 1011 i::Handle<i::String> source = | 1011 i::Handle<i::String> source = |
| 1012 factory->NewStringFromUtf8(i::CStrVector(program.start())) | 1012 factory->NewStringFromUtf8(i::CStrVector(program.start())) |
| 1013 .ToHandleChecked(); | 1013 .ToHandleChecked(); |
| 1014 i::Handle<i::Script> script = factory->NewScript(source); | 1014 i::Handle<i::Script> script = factory->NewScript(source); |
| 1015 i::CompilationInfoWithZone info(script); | 1015 i::CompilationInfoWithZone info(script); |
| 1016 i::Parser::ParseInfo parse_info = {isolate->stack_guard()->real_climit(), | 1016 i::Parser::ParseInfo parse_info = {isolate->stack_guard()->real_climit(), |
| 1017 isolate->heap()->HashSeed(), | 1017 isolate->heap()->HashSeed(), |
| 1018 isolate->unicode_cache()}; | 1018 isolate->unicode_cache()}; |
| 1019 i::Parser parser(&info, &parse_info); | 1019 i::Parser parser(&info, &parse_info); |
| 1020 parser.set_allow_arrow_functions(true); | 1020 parser.set_allow_harmony_arrow_functions(true); |
| 1021 parser.set_allow_classes(true); | 1021 parser.set_allow_harmony_classes(true); |
| 1022 parser.set_allow_harmony_scoping(true); | 1022 parser.set_allow_harmony_scoping(true); |
| 1023 info.MarkAsGlobal(); | 1023 info.MarkAsGlobal(); |
| 1024 parser.Parse(); | 1024 parser.Parse(); |
| 1025 CHECK(i::Rewriter::Rewrite(&info)); | 1025 CHECK(i::Rewriter::Rewrite(&info)); |
| 1026 CHECK(i::Scope::Analyze(&info)); | 1026 CHECK(i::Scope::Analyze(&info)); |
| 1027 CHECK(info.function() != NULL); | 1027 CHECK(info.function() != NULL); |
| 1028 | 1028 |
| 1029 i::Scope* script_scope = info.function()->scope(); | 1029 i::Scope* script_scope = info.function()->scope(); |
| 1030 CHECK(script_scope->is_script_scope()); | 1030 CHECK(script_scope->is_script_scope()); |
| 1031 CHECK_EQ(1, script_scope->inner_scopes()->length()); | 1031 CHECK_EQ(1, script_scope->inner_scopes()->length()); |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1258 i::CStrVector(program.start())).ToHandleChecked(); | 1258 i::CStrVector(program.start())).ToHandleChecked(); |
| 1259 CHECK_EQ(source->length(), kProgramSize); | 1259 CHECK_EQ(source->length(), kProgramSize); |
| 1260 i::Handle<i::Script> script = factory->NewScript(source); | 1260 i::Handle<i::Script> script = factory->NewScript(source); |
| 1261 i::CompilationInfoWithZone info(script); | 1261 i::CompilationInfoWithZone info(script); |
| 1262 i::Parser::ParseInfo parse_info = {isolate->stack_guard()->real_climit(), | 1262 i::Parser::ParseInfo parse_info = {isolate->stack_guard()->real_climit(), |
| 1263 isolate->heap()->HashSeed(), | 1263 isolate->heap()->HashSeed(), |
| 1264 isolate->unicode_cache()}; | 1264 isolate->unicode_cache()}; |
| 1265 i::Parser parser(&info, &parse_info); | 1265 i::Parser parser(&info, &parse_info); |
| 1266 parser.set_allow_lazy(true); | 1266 parser.set_allow_lazy(true); |
| 1267 parser.set_allow_harmony_scoping(true); | 1267 parser.set_allow_harmony_scoping(true); |
| 1268 parser.set_allow_arrow_functions(true); | 1268 parser.set_allow_harmony_arrow_functions(true); |
| 1269 info.MarkAsGlobal(); | 1269 info.MarkAsGlobal(); |
| 1270 info.SetStrictMode(source_data[i].strict_mode); | 1270 info.SetStrictMode(source_data[i].strict_mode); |
| 1271 parser.Parse(); | 1271 parser.Parse(); |
| 1272 CHECK(info.function() != NULL); | 1272 CHECK(info.function() != NULL); |
| 1273 | 1273 |
| 1274 // Check scope types and positions. | 1274 // Check scope types and positions. |
| 1275 i::Scope* scope = info.function()->scope(); | 1275 i::Scope* scope = info.function()->scope(); |
| 1276 CHECK(scope->is_script_scope()); | 1276 CHECK(scope->is_script_scope()); |
| 1277 CHECK_EQ(scope->start_position(), 0); | 1277 CHECK_EQ(scope->start_position(), 0); |
| 1278 CHECK_EQ(scope->end_position(), kProgramSize); | 1278 CHECK_EQ(scope->end_position(), kProgramSize); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1332 CHECK(result->IsString()); | 1332 CHECK(result->IsString()); |
| 1333 i::DeleteArray(message); | 1333 i::DeleteArray(message); |
| 1334 i::DeleteArray(arg); | 1334 i::DeleteArray(arg); |
| 1335 data.Dispose(); | 1335 data.Dispose(); |
| 1336 return i::Handle<i::String>::cast(result); | 1336 return i::Handle<i::String>::cast(result); |
| 1337 } | 1337 } |
| 1338 | 1338 |
| 1339 | 1339 |
| 1340 enum ParserFlag { | 1340 enum ParserFlag { |
| 1341 kAllowLazy, | 1341 kAllowLazy, |
| 1342 kAllowNativesSyntax, | 1342 kAllowNatives, |
| 1343 kAllowHarmonyScoping, | 1343 kAllowHarmonyScoping, |
| 1344 kAllowModules, | 1344 kAllowHarmonyModules, |
| 1345 kAllowHarmonyNumericLiterals, | 1345 kAllowHarmonyNumericLiterals, |
| 1346 kAllowArrowFunctions, | 1346 kAllowHarmonyArrowFunctions, |
| 1347 kAllowClasses, | 1347 kAllowHarmonyClasses, |
| 1348 kAllowHarmonyObjectLiterals, | 1348 kAllowHarmonyObjectLiterals, |
| 1349 kAllowHarmonyTemplates | 1349 kAllowHarmonyTemplates, |
| 1350 kAllowHarmonySloppy | |
| 1350 }; | 1351 }; |
| 1351 | 1352 |
| 1352 | 1353 |
| 1353 enum ParserSyncTestResult { | 1354 enum ParserSyncTestResult { |
| 1354 kSuccessOrError, | 1355 kSuccessOrError, |
| 1355 kSuccess, | 1356 kSuccess, |
| 1356 kError | 1357 kError |
| 1357 }; | 1358 }; |
| 1358 | 1359 |
| 1359 template <typename Traits> | 1360 template <typename Traits> |
| 1360 void SetParserFlags(i::ParserBase<Traits>* parser, | 1361 void SetParserFlags(i::ParserBase<Traits>* parser, |
| 1361 i::EnumSet<ParserFlag> flags) { | 1362 i::EnumSet<ParserFlag> flags) { |
| 1362 parser->set_allow_lazy(flags.Contains(kAllowLazy)); | 1363 parser->set_allow_lazy(flags.Contains(kAllowLazy)); |
| 1363 parser->set_allow_natives_syntax(flags.Contains(kAllowNativesSyntax)); | 1364 parser->set_allow_natives(flags.Contains(kAllowNatives)); |
| 1364 parser->set_allow_harmony_scoping(flags.Contains(kAllowHarmonyScoping)); | 1365 parser->set_allow_harmony_scoping(flags.Contains(kAllowHarmonyScoping)); |
| 1365 parser->set_allow_modules(flags.Contains(kAllowModules)); | 1366 parser->set_allow_harmony_modules(flags.Contains(kAllowHarmonyModules)); |
| 1366 parser->set_allow_harmony_numeric_literals( | 1367 parser->set_allow_harmony_numeric_literals( |
| 1367 flags.Contains(kAllowHarmonyNumericLiterals)); | 1368 flags.Contains(kAllowHarmonyNumericLiterals)); |
| 1368 parser->set_allow_harmony_object_literals( | 1369 parser->set_allow_harmony_object_literals( |
| 1369 flags.Contains(kAllowHarmonyObjectLiterals)); | 1370 flags.Contains(kAllowHarmonyObjectLiterals)); |
| 1370 parser->set_allow_arrow_functions(flags.Contains(kAllowArrowFunctions)); | 1371 parser->set_allow_harmony_arrow_functions( |
| 1371 parser->set_allow_classes(flags.Contains(kAllowClasses)); | 1372 flags.Contains(kAllowHarmonyArrowFunctions)); |
| 1373 parser->set_allow_harmony_classes(flags.Contains(kAllowHarmonyClasses)); | |
| 1372 parser->set_allow_harmony_templates(flags.Contains(kAllowHarmonyTemplates)); | 1374 parser->set_allow_harmony_templates(flags.Contains(kAllowHarmonyTemplates)); |
| 1375 printf("SetParserFlags: %d\n", flags.Contains(kAllowHarmonySloppy)); | |
|
arv (Not doing code reviews)
2014/11/19 16:51:04
Remove?
rossberg
2014/11/19 17:23:43
Oops.
| |
| 1376 parser->set_allow_harmony_sloppy(flags.Contains(kAllowHarmonySloppy)); | |
| 1373 } | 1377 } |
| 1374 | 1378 |
| 1375 | 1379 |
| 1376 void TestParserSyncWithFlags(i::Handle<i::String> source, | 1380 void TestParserSyncWithFlags(i::Handle<i::String> source, |
| 1377 i::EnumSet<ParserFlag> flags, | 1381 i::EnumSet<ParserFlag> flags, |
| 1378 ParserSyncTestResult result) { | 1382 ParserSyncTestResult result) { |
| 1379 i::Isolate* isolate = CcTest::i_isolate(); | 1383 i::Isolate* isolate = CcTest::i_isolate(); |
| 1380 i::Factory* factory = isolate->factory(); | 1384 i::Factory* factory = isolate->factory(); |
| 1381 | 1385 |
| 1382 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); | 1386 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1475 CHECK(false); | 1479 CHECK(false); |
| 1476 } | 1480 } |
| 1477 } | 1481 } |
| 1478 | 1482 |
| 1479 | 1483 |
| 1480 void TestParserSync(const char* source, | 1484 void TestParserSync(const char* source, |
| 1481 const ParserFlag* varying_flags, | 1485 const ParserFlag* varying_flags, |
| 1482 size_t varying_flags_length, | 1486 size_t varying_flags_length, |
| 1483 ParserSyncTestResult result = kSuccessOrError, | 1487 ParserSyncTestResult result = kSuccessOrError, |
| 1484 const ParserFlag* always_true_flags = NULL, | 1488 const ParserFlag* always_true_flags = NULL, |
| 1485 size_t always_true_flags_length = 0) { | 1489 size_t always_true_flags_length = 0, |
| 1490 const ParserFlag* always_false_flags = NULL, | |
| 1491 size_t always_false_flags_length = 0) { | |
| 1486 i::Handle<i::String> str = | 1492 i::Handle<i::String> str = |
| 1487 CcTest::i_isolate()->factory()->NewStringFromAsciiChecked(source); | 1493 CcTest::i_isolate()->factory()->NewStringFromAsciiChecked(source); |
| 1488 for (int bits = 0; bits < (1 << varying_flags_length); bits++) { | 1494 for (int bits = 0; bits < (1 << varying_flags_length); bits++) { |
| 1489 i::EnumSet<ParserFlag> flags; | 1495 i::EnumSet<ParserFlag> flags; |
| 1490 for (size_t flag_index = 0; flag_index < varying_flags_length; | 1496 for (size_t flag_index = 0; flag_index < varying_flags_length; |
| 1491 ++flag_index) { | 1497 ++flag_index) { |
| 1492 if ((bits & (1 << flag_index)) != 0) flags.Add(varying_flags[flag_index]); | 1498 if ((bits & (1 << flag_index)) != 0) flags.Add(varying_flags[flag_index]); |
| 1493 } | 1499 } |
| 1494 for (size_t flag_index = 0; flag_index < always_true_flags_length; | 1500 for (size_t flag_index = 0; flag_index < always_true_flags_length; |
| 1495 ++flag_index) { | 1501 ++flag_index) { |
| 1496 flags.Add(always_true_flags[flag_index]); | 1502 flags.Add(always_true_flags[flag_index]); |
| 1497 } | 1503 } |
| 1504 for (size_t flag_index = 0; flag_index < always_false_flags_length; | |
| 1505 ++flag_index) { | |
| 1506 flags.Remove(always_false_flags[flag_index]); | |
| 1507 } | |
| 1498 TestParserSyncWithFlags(str, flags, result); | 1508 TestParserSyncWithFlags(str, flags, result); |
| 1499 } | 1509 } |
| 1500 } | 1510 } |
| 1501 | 1511 |
| 1502 | 1512 |
| 1503 TEST(ParserSync) { | 1513 TEST(ParserSync) { |
| 1504 const char* context_data[][2] = { | 1514 const char* context_data[][2] = { |
| 1505 { "", "" }, | 1515 { "", "" }, |
| 1506 { "{", "}" }, | 1516 { "{", "}" }, |
| 1507 { "if (true) ", " else {}" }, | 1517 { "if (true) ", " else {}" }, |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1571 }; | 1581 }; |
| 1572 | 1582 |
| 1573 v8::HandleScope handles(CcTest::isolate()); | 1583 v8::HandleScope handles(CcTest::isolate()); |
| 1574 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | 1584 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); |
| 1575 v8::Context::Scope context_scope(context); | 1585 v8::Context::Scope context_scope(context); |
| 1576 | 1586 |
| 1577 CcTest::i_isolate()->stack_guard()->SetStackLimit( | 1587 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
| 1578 i::GetCurrentStackPosition() - 128 * 1024); | 1588 i::GetCurrentStackPosition() - 128 * 1024); |
| 1579 | 1589 |
| 1580 static const ParserFlag flags1[] = { | 1590 static const ParserFlag flags1[] = { |
| 1581 kAllowArrowFunctions, | 1591 kAllowHarmonyArrowFunctions, |
| 1582 kAllowClasses, | 1592 kAllowHarmonyClasses, |
| 1583 kAllowHarmonyNumericLiterals, | 1593 kAllowHarmonyNumericLiterals, |
| 1584 kAllowHarmonyObjectLiterals, | 1594 kAllowHarmonyObjectLiterals, |
| 1585 kAllowHarmonyScoping, | 1595 kAllowHarmonyScoping, |
| 1596 kAllowHarmonyModules, | |
| 1597 kAllowHarmonySloppy, | |
| 1586 kAllowLazy, | 1598 kAllowLazy, |
| 1587 kAllowModules, | |
| 1588 }; | 1599 }; |
| 1589 | 1600 |
| 1590 for (int i = 0; context_data[i][0] != NULL; ++i) { | 1601 for (int i = 0; context_data[i][0] != NULL; ++i) { |
| 1591 for (int j = 0; statement_data[j] != NULL; ++j) { | 1602 for (int j = 0; statement_data[j] != NULL; ++j) { |
| 1592 for (int k = 0; termination_data[k] != NULL; ++k) { | 1603 for (int k = 0; termination_data[k] != NULL; ++k) { |
| 1593 int kPrefixLen = i::StrLength(context_data[i][0]); | 1604 int kPrefixLen = i::StrLength(context_data[i][0]); |
| 1594 int kStatementLen = i::StrLength(statement_data[j]); | 1605 int kStatementLen = i::StrLength(statement_data[j]); |
| 1595 int kTerminationLen = i::StrLength(termination_data[k]); | 1606 int kTerminationLen = i::StrLength(termination_data[k]); |
| 1596 int kSuffixLen = i::StrLength(context_data[i][1]); | 1607 int kSuffixLen = i::StrLength(context_data[i][1]); |
| 1597 int kProgramSize = kPrefixLen + kStatementLen + kTerminationLen | 1608 int kProgramSize = kPrefixLen + kStatementLen + kTerminationLen |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1611 } | 1622 } |
| 1612 } | 1623 } |
| 1613 | 1624 |
| 1614 // Neither Harmony numeric literals nor our natives syntax have any | 1625 // Neither Harmony numeric literals nor our natives syntax have any |
| 1615 // interaction with the flags above, so test these separately to reduce | 1626 // interaction with the flags above, so test these separately to reduce |
| 1616 // the combinatorial explosion. | 1627 // the combinatorial explosion. |
| 1617 static const ParserFlag flags2[] = { kAllowHarmonyNumericLiterals }; | 1628 static const ParserFlag flags2[] = { kAllowHarmonyNumericLiterals }; |
| 1618 TestParserSync("0o1234", flags2, arraysize(flags2)); | 1629 TestParserSync("0o1234", flags2, arraysize(flags2)); |
| 1619 TestParserSync("0b1011", flags2, arraysize(flags2)); | 1630 TestParserSync("0b1011", flags2, arraysize(flags2)); |
| 1620 | 1631 |
| 1621 static const ParserFlag flags3[] = { kAllowNativesSyntax }; | 1632 static const ParserFlag flags3[] = { kAllowNatives }; |
| 1622 TestParserSync("%DebugPrint(123)", flags3, arraysize(flags3)); | 1633 TestParserSync("%DebugPrint(123)", flags3, arraysize(flags3)); |
| 1623 } | 1634 } |
| 1624 | 1635 |
| 1625 | 1636 |
| 1626 TEST(StrictOctal) { | 1637 TEST(StrictOctal) { |
| 1627 // Test that syntax error caused by octal literal is reported correctly as | 1638 // Test that syntax error caused by octal literal is reported correctly as |
| 1628 // such (issue 2220). | 1639 // such (issue 2220). |
| 1629 v8::V8::Initialize(); | 1640 v8::V8::Initialize(); |
| 1630 v8::HandleScope scope(CcTest::isolate()); | 1641 v8::HandleScope scope(CcTest::isolate()); |
| 1631 v8::Context::Scope context_scope( | 1642 v8::Context::Scope context_scope( |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1645 *exception); | 1656 *exception); |
| 1646 } | 1657 } |
| 1647 | 1658 |
| 1648 | 1659 |
| 1649 void RunParserSyncTest(const char* context_data[][2], | 1660 void RunParserSyncTest(const char* context_data[][2], |
| 1650 const char* statement_data[], | 1661 const char* statement_data[], |
| 1651 ParserSyncTestResult result, | 1662 ParserSyncTestResult result, |
| 1652 const ParserFlag* flags = NULL, | 1663 const ParserFlag* flags = NULL, |
| 1653 int flags_len = 0, | 1664 int flags_len = 0, |
| 1654 const ParserFlag* always_true_flags = NULL, | 1665 const ParserFlag* always_true_flags = NULL, |
| 1655 int always_true_flags_len = 0) { | 1666 int always_true_len = 0, |
| 1667 const ParserFlag* always_false_flags = NULL, | |
| 1668 int always_false_len = 0) { | |
| 1656 v8::HandleScope handles(CcTest::isolate()); | 1669 v8::HandleScope handles(CcTest::isolate()); |
| 1657 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | 1670 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); |
| 1658 v8::Context::Scope context_scope(context); | 1671 v8::Context::Scope context_scope(context); |
| 1659 | 1672 |
| 1660 CcTest::i_isolate()->stack_guard()->SetStackLimit( | 1673 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
| 1661 i::GetCurrentStackPosition() - 128 * 1024); | 1674 i::GetCurrentStackPosition() - 128 * 1024); |
| 1662 | 1675 |
| 1663 static const ParserFlag default_flags[] = { | 1676 static const ParserFlag default_flags[] = { |
| 1664 kAllowArrowFunctions, | 1677 kAllowHarmonyArrowFunctions, |
| 1665 kAllowClasses, | 1678 kAllowHarmonyClasses, |
| 1666 kAllowHarmonyNumericLiterals, | 1679 kAllowHarmonyNumericLiterals, |
| 1667 kAllowHarmonyObjectLiterals, | 1680 kAllowHarmonyObjectLiterals, |
| 1668 kAllowHarmonyScoping, | 1681 kAllowHarmonyScoping, |
| 1682 kAllowHarmonyModules, | |
| 1683 kAllowHarmonyTemplates, | |
| 1684 kAllowHarmonySloppy, | |
| 1669 kAllowLazy, | 1685 kAllowLazy, |
| 1670 kAllowModules, | 1686 kAllowNatives, |
| 1671 kAllowNativesSyntax, | |
| 1672 kAllowHarmonyTemplates | |
| 1673 }; | 1687 }; |
| 1674 ParserFlag* generated_flags = NULL; | 1688 ParserFlag* generated_flags = NULL; |
| 1675 if (flags == NULL) { | 1689 if (flags == NULL) { |
| 1676 flags = default_flags; | 1690 flags = default_flags; |
| 1677 flags_len = arraysize(default_flags); | 1691 flags_len = arraysize(default_flags); |
| 1678 if (always_true_flags != NULL) { | 1692 if (always_true_flags != NULL || always_false_flags != NULL) { |
| 1679 // Remove always_true_flags from default_flags. | 1693 // Remove always_true/false_flags from default_flags. |
| 1680 CHECK(always_true_flags_len < flags_len); | 1694 CHECK((always_true_flags != NULL) == (always_true_len > 0)); |
| 1681 generated_flags = new ParserFlag[flags_len - always_true_flags_len]; | 1695 CHECK((always_false_flags != NULL) == (always_false_len > 0)); |
| 1696 CHECK(always_true_flags == NULL || always_true_len < flags_len); | |
| 1697 CHECK(always_false_flags == NULL || always_false_len < flags_len); | |
| 1698 generated_flags = | |
| 1699 new ParserFlag[flags_len - always_true_len - always_false_len]; | |
| 1682 int flag_index = 0; | 1700 int flag_index = 0; |
| 1683 for (int i = 0; i < flags_len; ++i) { | 1701 for (int i = 0; i < flags_len; ++i) { |
| 1684 bool use_flag = true; | 1702 bool use_flag = true; |
| 1685 for (int j = 0; j < always_true_flags_len; ++j) { | 1703 for (int j = 0; use_flag && j < always_true_len; ++j) { |
| 1686 if (flags[i] == always_true_flags[j]) { | 1704 if (flags[i] == always_true_flags[j]) use_flag = false; |
| 1687 use_flag = false; | 1705 } |
| 1688 break; | 1706 for (int j = 0; use_flag && j < always_false_len; ++j) { |
| 1689 } | 1707 if (flags[i] == always_false_flags[j]) use_flag = false; |
| 1690 } | 1708 } |
| 1691 if (use_flag) generated_flags[flag_index++] = flags[i]; | 1709 if (use_flag) generated_flags[flag_index++] = flags[i]; |
| 1692 } | 1710 } |
| 1693 CHECK(flag_index == flags_len - always_true_flags_len); | 1711 CHECK(flag_index == flags_len - always_true_len - always_false_len); |
| 1694 flags_len = flag_index; | 1712 flags_len = flag_index; |
| 1695 flags = generated_flags; | 1713 flags = generated_flags; |
| 1696 } | 1714 } |
| 1697 } | 1715 } |
| 1698 for (int i = 0; context_data[i][0] != NULL; ++i) { | 1716 for (int i = 0; context_data[i][0] != NULL; ++i) { |
| 1699 for (int j = 0; statement_data[j] != NULL; ++j) { | 1717 for (int j = 0; statement_data[j] != NULL; ++j) { |
| 1700 int kPrefixLen = i::StrLength(context_data[i][0]); | 1718 int kPrefixLen = i::StrLength(context_data[i][0]); |
| 1701 int kStatementLen = i::StrLength(statement_data[j]); | 1719 int kStatementLen = i::StrLength(statement_data[j]); |
| 1702 int kSuffixLen = i::StrLength(context_data[i][1]); | 1720 int kSuffixLen = i::StrLength(context_data[i][1]); |
| 1703 int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; | 1721 int kProgramSize = kPrefixLen + kStatementLen + kSuffixLen; |
| 1704 | 1722 |
| 1705 // Plug the source code pieces together. | 1723 // Plug the source code pieces together. |
| 1706 i::ScopedVector<char> program(kProgramSize + 1); | 1724 i::ScopedVector<char> program(kProgramSize + 1); |
| 1707 int length = i::SNPrintF(program, | 1725 int length = i::SNPrintF(program, |
| 1708 "%s%s%s", | 1726 "%s%s%s", |
| 1709 context_data[i][0], | 1727 context_data[i][0], |
| 1710 statement_data[j], | 1728 statement_data[j], |
| 1711 context_data[i][1]); | 1729 context_data[i][1]); |
| 1712 CHECK(length == kProgramSize); | 1730 CHECK(length == kProgramSize); |
| 1713 TestParserSync(program.start(), | 1731 TestParserSync(program.start(), |
| 1714 flags, | 1732 flags, |
| 1715 flags_len, | 1733 flags_len, |
| 1716 result, | 1734 result, |
| 1717 always_true_flags, | 1735 always_true_flags, |
| 1718 always_true_flags_len); | 1736 always_true_len, |
| 1737 always_false_flags, | |
| 1738 always_false_len); | |
| 1719 } | 1739 } |
| 1720 } | 1740 } |
| 1721 delete[] generated_flags; | 1741 delete[] generated_flags; |
| 1722 } | 1742 } |
| 1723 | 1743 |
| 1724 | 1744 |
| 1725 TEST(ErrorsEvalAndArguments) { | 1745 TEST(ErrorsEvalAndArguments) { |
| 1726 // Tests that both preparsing and parsing produce the right kind of errors for | 1746 // Tests that both preparsing and parsing produce the right kind of errors for |
| 1727 // using "eval" and "arguments" as identifiers. Without the strict mode, it's | 1747 // using "eval" and "arguments" as identifiers. Without the strict mode, it's |
| 1728 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it | 1748 // ok to use "eval" or "arguments" as identifiers. With the strict mode, it |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1815 "arguments;", | 1835 "arguments;", |
| 1816 "var foo = eval;", | 1836 "var foo = eval;", |
| 1817 "var foo = arguments;", | 1837 "var foo = arguments;", |
| 1818 "var foo = { eval: 1 };", | 1838 "var foo = { eval: 1 };", |
| 1819 "var foo = { arguments: 1 };", | 1839 "var foo = { arguments: 1 };", |
| 1820 "var foo = { }; foo.eval = {};", | 1840 "var foo = { }; foo.eval = {};", |
| 1821 "var foo = { }; foo.arguments = {};", | 1841 "var foo = { }; foo.arguments = {};", |
| 1822 NULL | 1842 NULL |
| 1823 }; | 1843 }; |
| 1824 | 1844 |
| 1825 static const ParserFlag always_flags[] = {kAllowArrowFunctions}; | 1845 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; |
| 1826 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 1846 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 1827 always_flags, arraysize(always_flags)); | 1847 always_flags, arraysize(always_flags)); |
| 1828 } | 1848 } |
| 1829 | 1849 |
| 1830 | 1850 |
| 1831 #define FUTURE_STRICT_RESERVED_WORDS(V) \ | 1851 #define FUTURE_STRICT_RESERVED_WORDS(V) \ |
| 1832 V(implements) \ | 1852 V(implements) \ |
| 1833 V(interface) \ | 1853 V(interface) \ |
| 1834 V(let) \ | 1854 V(let) \ |
| 1835 V(package) \ | 1855 V(package) \ |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 1865 { "function test_func() {\"use strict\"; ", "}"}, | 1885 { "function test_func() {\"use strict\"; ", "}"}, |
| 1866 { "() => { \"use strict\"; ", "}" }, | 1886 { "() => { \"use strict\"; ", "}" }, |
| 1867 { NULL, NULL } | 1887 { NULL, NULL } |
| 1868 }; | 1888 }; |
| 1869 | 1889 |
| 1870 const char* statement_data[] { | 1890 const char* statement_data[] { |
| 1871 FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) | 1891 FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) |
| 1872 NULL | 1892 NULL |
| 1873 }; | 1893 }; |
| 1874 | 1894 |
| 1875 static const ParserFlag always_flags[] = {kAllowArrowFunctions}; | 1895 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; |
| 1876 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, | 1896 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, always_flags, |
| 1877 arraysize(always_flags)); | 1897 arraysize(always_flags)); |
| 1878 | 1898 |
| 1879 static const ParserFlag classes_flags[] = { | 1899 static const ParserFlag classes_flags[] = { |
| 1880 kAllowArrowFunctions, kAllowClasses, kAllowHarmonyScoping}; | 1900 kAllowHarmonyArrowFunctions, kAllowHarmonyClasses, kAllowHarmonyScoping}; |
| 1881 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, | 1901 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, |
| 1882 classes_flags, arraysize(classes_flags)); | 1902 classes_flags, arraysize(classes_flags)); |
| 1883 } | 1903 } |
| 1884 | 1904 |
| 1885 | 1905 |
| 1886 TEST(NoErrorsFutureStrictReservedWords) { | 1906 TEST(NoErrorsFutureStrictReservedWords) { |
| 1887 const char* context_data[][2] = { | 1907 const char* context_data[][2] = { |
| 1888 { "", "" }, | 1908 { "", "" }, |
| 1889 { "function test_func() {", "}"}, | 1909 { "function test_func() {", "}"}, |
| 1890 { "() => {", "}" }, | 1910 { "() => {", "}" }, |
| 1891 { NULL, NULL } | 1911 { NULL, NULL } |
| 1892 }; | 1912 }; |
| 1893 | 1913 |
| 1894 const char* statement_data[] = { | 1914 const char* statement_data[] = { |
| 1895 FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) | 1915 FUTURE_STRICT_RESERVED_WORDS(FUTURE_STRICT_RESERVED_STATEMENTS) |
| 1896 NULL | 1916 NULL |
| 1897 }; | 1917 }; |
| 1898 | 1918 |
| 1899 static const ParserFlag always_flags[] = {kAllowArrowFunctions}; | 1919 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; |
| 1900 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 1920 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 1901 always_flags, arraysize(always_flags)); | 1921 always_flags, arraysize(always_flags)); |
| 1902 | 1922 |
| 1903 static const ParserFlag classes_flags[] = { | 1923 static const ParserFlag classes_flags[] = { |
| 1904 kAllowArrowFunctions, kAllowClasses, kAllowHarmonyScoping}; | 1924 kAllowHarmonyArrowFunctions, kAllowHarmonyClasses, kAllowHarmonyScoping}; |
| 1905 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 1925 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 1906 classes_flags, arraysize(classes_flags)); | 1926 classes_flags, arraysize(classes_flags)); |
| 1907 } | 1927 } |
| 1908 | 1928 |
| 1909 | 1929 |
| 1910 TEST(ErrorsReservedWords) { | 1930 TEST(ErrorsReservedWords) { |
| 1911 // Tests that both preparsing and parsing produce the right kind of errors for | 1931 // Tests that both preparsing and parsing produce the right kind of errors for |
| 1912 // using future reserved words as identifiers. These tests don't depend on the | 1932 // using future reserved words as identifiers. These tests don't depend on the |
| 1913 // strict mode. | 1933 // strict mode. |
| 1914 const char* context_data[][2] = { | 1934 const char* context_data[][2] = { |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2307 { NULL, NULL } | 2327 { NULL, NULL } |
| 2308 }; | 2328 }; |
| 2309 | 2329 |
| 2310 const char* statement_data[] = { | 2330 const char* statement_data[] = { |
| 2311 "mylabel: while(true) { break mylabel; }", | 2331 "mylabel: while(true) { break mylabel; }", |
| 2312 "eval: while(true) { break eval; }", | 2332 "eval: while(true) { break eval; }", |
| 2313 "arguments: while(true) { break arguments; }", | 2333 "arguments: while(true) { break arguments; }", |
| 2314 NULL | 2334 NULL |
| 2315 }; | 2335 }; |
| 2316 | 2336 |
| 2317 static const ParserFlag always_flags[] = {kAllowArrowFunctions}; | 2337 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; |
| 2318 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 2338 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 2319 always_flags, arraysize(always_flags)); | 2339 always_flags, arraysize(always_flags)); |
| 2320 } | 2340 } |
| 2321 | 2341 |
| 2322 | 2342 |
| 2323 TEST(NoErrorsFutureStrictReservedAsLabelsSloppy) { | 2343 TEST(NoErrorsFutureStrictReservedAsLabelsSloppy) { |
| 2324 const char* context_data[][2] = { | 2344 const char* context_data[][2] = { |
| 2325 { "", ""}, | 2345 { "", ""}, |
| 2326 { "function test_func() {", "}" }, | 2346 { "function test_func() {", "}" }, |
| 2327 { "() => {", "}" }, | 2347 { "() => {", "}" }, |
| 2328 { NULL, NULL } | 2348 { NULL, NULL } |
| 2329 }; | 2349 }; |
| 2330 | 2350 |
| 2331 #define LABELLED_WHILE(NAME) #NAME ": while (true) { break " #NAME "; }", | 2351 #define LABELLED_WHILE(NAME) #NAME ": while (true) { break " #NAME "; }", |
| 2332 const char* statement_data[] { | 2352 const char* statement_data[] { |
| 2333 FUTURE_STRICT_RESERVED_WORDS(LABELLED_WHILE) | 2353 FUTURE_STRICT_RESERVED_WORDS(LABELLED_WHILE) |
| 2334 NULL | 2354 NULL |
| 2335 }; | 2355 }; |
| 2336 #undef LABELLED_WHILE | 2356 #undef LABELLED_WHILE |
| 2337 | 2357 |
| 2338 static const ParserFlag always_flags[] = {kAllowArrowFunctions}; | 2358 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; |
| 2339 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 2359 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 2340 always_flags, arraysize(always_flags)); | 2360 always_flags, arraysize(always_flags)); |
| 2341 } | 2361 } |
| 2342 | 2362 |
| 2343 | 2363 |
| 2344 TEST(ErrorsParenthesizedLabels) { | 2364 TEST(ErrorsParenthesizedLabels) { |
| 2345 // Parenthesized identifiers shouldn't be recognized as labels. | 2365 // Parenthesized identifiers shouldn't be recognized as labels. |
| 2346 const char* context_data[][2] = { | 2366 const char* context_data[][2] = { |
| 2347 { "", ""}, | 2367 { "", ""}, |
| 2348 { "function test_func() {", "}" }, | 2368 { "function test_func() {", "}" }, |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2580 const char* context_data[][2] = { | 2600 const char* context_data[][2] = { |
| 2581 {"", ""}, | 2601 {"", ""}, |
| 2582 { NULL, NULL } | 2602 { NULL, NULL } |
| 2583 }; | 2603 }; |
| 2584 | 2604 |
| 2585 const char* statement_data[] = { | 2605 const char* statement_data[] = { |
| 2586 "%someintrinsic(arg)", | 2606 "%someintrinsic(arg)", |
| 2587 NULL | 2607 NULL |
| 2588 }; | 2608 }; |
| 2589 | 2609 |
| 2590 // This test requires kAllowNativesSyntax to succeed. | 2610 // This test requires kAllowNatives to succeed. |
| 2591 static const ParserFlag always_true_flags[] = { | 2611 static const ParserFlag always_true_flags[] = { |
| 2592 kAllowNativesSyntax | 2612 kAllowNatives |
| 2593 }; | 2613 }; |
| 2594 | 2614 |
| 2595 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 2615 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 2596 always_true_flags, 1); | 2616 always_true_flags, 1); |
| 2597 } | 2617 } |
| 2598 | 2618 |
| 2599 | 2619 |
| 2600 TEST(NoErrorsNewExpression) { | 2620 TEST(NoErrorsNewExpression) { |
| 2601 const char* context_data[][2] = { | 2621 const char* context_data[][2] = { |
| 2602 {"", ""}, | 2622 {"", ""}, |
| (...skipping 864 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3467 "(a = b, c) => {}", | 3487 "(a = b, c) => {}", |
| 3468 "(a, b = c) => {}", | 3488 "(a, b = c) => {}", |
| 3469 "(foo ? bar : baz) => {}", | 3489 "(foo ? bar : baz) => {}", |
| 3470 "(a, foo ? bar : baz) => {}", | 3490 "(a, foo ? bar : baz) => {}", |
| 3471 "(foo ? bar : baz, a) => {}", | 3491 "(foo ? bar : baz, a) => {}", |
| 3472 NULL | 3492 NULL |
| 3473 }; | 3493 }; |
| 3474 | 3494 |
| 3475 // The test is quite slow, so run it with a reduced set of flags. | 3495 // The test is quite slow, so run it with a reduced set of flags. |
| 3476 static const ParserFlag flags[] = {kAllowLazy, kAllowHarmonyScoping}; | 3496 static const ParserFlag flags[] = {kAllowLazy, kAllowHarmonyScoping}; |
| 3477 static const ParserFlag always_flags[] = { kAllowArrowFunctions }; | 3497 static const ParserFlag always_flags[] = { kAllowHarmonyArrowFunctions }; |
| 3478 RunParserSyncTest(context_data, statement_data, kError, flags, | 3498 RunParserSyncTest(context_data, statement_data, kError, flags, |
| 3479 arraysize(flags), always_flags, arraysize(always_flags)); | 3499 arraysize(flags), always_flags, arraysize(always_flags)); |
| 3480 } | 3500 } |
| 3481 | 3501 |
| 3482 | 3502 |
| 3483 TEST(NoErrorsArrowFunctions) { | 3503 TEST(NoErrorsArrowFunctions) { |
| 3484 // Tests that parser and preparser accept valid arrow functions syntax. | 3504 // Tests that parser and preparser accept valid arrow functions syntax. |
| 3485 const char* context_data[][2] = { | 3505 const char* context_data[][2] = { |
| 3486 {"", ";"}, | 3506 {"", ";"}, |
| 3487 {"bar ? (", ") : baz;"}, | 3507 {"bar ? (", ") : baz;"}, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3521 "(a, b) => 0, (c, d) => 1", | 3541 "(a, b) => 0, (c, d) => 1", |
| 3522 "(a, b => {}, a => a + 1)", | 3542 "(a, b => {}, a => a + 1)", |
| 3523 "((a, b) => {}, (a => a + 1))", | 3543 "((a, b) => {}, (a => a + 1))", |
| 3524 "(a, (a, (b, c) => 0))", | 3544 "(a, (a, (b, c) => 0))", |
| 3525 | 3545 |
| 3526 // Arrow has more precedence, this is the same as: foo ? bar : (baz = {}) | 3546 // Arrow has more precedence, this is the same as: foo ? bar : (baz = {}) |
| 3527 "foo ? bar : baz => {}", | 3547 "foo ? bar : baz => {}", |
| 3528 NULL | 3548 NULL |
| 3529 }; | 3549 }; |
| 3530 | 3550 |
| 3531 static const ParserFlag always_flags[] = {kAllowArrowFunctions}; | 3551 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; |
| 3532 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 3552 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 3533 always_flags, arraysize(always_flags)); | 3553 always_flags, arraysize(always_flags)); |
| 3534 } | 3554 } |
| 3535 | 3555 |
| 3536 | 3556 |
| 3537 TEST(NoErrorsSuper) { | 3557 TEST(NoErrorsSuper) { |
| 3538 // Tests that parser and preparser accept 'super' keyword in right places. | 3558 // Tests that parser and preparser accept 'super' keyword in right places. |
| 3539 const char* context_data[][2] = {{"", ";"}, | 3559 const char* context_data[][2] = {{"", ";"}, |
| 3540 {"k = ", ";"}, | 3560 {"k = ", ";"}, |
| 3541 {"foo(", ");"}, | 3561 {"foo(", ");"}, |
| 3542 {NULL, NULL}}; | 3562 {NULL, NULL}}; |
| 3543 | 3563 |
| 3544 const char* statement_data[] = { | 3564 const char* statement_data[] = { |
| 3545 "super.x", | 3565 "super.x", |
| 3546 "super[27]", | 3566 "super[27]", |
| 3547 "new super", | 3567 "new super", |
| 3548 "new super()", | 3568 "new super()", |
| 3549 "new super(12, 45)", | 3569 "new super(12, 45)", |
| 3550 "new new super", | 3570 "new new super", |
| 3551 "new new super()", | 3571 "new new super()", |
| 3552 "new new super()()", | 3572 "new new super()()", |
| 3553 "z.super", // Ok, property lookup. | 3573 "z.super", // Ok, property lookup. |
| 3554 NULL}; | 3574 NULL}; |
| 3555 | 3575 |
| 3556 static const ParserFlag always_flags[] = {kAllowClasses}; | 3576 static const ParserFlag always_flags[] = {kAllowHarmonyClasses}; |
| 3557 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 3577 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 3558 always_flags, arraysize(always_flags)); | 3578 always_flags, arraysize(always_flags)); |
| 3559 } | 3579 } |
| 3560 | 3580 |
| 3561 | 3581 |
| 3562 TEST(ErrorsSuper) { | 3582 TEST(ErrorsSuper) { |
| 3563 // Tests that parser and preparser generate same errors for 'super'. | 3583 // Tests that parser and preparser generate same errors for 'super'. |
| 3564 const char* context_data[][2] = {{"", ";"}, | 3584 const char* context_data[][2] = {{"", ";"}, |
| 3565 {"k = ", ";"}, | 3585 {"k = ", ";"}, |
| 3566 {"foo(", ");"}, | 3586 {"foo(", ");"}, |
| 3567 {NULL, NULL}}; | 3587 {NULL, NULL}}; |
| 3568 | 3588 |
| 3569 const char* statement_data[] = { | 3589 const char* statement_data[] = { |
| 3570 "super = x", | 3590 "super = x", |
| 3571 "y = super", | 3591 "y = super", |
| 3572 "f(super)", | 3592 "f(super)", |
| 3573 NULL}; | 3593 NULL}; |
| 3574 | 3594 |
| 3575 static const ParserFlag always_flags[] = {kAllowClasses}; | 3595 static const ParserFlag always_flags[] = {kAllowHarmonyClasses}; |
| 3576 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, | 3596 RunParserSyncTest(context_data, statement_data, kError, NULL, 0, |
| 3577 always_flags, arraysize(always_flags)); | 3597 always_flags, arraysize(always_flags)); |
| 3578 } | 3598 } |
| 3579 | 3599 |
| 3580 | 3600 |
| 3581 TEST(NoErrorsMethodDefinition) { | 3601 TEST(NoErrorsMethodDefinition) { |
| 3582 const char* context_data[][2] = {{"({", "});"}, | 3602 const char* context_data[][2] = {{"({", "});"}, |
| 3583 {"'use strict'; ({", "});"}, | 3603 {"'use strict'; ({", "});"}, |
| 3584 {"({*", "});"}, | 3604 {"({*", "});"}, |
| 3585 {"'use strict'; ({*", "});"}, | 3605 {"'use strict'; ({*", "});"}, |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3748 "class extends F {}", | 3768 "class extends F {}", |
| 3749 "class name extends F {}", | 3769 "class name extends F {}", |
| 3750 "class extends (F, G) {}", | 3770 "class extends (F, G) {}", |
| 3751 "class name extends (F, G) {}", | 3771 "class name extends (F, G) {}", |
| 3752 "class extends class {} {}", | 3772 "class extends class {} {}", |
| 3753 "class name extends class {} {}", | 3773 "class name extends class {} {}", |
| 3754 "class extends class base {} {}", | 3774 "class extends class base {} {}", |
| 3755 "class name extends class base {} {}", | 3775 "class name extends class base {} {}", |
| 3756 NULL}; | 3776 NULL}; |
| 3757 | 3777 |
| 3758 static const ParserFlag always_flags[] = {kAllowClasses}; | 3778 static const ParserFlag always_flags[] = { |
| 3779 kAllowHarmonyClasses, kAllowHarmonySloppy}; | |
| 3759 RunParserSyncTest(context_data, class_data, kSuccess, NULL, 0, | 3780 RunParserSyncTest(context_data, class_data, kSuccess, NULL, 0, |
| 3760 always_flags, arraysize(always_flags)); | 3781 always_flags, arraysize(always_flags)); |
| 3761 } | 3782 } |
| 3762 | 3783 |
| 3763 | 3784 |
| 3764 TEST(ClassDeclarationNoErrors) { | 3785 TEST(ClassDeclarationNoErrors) { |
| 3765 const char* context_data[][2] = {{"", ""}, | 3786 const char* context_data[][2] = {{"", ""}, |
| 3766 {"{", "}"}, | 3787 {"{", "}"}, |
| 3767 {"if (true) {", "}"}, | 3788 {"if (true) {", "}"}, |
| 3768 {NULL, NULL}}; | 3789 {NULL, NULL}}; |
| 3769 const char* statement_data[] = { | 3790 const char* statement_data[] = { |
| 3770 "class name {}", | 3791 "class name {}", |
| 3771 "class name extends F {}", | 3792 "class name extends F {}", |
| 3772 "class name extends (F, G) {}", | 3793 "class name extends (F, G) {}", |
| 3773 "class name extends class {} {}", | 3794 "class name extends class {} {}", |
| 3774 "class name extends class base {} {}", | 3795 "class name extends class base {} {}", |
| 3775 NULL}; | 3796 NULL}; |
| 3776 | 3797 |
| 3777 static const ParserFlag always_flags[] = {kAllowClasses}; | 3798 static const ParserFlag always_flags[] = { |
| 3799 kAllowHarmonyClasses, kAllowHarmonySloppy}; | |
| 3778 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, | 3800 RunParserSyncTest(context_data, statement_data, kSuccess, NULL, 0, |
| 3779 always_flags, arraysize(always_flags)); | 3801 always_flags, arraysize(always_flags)); |
| 3780 } | 3802 } |
| 3781 | 3803 |
| 3782 | 3804 |
| 3783 TEST(ClassBodyNoErrors) { | 3805 TEST(ClassBodyNoErrors) { |
| 3784 // Tests that parser and preparser accept valid class syntax. | 3806 // Tests that parser and preparser accept valid class syntax. |
| 3785 const char* context_data[][2] = {{"(class {", "});"}, | 3807 const char* context_data[][2] = {{"(class {", "});"}, |
| 3786 {"(class extends Base {", "});"}, | 3808 {"(class extends Base {", "});"}, |
| 3787 {"class C {", "}"}, | 3809 {"class C {", "}"}, |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 3811 "static static() {}", | 3833 "static static() {}", |
| 3812 "static get static() {}", | 3834 "static get static() {}", |
| 3813 "static set static(v) {}", | 3835 "static set static(v) {}", |
| 3814 "*static() {}", | 3836 "*static() {}", |
| 3815 "*get() {}", | 3837 "*get() {}", |
| 3816 "*set() {}", | 3838 "*set() {}", |
| 3817 "static *g() {}", | 3839 "static *g() {}", |
| 3818 NULL}; | 3840 NULL}; |
| 3819 | 3841 |
| 3820 static const ParserFlag always_flags[] = { | 3842 static const ParserFlag always_flags[] = { |
| 3821 kAllowClasses, | 3843 kAllowHarmonyClasses, |
| 3822 kAllowHarmonyObjectLiterals | 3844 kAllowHarmonyObjectLiterals, |
| 3845 kAllowHarmonySloppy | |
| 3823 }; | 3846 }; |
| 3824 RunParserSyncTest(context_data, class_body_data, kSuccess, NULL, 0, | 3847 RunParserSyncTest(context_data, class_body_data, kSuccess, NULL, 0, |
| 3825 always_flags, arraysize(always_flags)); | 3848 always_flags, arraysize(always_flags)); |
| 3826 } | 3849 } |
| 3827 | 3850 |
| 3828 | 3851 |
| 3829 TEST(ClassPropertyNameNoErrors) { | 3852 TEST(ClassPropertyNameNoErrors) { |
| 3830 const char* context_data[][2] = {{"(class {", "() {}});"}, | 3853 const char* context_data[][2] = {{"(class {", "() {}});"}, |
| 3831 {"(class { get ", "() {}});"}, | 3854 {"(class { get ", "() {}});"}, |
| 3832 {"(class { set ", "(v) {}});"}, | 3855 {"(class { set ", "(v) {}});"}, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3869 "else", | 3892 "else", |
| 3870 "for", | 3893 "for", |
| 3871 "while", | 3894 "while", |
| 3872 "do", | 3895 "do", |
| 3873 "try", | 3896 "try", |
| 3874 "catch", | 3897 "catch", |
| 3875 "finally", | 3898 "finally", |
| 3876 NULL}; | 3899 NULL}; |
| 3877 | 3900 |
| 3878 static const ParserFlag always_flags[] = { | 3901 static const ParserFlag always_flags[] = { |
| 3879 kAllowClasses, | 3902 kAllowHarmonyClasses, |
| 3880 kAllowHarmonyObjectLiterals | 3903 kAllowHarmonyObjectLiterals, |
| 3904 kAllowHarmonySloppy | |
| 3881 }; | 3905 }; |
| 3882 RunParserSyncTest(context_data, name_data, kSuccess, NULL, 0, | 3906 RunParserSyncTest(context_data, name_data, kSuccess, NULL, 0, |
| 3883 always_flags, arraysize(always_flags)); | 3907 always_flags, arraysize(always_flags)); |
| 3884 } | 3908 } |
| 3885 | 3909 |
| 3886 | 3910 |
| 3887 TEST(ClassExpressionErrors) { | 3911 TEST(ClassExpressionErrors) { |
| 3888 const char* context_data[][2] = {{"(", ");"}, | 3912 const char* context_data[][2] = {{"(", ");"}, |
| 3889 {"var C = ", ";"}, | 3913 {"var C = ", ";"}, |
| 3890 {"bar, ", ";"}, | 3914 {"bar, ", ";"}, |
| 3891 {NULL, NULL}}; | 3915 {NULL, NULL}}; |
| 3892 const char* class_data[] = { | 3916 const char* class_data[] = { |
| 3893 "class", | 3917 "class", |
| 3894 "class name", | 3918 "class name", |
| 3895 "class name extends", | 3919 "class name extends", |
| 3896 "class extends", | 3920 "class extends", |
| 3897 "class {", | 3921 "class {", |
| 3898 "class { m }", | 3922 "class { m }", |
| 3899 "class { m; n }", | 3923 "class { m; n }", |
| 3900 "class { m: 1 }", | 3924 "class { m: 1 }", |
| 3901 "class { m(); n() }", | 3925 "class { m(); n() }", |
| 3902 "class { get m }", | 3926 "class { get m }", |
| 3903 "class { get m() }", | 3927 "class { get m() }", |
| 3904 "class { get m() { }", | 3928 "class { get m() { }", |
| 3905 "class { set m() {} }", // Missing required parameter. | 3929 "class { set m() {} }", // Missing required parameter. |
| 3906 "class { m() {}, n() {} }", // No commas allowed. | 3930 "class { m() {}, n() {} }", // No commas allowed. |
| 3907 NULL}; | 3931 NULL}; |
| 3908 | 3932 |
| 3909 static const ParserFlag always_flags[] = { | 3933 static const ParserFlag always_flags[] = { |
| 3910 kAllowClasses, | 3934 kAllowHarmonyClasses, |
| 3911 kAllowHarmonyObjectLiterals | 3935 kAllowHarmonyObjectLiterals, |
| 3936 kAllowHarmonySloppy | |
| 3912 }; | 3937 }; |
| 3913 RunParserSyncTest(context_data, class_data, kError, NULL, 0, | 3938 RunParserSyncTest(context_data, class_data, kError, NULL, 0, |
| 3914 always_flags, arraysize(always_flags)); | 3939 always_flags, arraysize(always_flags)); |
| 3915 } | 3940 } |
| 3916 | 3941 |
| 3917 | 3942 |
| 3918 TEST(ClassDeclarationErrors) { | 3943 TEST(ClassDeclarationErrors) { |
| 3919 const char* context_data[][2] = {{"", ""}, | 3944 const char* context_data[][2] = {{"", ""}, |
| 3920 {"{", "}"}, | 3945 {"{", "}"}, |
| 3921 {"if (true) {", "}"}, | 3946 {"if (true) {", "}"}, |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 3937 "class extends base {}", | 3962 "class extends base {}", |
| 3938 "class name { *", | 3963 "class name { *", |
| 3939 "class name { * }", | 3964 "class name { * }", |
| 3940 "class name { *; }", | 3965 "class name { *; }", |
| 3941 "class name { *get x() {} }", | 3966 "class name { *get x() {} }", |
| 3942 "class name { *set x(_) {} }", | 3967 "class name { *set x(_) {} }", |
| 3943 "class name { *static m() {} }", | 3968 "class name { *static m() {} }", |
| 3944 NULL}; | 3969 NULL}; |
| 3945 | 3970 |
| 3946 static const ParserFlag always_flags[] = { | 3971 static const ParserFlag always_flags[] = { |
| 3947 kAllowClasses, | 3972 kAllowHarmonyClasses, |
| 3948 kAllowHarmonyNumericLiterals | 3973 kAllowHarmonyNumericLiterals, |
| 3974 kAllowHarmonySloppy | |
| 3949 }; | 3975 }; |
| 3950 RunParserSyncTest(context_data, class_data, kError, NULL, 0, | 3976 RunParserSyncTest(context_data, class_data, kError, NULL, 0, |
| 3951 always_flags, arraysize(always_flags)); | 3977 always_flags, arraysize(always_flags)); |
| 3952 } | 3978 } |
| 3953 | 3979 |
| 3954 | 3980 |
| 3955 TEST(ClassNameErrors) { | 3981 TEST(ClassNameErrors) { |
| 3956 const char* context_data[][2] = {{"class ", "{}"}, | 3982 const char* context_data[][2] = {{"class ", "{}"}, |
| 3957 {"(class ", "{});"}, | 3983 {"(class ", "{});"}, |
| 3958 {"'use strict'; class ", "{}"}, | 3984 {"'use strict'; class ", "{}"}, |
| 3959 {"'use strict'; (class ", "{});"}, | 3985 {"'use strict'; (class ", "{});"}, |
| 3960 {NULL, NULL}}; | 3986 {NULL, NULL}}; |
| 3961 const char* class_name[] = { | 3987 const char* class_name[] = { |
| 3962 "arguments", | 3988 "arguments", |
| 3963 "eval", | 3989 "eval", |
| 3964 "implements", | 3990 "implements", |
| 3965 "interface", | 3991 "interface", |
| 3966 "let", | 3992 "let", |
| 3967 "package", | 3993 "package", |
| 3968 "private", | 3994 "private", |
| 3969 "protected", | 3995 "protected", |
| 3970 "public", | 3996 "public", |
| 3971 "static", | 3997 "static", |
| 3972 "var", | 3998 "var", |
| 3973 "yield", | 3999 "yield", |
| 3974 NULL}; | 4000 NULL}; |
| 3975 | 4001 |
| 3976 static const ParserFlag always_flags[] = { | 4002 static const ParserFlag always_flags[] = { |
| 3977 kAllowClasses, | 4003 kAllowHarmonyClasses, |
| 3978 kAllowHarmonyObjectLiterals | 4004 kAllowHarmonyObjectLiterals, |
| 4005 kAllowHarmonySloppy | |
| 3979 }; | 4006 }; |
| 3980 RunParserSyncTest(context_data, class_name, kError, NULL, 0, | 4007 RunParserSyncTest(context_data, class_name, kError, NULL, 0, |
| 3981 always_flags, arraysize(always_flags)); | 4008 always_flags, arraysize(always_flags)); |
| 3982 } | 4009 } |
| 3983 | 4010 |
| 3984 | 4011 |
| 3985 TEST(ClassGetterParamNameErrors) { | 4012 TEST(ClassGetterParamNameErrors) { |
| 3986 const char* context_data[][2] = { | 4013 const char* context_data[][2] = { |
| 3987 {"class C { get name(", ") {} }"}, | 4014 {"class C { get name(", ") {} }"}, |
| 3988 {"(class { get name(", ") {} });"}, | 4015 {"(class { get name(", ") {} });"}, |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 4000 "package", | 4027 "package", |
| 4001 "private", | 4028 "private", |
| 4002 "protected", | 4029 "protected", |
| 4003 "public", | 4030 "public", |
| 4004 "static", | 4031 "static", |
| 4005 "var", | 4032 "var", |
| 4006 "yield", | 4033 "yield", |
| 4007 NULL}; | 4034 NULL}; |
| 4008 | 4035 |
| 4009 static const ParserFlag always_flags[] = { | 4036 static const ParserFlag always_flags[] = { |
| 4010 kAllowClasses, | 4037 kAllowHarmonyClasses, |
| 4011 kAllowHarmonyObjectLiterals | 4038 kAllowHarmonyObjectLiterals, |
| 4039 kAllowHarmonySloppy | |
| 4012 }; | 4040 }; |
| 4013 RunParserSyncTest(context_data, class_name, kError, NULL, 0, | 4041 RunParserSyncTest(context_data, class_name, kError, NULL, 0, |
| 4014 always_flags, arraysize(always_flags)); | 4042 always_flags, arraysize(always_flags)); |
| 4015 } | 4043 } |
| 4016 | 4044 |
| 4017 | 4045 |
| 4018 TEST(ClassStaticPrototypeErrors) { | 4046 TEST(ClassStaticPrototypeErrors) { |
| 4019 const char* context_data[][2] = {{"class C {", "}"}, | 4047 const char* context_data[][2] = {{"class C {", "}"}, |
| 4020 {"(class {", "});"}, | 4048 {"(class {", "});"}, |
| 4021 {NULL, NULL}}; | 4049 {NULL, NULL}}; |
| 4022 | 4050 |
| 4023 const char* class_body_data[] = { | 4051 const char* class_body_data[] = { |
| 4024 "static prototype() {}", | 4052 "static prototype() {}", |
| 4025 "static get prototype() {}", | 4053 "static get prototype() {}", |
| 4026 "static set prototype(_) {}", | 4054 "static set prototype(_) {}", |
| 4027 "static *prototype() {}", | 4055 "static *prototype() {}", |
| 4028 "static 'prototype'() {}", | 4056 "static 'prototype'() {}", |
| 4029 "static *'prototype'() {}", | 4057 "static *'prototype'() {}", |
| 4030 "static prot\\u006ftype() {}", | 4058 "static prot\\u006ftype() {}", |
| 4031 "static 'prot\\u006ftype'() {}", | 4059 "static 'prot\\u006ftype'() {}", |
| 4032 "static get 'prot\\u006ftype'() {}", | 4060 "static get 'prot\\u006ftype'() {}", |
| 4033 "static set 'prot\\u006ftype'(_) {}", | 4061 "static set 'prot\\u006ftype'(_) {}", |
| 4034 "static *'prot\\u006ftype'() {}", | 4062 "static *'prot\\u006ftype'() {}", |
| 4035 NULL}; | 4063 NULL}; |
| 4036 | 4064 |
| 4037 static const ParserFlag always_flags[] = { | 4065 static const ParserFlag always_flags[] = { |
| 4038 kAllowClasses, | 4066 kAllowHarmonyClasses, |
| 4039 kAllowHarmonyObjectLiterals | 4067 kAllowHarmonyObjectLiterals, |
| 4068 kAllowHarmonySloppy | |
| 4040 }; | 4069 }; |
| 4041 RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, | 4070 RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, |
| 4042 always_flags, arraysize(always_flags)); | 4071 always_flags, arraysize(always_flags)); |
| 4043 } | 4072 } |
| 4044 | 4073 |
| 4045 | 4074 |
| 4046 TEST(ClassSpecialConstructorErrors) { | 4075 TEST(ClassSpecialConstructorErrors) { |
| 4047 const char* context_data[][2] = {{"class C {", "}"}, | 4076 const char* context_data[][2] = {{"class C {", "}"}, |
| 4048 {"(class {", "});"}, | 4077 {"(class {", "});"}, |
| 4049 {NULL, NULL}}; | 4078 {NULL, NULL}}; |
| 4050 | 4079 |
| 4051 const char* class_body_data[] = { | 4080 const char* class_body_data[] = { |
| 4052 "get constructor() {}", | 4081 "get constructor() {}", |
| 4053 "get constructor(_) {}", | 4082 "get constructor(_) {}", |
| 4054 "*constructor() {}", | 4083 "*constructor() {}", |
| 4055 "get 'constructor'() {}", | 4084 "get 'constructor'() {}", |
| 4056 "*'constructor'() {}", | 4085 "*'constructor'() {}", |
| 4057 "get c\\u006fnstructor() {}", | 4086 "get c\\u006fnstructor() {}", |
| 4058 "*c\\u006fnstructor() {}", | 4087 "*c\\u006fnstructor() {}", |
| 4059 "get 'c\\u006fnstructor'() {}", | 4088 "get 'c\\u006fnstructor'() {}", |
| 4060 "get 'c\\u006fnstructor'(_) {}", | 4089 "get 'c\\u006fnstructor'(_) {}", |
| 4061 "*'c\\u006fnstructor'() {}", | 4090 "*'c\\u006fnstructor'() {}", |
| 4062 NULL}; | 4091 NULL}; |
| 4063 | 4092 |
| 4064 static const ParserFlag always_flags[] = { | 4093 static const ParserFlag always_flags[] = { |
| 4065 kAllowClasses, | 4094 kAllowHarmonyClasses, |
| 4066 kAllowHarmonyObjectLiterals | 4095 kAllowHarmonyObjectLiterals, |
| 4096 kAllowHarmonySloppy | |
| 4067 }; | 4097 }; |
| 4068 RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, | 4098 RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, |
| 4069 always_flags, arraysize(always_flags)); | 4099 always_flags, arraysize(always_flags)); |
| 4070 } | 4100 } |
| 4071 | 4101 |
| 4072 | 4102 |
| 4073 TEST(ClassConstructorNoErrors) { | 4103 TEST(ClassConstructorNoErrors) { |
| 4074 const char* context_data[][2] = {{"class C {", "}"}, | 4104 const char* context_data[][2] = {{"class C {", "}"}, |
| 4075 {"(class {", "});"}, | 4105 {"(class {", "});"}, |
| 4076 {NULL, NULL}}; | 4106 {NULL, NULL}}; |
| 4077 | 4107 |
| 4078 const char* class_body_data[] = { | 4108 const char* class_body_data[] = { |
| 4079 "constructor() {}", | 4109 "constructor() {}", |
| 4080 "static constructor() {}", | 4110 "static constructor() {}", |
| 4081 "static get constructor() {}", | 4111 "static get constructor() {}", |
| 4082 "static set constructor(_) {}", | 4112 "static set constructor(_) {}", |
| 4083 "static *constructor() {}", | 4113 "static *constructor() {}", |
| 4084 NULL}; | 4114 NULL}; |
| 4085 | 4115 |
| 4086 static const ParserFlag always_flags[] = { | 4116 static const ParserFlag always_flags[] = { |
| 4087 kAllowClasses, | 4117 kAllowHarmonyClasses, |
| 4088 kAllowHarmonyObjectLiterals | 4118 kAllowHarmonyObjectLiterals, |
| 4119 kAllowHarmonySloppy | |
| 4089 }; | 4120 }; |
| 4090 RunParserSyncTest(context_data, class_body_data, kSuccess, NULL, 0, | 4121 RunParserSyncTest(context_data, class_body_data, kSuccess, NULL, 0, |
| 4091 always_flags, arraysize(always_flags)); | 4122 always_flags, arraysize(always_flags)); |
| 4092 } | 4123 } |
| 4093 | 4124 |
| 4094 | 4125 |
| 4095 TEST(ClassMultipleConstructorErrors) { | 4126 TEST(ClassMultipleConstructorErrors) { |
| 4096 const char* context_data[][2] = {{"class C {", "}"}, | 4127 const char* context_data[][2] = {{"class C {", "}"}, |
| 4097 {"(class {", "});"}, | 4128 {"(class {", "});"}, |
| 4098 {NULL, NULL}}; | 4129 {NULL, NULL}}; |
| 4099 | 4130 |
| 4100 const char* class_body_data[] = { | 4131 const char* class_body_data[] = { |
| 4101 "constructor() {}; constructor() {}", | 4132 "constructor() {}; constructor() {}", |
| 4102 NULL}; | 4133 NULL}; |
| 4103 | 4134 |
| 4104 static const ParserFlag always_flags[] = { | 4135 static const ParserFlag always_flags[] = { |
| 4105 kAllowClasses, | 4136 kAllowHarmonyClasses, |
| 4106 kAllowHarmonyObjectLiterals | 4137 kAllowHarmonyObjectLiterals, |
| 4138 kAllowHarmonySloppy | |
| 4107 }; | 4139 }; |
| 4108 RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, | 4140 RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, |
| 4109 always_flags, arraysize(always_flags)); | 4141 always_flags, arraysize(always_flags)); |
| 4110 } | 4142 } |
| 4111 | 4143 |
| 4112 | 4144 |
| 4113 TEST(ClassMultiplePropertyNamesNoErrors) { | 4145 TEST(ClassMultiplePropertyNamesNoErrors) { |
| 4114 const char* context_data[][2] = {{"class C {", "}"}, | 4146 const char* context_data[][2] = {{"class C {", "}"}, |
| 4115 {"(class {", "});"}, | 4147 {"(class {", "});"}, |
| 4116 {NULL, NULL}}; | 4148 {NULL, NULL}}; |
| 4117 | 4149 |
| 4118 const char* class_body_data[] = { | 4150 const char* class_body_data[] = { |
| 4119 "constructor() {}; static constructor() {}", | 4151 "constructor() {}; static constructor() {}", |
| 4120 "m() {}; static m() {}", | 4152 "m() {}; static m() {}", |
| 4121 "m() {}; m() {}", | 4153 "m() {}; m() {}", |
| 4122 "static m() {}; static m() {}", | 4154 "static m() {}; static m() {}", |
| 4123 "get m() {}; set m(_) {}; get m() {}; set m(_) {};", | 4155 "get m() {}; set m(_) {}; get m() {}; set m(_) {};", |
| 4124 NULL}; | 4156 NULL}; |
| 4125 | 4157 |
| 4126 static const ParserFlag always_flags[] = { | 4158 static const ParserFlag always_flags[] = { |
| 4127 kAllowClasses, | 4159 kAllowHarmonyClasses, |
| 4128 kAllowHarmonyObjectLiterals | 4160 kAllowHarmonyObjectLiterals, |
| 4161 kAllowHarmonySloppy | |
| 4129 }; | 4162 }; |
| 4130 RunParserSyncTest(context_data, class_body_data, kSuccess, NULL, 0, | 4163 RunParserSyncTest(context_data, class_body_data, kSuccess, NULL, 0, |
| 4131 always_flags, arraysize(always_flags)); | 4164 always_flags, arraysize(always_flags)); |
| 4132 } | 4165 } |
| 4133 | 4166 |
| 4134 | 4167 |
| 4135 TEST(ClassesAreStrictErrors) { | 4168 TEST(ClassesAreStrictErrors) { |
| 4136 const char* context_data[][2] = {{"", ""}, | 4169 const char* context_data[][2] = {{"", ""}, |
| 4137 {"(", ");"}, | 4170 {"(", ");"}, |
| 4138 {NULL, NULL}}; | 4171 {NULL, NULL}}; |
| 4139 | 4172 |
| 4140 const char* class_body_data[] = { | 4173 const char* class_body_data[] = { |
| 4141 "class C { method() { with ({}) {} } }", | 4174 "class C { method() { with ({}) {} } }", |
| 4142 "class C extends function() { with ({}) {} } {}", | 4175 "class C extends function() { with ({}) {} } {}", |
| 4143 "class C { *method() { with ({}) {} } }", | 4176 "class C { *method() { with ({}) {} } }", |
| 4144 NULL}; | 4177 NULL}; |
| 4145 | 4178 |
| 4146 static const ParserFlag always_flags[] = { | 4179 static const ParserFlag always_flags[] = { |
| 4147 kAllowClasses, | 4180 kAllowHarmonyClasses, |
| 4148 kAllowHarmonyObjectLiterals | 4181 kAllowHarmonyObjectLiterals, |
| 4182 kAllowHarmonySloppy | |
| 4149 }; | 4183 }; |
| 4150 RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, | 4184 RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, |
| 4151 always_flags, arraysize(always_flags)); | 4185 always_flags, arraysize(always_flags)); |
| 4152 } | 4186 } |
| 4153 | 4187 |
| 4154 | 4188 |
| 4155 TEST(ObjectLiteralPropertyShorthandKeywordsError) { | 4189 TEST(ObjectLiteralPropertyShorthandKeywordsError) { |
| 4156 const char* context_data[][2] = {{"({", "});"}, | 4190 const char* context_data[][2] = {{"({", "});"}, |
| 4157 {"'use strict'; ({", "});"}, | 4191 {"'use strict'; ({", "});"}, |
| 4158 {NULL, NULL}}; | 4192 {NULL, NULL}}; |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4438 const char* context_data[][2] = { | 4472 const char* context_data[][2] = { |
| 4439 {"", ""}, | 4473 {"", ""}, |
| 4440 {"function f() {", "}"}, | 4474 {"function f() {", "}"}, |
| 4441 {"{", "}"}, | 4475 {"{", "}"}, |
| 4442 {NULL, NULL}}; | 4476 {NULL, NULL}}; |
| 4443 const char* bad_data[] = { | 4477 const char* bad_data[] = { |
| 4444 "let x = 1;", | 4478 "let x = 1;", |
| 4445 "for(let x = 1;;){}", | 4479 "for(let x = 1;;){}", |
| 4446 "for(let x of []){}", | 4480 "for(let x of []){}", |
| 4447 "for(let x in []){}", | 4481 "for(let x in []){}", |
| 4482 "class C {}", | |
| 4483 "class C extends D {}", | |
| 4484 "(class {})", | |
| 4485 "(class extends D {})", | |
| 4486 "(class C {})", | |
| 4487 "(class C extends D {})", | |
| 4448 NULL}; | 4488 NULL}; |
| 4449 static const ParserFlag always_flags[] = {kAllowHarmonyScoping}; | 4489 static const ParserFlag always_true_flags[] = { |
| 4450 RunParserSyncTest(context_data, bad_data, kError, NULL, 0, always_flags, | 4490 kAllowHarmonyScoping, kAllowHarmonyClasses}; |
| 4451 arraysize(always_flags)); | 4491 static const ParserFlag always_false_flags[] = {kAllowHarmonySloppy}; |
| 4492 RunParserSyncTest(context_data, bad_data, kError, NULL, 0, | |
| 4493 always_true_flags, arraysize(always_true_flags), | |
| 4494 always_false_flags, arraysize(always_false_flags)); | |
| 4452 | 4495 |
| 4453 const char* good_data[] = { | 4496 const char* good_data[] = { |
| 4454 "let = 1;", | 4497 "let = 1;", |
| 4455 "for(let = 1;;){}", | 4498 "for(let = 1;;){}", |
| 4456 NULL}; | 4499 NULL}; |
| 4457 RunParserSyncTest(context_data, good_data, kSuccess, NULL, 0, always_flags, | 4500 RunParserSyncTest(context_data, good_data, kSuccess, NULL, 0, |
| 4458 arraysize(always_flags)); | 4501 always_true_flags, arraysize(always_true_flags), |
| 4502 always_false_flags, arraysize(always_false_flags)); | |
| 4459 } | 4503 } |
| OLD | NEW |