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 1501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1512 } | 1512 } |
1513 for (size_t flag_index = 0; flag_index < always_false_flags_length; | 1513 for (size_t flag_index = 0; flag_index < always_false_flags_length; |
1514 ++flag_index) { | 1514 ++flag_index) { |
1515 flags.Remove(always_false_flags[flag_index]); | 1515 flags.Remove(always_false_flags[flag_index]); |
1516 } | 1516 } |
1517 TestParserSyncWithFlags(str, flags, result); | 1517 TestParserSyncWithFlags(str, flags, result); |
1518 } | 1518 } |
1519 } | 1519 } |
1520 | 1520 |
1521 | 1521 |
1522 // TODO(marja) This needs to be turned into a fuzzing test, trying all those | 1522 TEST(ParserSync) { |
1523 // combinations below takes at least 2 orders of magnitude too long. | |
1524 DISABLED_TEST(ParserSync) { | |
1525 const char* context_data[][2] = { | 1523 const char* context_data[][2] = { |
1526 { "", "" }, | 1524 { "", "" }, |
1527 { "{", "}" }, | 1525 { "{", "}" }, |
1528 { "if (true) ", " else {}" }, | 1526 { "if (true) ", " else {}" }, |
1529 { "if (true) {} else ", "" }, | 1527 { "if (true) {} else ", "" }, |
1530 { "if (true) ", "" }, | 1528 { "if (true) ", "" }, |
1531 { "do ", " while (false)" }, | 1529 { "do ", " while (false)" }, |
1532 { "while (false) ", "" }, | 1530 { "while (false) ", "" }, |
1533 { "for (;;) ", "" }, | 1531 { "for (;;) ", "" }, |
1534 { "with ({})", "" }, | 1532 { "with ({})", "" }, |
1535 { "switch (12) { case 12: ", "}" }, | 1533 { "switch (12) { case 12: ", "}" }, |
1536 { "switch (12) { default: ", "}" }, | 1534 { "switch (12) { default: ", "}" }, |
1537 { "switch (12) { ", "case 12: }" }, | 1535 { "switch (12) { ", "case 12: }" }, |
1538 { "label2: ", "" }, | 1536 { "label2: ", "" }, |
1539 { NULL, NULL } | 1537 { NULL, NULL } |
1540 }; | 1538 }; |
1541 | 1539 |
1542 const char* statement_data[] = { | 1540 const char* statement_data[] = { |
1543 "{}", | 1541 "{}", |
1544 "var x", | 1542 "var x", |
1545 "var x = 1", | 1543 "var x = 1", |
1546 "const x", | 1544 "const x", |
1547 "const x = 1", | 1545 "const x = 1", |
1548 ";", | 1546 ";", |
1549 "12", | 1547 "12", |
1550 "if (false) {} else ;", | 1548 "if (false) {} else ;", |
1551 "if (false) {} else {}", | 1549 "if (false) {} else {}", |
1552 "if (false) {} else 12", | 1550 "if (false) {} else 12", |
1553 "if (false) ;" | 1551 "if (false) ;", |
1554 "if (false) {}", | 1552 "if (false) {}", |
1555 "if (false) 12", | 1553 "if (false) 12", |
1556 "do {} while (false)", | 1554 "do {} while (false)", |
1557 "for (;;) ;", | 1555 "for (;;) ;", |
1558 "for (;;) {}", | 1556 "for (;;) {}", |
1559 "for (;;) 12", | 1557 "for (;;) 12", |
1560 "continue", | 1558 "continue", |
1561 "continue label", | 1559 "continue label", |
1562 "continue\nlabel", | 1560 "continue\nlabel", |
1563 "break", | 1561 "break", |
1564 "break label", | 1562 "break label", |
1565 "break\nlabel", | 1563 "break\nlabel", |
1566 // TODO(marja): activate once parsing 'return' is merged into ParserBase. | 1564 // TODO(marja): activate once parsing 'return' is merged into ParserBase. |
1567 // "return", | 1565 // "return", |
1568 // "return 12", | 1566 // "return 12", |
1569 // "return\n12", | 1567 // "return\n12", |
1570 "with ({}) ;", | 1568 "with ({}) ;", |
1571 "with ({}) {}", | 1569 "with ({}) {}", |
1572 "with ({}) 12", | 1570 "with ({}) 12", |
1573 "switch ({}) { default: }" | 1571 "switch ({}) { default: }", |
1574 "label3: " | 1572 "label3: ", |
1575 "throw", | 1573 "throw", |
1576 "throw 12", | 1574 "throw 12", |
1577 "throw\n12", | 1575 "throw\n12", |
1578 "try {} catch(e) {}", | 1576 "try {} catch(e) {}", |
1579 "try {} finally {}", | 1577 "try {} finally {}", |
1580 "try {} catch(e) {} finally {}", | 1578 "try {} catch(e) {} finally {}", |
1581 "debugger", | 1579 "debugger", |
1582 NULL | 1580 NULL |
1583 }; | 1581 }; |
1584 | 1582 |
1585 const char* termination_data[] = { | 1583 const char* termination_data[] = { |
1586 "", | 1584 "", |
1587 ";", | 1585 ";", |
1588 "\n", | 1586 "\n", |
1589 ";\n", | 1587 ";\n", |
1590 "\n;", | 1588 "\n;", |
1591 NULL | 1589 NULL |
1592 }; | 1590 }; |
1593 | 1591 |
1594 v8::HandleScope handles(CcTest::isolate()); | 1592 v8::HandleScope handles(CcTest::isolate()); |
1595 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | 1593 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); |
1596 v8::Context::Scope context_scope(context); | 1594 v8::Context::Scope context_scope(context); |
1597 | 1595 |
1598 CcTest::i_isolate()->stack_guard()->SetStackLimit( | 1596 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
1599 i::GetCurrentStackPosition() - 128 * 1024); | 1597 i::GetCurrentStackPosition() - 128 * 1024); |
1600 | 1598 |
1601 static const ParserFlag flags1[] = { | |
1602 kAllowHarmonyArrowFunctions, | |
1603 kAllowHarmonyClasses, | |
1604 kAllowHarmonyNumericLiterals, | |
1605 kAllowHarmonyObjectLiterals, | |
1606 kAllowHarmonyScoping, | |
1607 kAllowHarmonyModules, | |
1608 kAllowHarmonySloppy, | |
1609 kAllowLazy, | |
1610 }; | |
1611 | |
1612 for (int i = 0; context_data[i][0] != NULL; ++i) { | 1599 for (int i = 0; context_data[i][0] != NULL; ++i) { |
1613 for (int j = 0; statement_data[j] != NULL; ++j) { | 1600 for (int j = 0; statement_data[j] != NULL; ++j) { |
1614 for (int k = 0; termination_data[k] != NULL; ++k) { | 1601 for (int k = 0; termination_data[k] != NULL; ++k) { |
1615 int kPrefixLen = i::StrLength(context_data[i][0]); | 1602 int kPrefixLen = i::StrLength(context_data[i][0]); |
1616 int kStatementLen = i::StrLength(statement_data[j]); | 1603 int kStatementLen = i::StrLength(statement_data[j]); |
1617 int kTerminationLen = i::StrLength(termination_data[k]); | 1604 int kTerminationLen = i::StrLength(termination_data[k]); |
1618 int kSuffixLen = i::StrLength(context_data[i][1]); | 1605 int kSuffixLen = i::StrLength(context_data[i][1]); |
1619 int kProgramSize = kPrefixLen + kStatementLen + kTerminationLen | 1606 int kProgramSize = kPrefixLen + kStatementLen + kTerminationLen |
1620 + kSuffixLen + i::StrLength("label: for (;;) { }"); | 1607 + kSuffixLen + i::StrLength("label: for (;;) { }"); |
1621 | 1608 |
1622 // Plug the source code pieces together. | 1609 // Plug the source code pieces together. |
1623 i::ScopedVector<char> program(kProgramSize + 1); | 1610 i::ScopedVector<char> program(kProgramSize + 1); |
1624 int length = i::SNPrintF(program, | 1611 int length = i::SNPrintF(program, |
1625 "label: for (;;) { %s%s%s%s }", | 1612 "label: for (;;) { %s%s%s%s }", |
1626 context_data[i][0], | 1613 context_data[i][0], |
1627 statement_data[j], | 1614 statement_data[j], |
1628 termination_data[k], | 1615 termination_data[k], |
1629 context_data[i][1]); | 1616 context_data[i][1]); |
1630 CHECK(length == kProgramSize); | 1617 CHECK(length == kProgramSize); |
1631 TestParserSync(program.start(), flags1, arraysize(flags1)); | 1618 TestParserSync(program.start(), NULL, 0); |
1632 } | 1619 } |
1633 } | 1620 } |
1634 } | 1621 } |
1635 | 1622 |
1636 // Neither Harmony numeric literals nor our natives syntax have any | 1623 // Neither Harmony numeric literals nor our natives syntax have any |
1637 // interaction with the flags above, so test these separately to reduce | 1624 // interaction with the flags above, so test these separately to reduce |
1638 // the combinatorial explosion. | 1625 // the combinatorial explosion. |
1639 static const ParserFlag flags2[] = { kAllowHarmonyNumericLiterals }; | 1626 static const ParserFlag flags2[] = { kAllowHarmonyNumericLiterals }; |
1640 TestParserSync("0o1234", flags2, arraysize(flags2)); | 1627 TestParserSync("0o1234", flags2, arraysize(flags2)); |
1641 TestParserSync("0b1011", flags2, arraysize(flags2)); | 1628 TestParserSync("0b1011", flags2, arraysize(flags2)); |
(...skipping 2872 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4514 always_false_flags, arraysize(always_false_flags)); | 4501 always_false_flags, arraysize(always_false_flags)); |
4515 | 4502 |
4516 const char* good_data[] = { | 4503 const char* good_data[] = { |
4517 "let = 1;", | 4504 "let = 1;", |
4518 "for(let = 1;;){}", | 4505 "for(let = 1;;){}", |
4519 NULL}; | 4506 NULL}; |
4520 RunParserSyncTest(context_data, good_data, kSuccess, NULL, 0, | 4507 RunParserSyncTest(context_data, good_data, kSuccess, NULL, 0, |
4521 always_true_flags, arraysize(always_true_flags), | 4508 always_true_flags, arraysize(always_true_flags), |
4522 always_false_flags, arraysize(always_false_flags)); | 4509 always_false_flags, arraysize(always_false_flags)); |
4523 } | 4510 } |
OLD | NEW |