Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: test/cctest/test-parsing.cc

Issue 1723313002: [parser] Enforce module-specific identifier restriction (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add an initializer for `parsing_module_` attribute Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/parsing/preparser.h ('K') | « src/parsing/token.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1523 matching lines...) Expand 10 before | Expand all | Expand 10 after
1534 void TestParserSyncWithFlags(i::Handle<i::String> source, 1534 void TestParserSyncWithFlags(i::Handle<i::String> source,
1535 i::EnumSet<ParserFlag> flags, 1535 i::EnumSet<ParserFlag> flags,
1536 ParserSyncTestResult result, 1536 ParserSyncTestResult result,
1537 bool is_module = false) { 1537 bool is_module = false) {
1538 i::Isolate* isolate = CcTest::i_isolate(); 1538 i::Isolate* isolate = CcTest::i_isolate();
1539 i::Factory* factory = isolate->factory(); 1539 i::Factory* factory = isolate->factory();
1540 1540
1541 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); 1541 uintptr_t stack_limit = isolate->stack_guard()->real_climit();
1542 int preparser_materialized_literals = -1; 1542 int preparser_materialized_literals = -1;
1543 int parser_materialized_literals = -2; 1543 int parser_materialized_literals = -2;
1544 bool test_preparser = !is_module;
1545 1544
1546 // Preparse the data. 1545 // Preparse the data.
1547 i::CompleteParserRecorder log; 1546 i::CompleteParserRecorder log;
1548 if (test_preparser) { 1547 {
1549 i::Scanner scanner(isolate->unicode_cache()); 1548 i::Scanner scanner(isolate->unicode_cache());
1550 i::GenericStringUtf16CharacterStream stream(source, 0, source->length()); 1549 i::GenericStringUtf16CharacterStream stream(source, 0, source->length());
1551 i::Zone zone(CcTest::i_isolate()->allocator()); 1550 i::Zone zone(CcTest::i_isolate()->allocator());
1552 i::AstValueFactory ast_value_factory( 1551 i::AstValueFactory ast_value_factory(
1553 &zone, CcTest::i_isolate()->heap()->HashSeed()); 1552 &zone, CcTest::i_isolate()->heap()->HashSeed());
1554 i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log, 1553 i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log,
1555 stack_limit); 1554 stack_limit);
1556 SetParserFlags(&preparser, flags); 1555 SetParserFlags(&preparser, flags);
1557 scanner.Initialize(&stream); 1556 scanner.Initialize(&stream);
1558 i::PreParser::PreParseResult result = 1557 i::PreParser::PreParseResult result =
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1595 v8::base::OS::Print( 1594 v8::base::OS::Print(
1596 "Parser failed on:\n" 1595 "Parser failed on:\n"
1597 "\t%s\n" 1596 "\t%s\n"
1598 "with error:\n" 1597 "with error:\n"
1599 "\t%s\n" 1598 "\t%s\n"
1600 "However, we expected no error.", 1599 "However, we expected no error.",
1601 source->ToCString().get(), message_string->ToCString().get()); 1600 source->ToCString().get(), message_string->ToCString().get());
1602 CHECK(false); 1601 CHECK(false);
1603 } 1602 }
1604 1603
1605 if (test_preparser && !preparse_error) { 1604 if (!preparse_error) {
1606 v8::base::OS::Print( 1605 v8::base::OS::Print(
1607 "Parser failed on:\n" 1606 "Parser failed on:\n"
1608 "\t%s\n" 1607 "\t%s\n"
1609 "with error:\n" 1608 "with error:\n"
1610 "\t%s\n" 1609 "\t%s\n"
1611 "However, the preparser succeeded", 1610 "However, the preparser succeeded",
1612 source->ToCString().get(), message_string->ToCString().get()); 1611 source->ToCString().get(), message_string->ToCString().get());
1613 CHECK(false); 1612 CHECK(false);
1614 } 1613 }
1615 // Check that preparser and parser produce the same error. 1614 // Check that preparser and parser produce the same error.
1616 if (test_preparser) { 1615 {
1617 i::Handle<i::String> preparser_message = 1616 i::Handle<i::String> preparser_message =
1618 FormatMessage(log.ErrorMessageData()); 1617 FormatMessage(log.ErrorMessageData());
1619 if (!i::String::Equals(message_string, preparser_message)) { 1618 if (!i::String::Equals(message_string, preparser_message)) {
1620 v8::base::OS::Print( 1619 v8::base::OS::Print(
1621 "Expected parser and preparser to produce the same error on:\n" 1620 "Expected parser and preparser to produce the same error on:\n"
1622 "\t%s\n" 1621 "\t%s\n"
1623 "However, found the following error messages\n" 1622 "However, found the following error messages\n"
1624 "\tparser: %s\n" 1623 "\tparser: %s\n"
1625 "\tpreparser: %s\n", 1624 "\tpreparser: %s\n",
1626 source->ToCString().get(), message_string->ToCString().get(), 1625 source->ToCString().get(), message_string->ToCString().get(),
1627 preparser_message->ToCString().get()); 1626 preparser_message->ToCString().get());
1628 CHECK(false); 1627 CHECK(false);
1629 } 1628 }
1630 } 1629 }
1631 } else if (test_preparser && preparse_error) { 1630 } else if (preparse_error) {
1632 v8::base::OS::Print( 1631 v8::base::OS::Print(
1633 "Preparser failed on:\n" 1632 "Preparser failed on:\n"
1634 "\t%s\n" 1633 "\t%s\n"
1635 "with error:\n" 1634 "with error:\n"
1636 "\t%s\n" 1635 "\t%s\n"
1637 "However, the parser succeeded", 1636 "However, the parser succeeded",
1638 source->ToCString().get(), 1637 source->ToCString().get(),
1639 FormatMessage(log.ErrorMessageData())->ToCString().get()); 1638 FormatMessage(log.ErrorMessageData())->ToCString().get());
1640 CHECK(false); 1639 CHECK(false);
1641 } else if (result == kError) { 1640 } else if (result == kError) {
1642 v8::base::OS::Print( 1641 v8::base::OS::Print(
1643 "Expected error on:\n" 1642 "Expected error on:\n"
1644 "\t%s\n" 1643 "\t%s\n"
1645 "However, parser and preparser succeeded", 1644 "However, parser and preparser succeeded",
1646 source->ToCString().get()); 1645 source->ToCString().get());
1647 CHECK(false); 1646 CHECK(false);
1648 } else if (test_preparser && 1647 } else if (preparser_materialized_literals != parser_materialized_literals) {
1649 preparser_materialized_literals != parser_materialized_literals) {
1650 v8::base::OS::Print( 1648 v8::base::OS::Print(
1651 "Preparser materialized literals (%d) differ from Parser materialized " 1649 "Preparser materialized literals (%d) differ from Parser materialized "
1652 "literals (%d) on:\n" 1650 "literals (%d) on:\n"
1653 "\t%s\n" 1651 "\t%s\n"
1654 "However, parser and preparser succeeded", 1652 "However, parser and preparser succeeded",
1655 preparser_materialized_literals, parser_materialized_literals, 1653 preparser_materialized_literals, parser_materialized_literals,
1656 source->ToCString().get()); 1654 source->ToCString().get());
1657 CHECK(false); 1655 CHECK(false);
1658 } 1656 }
1659 } 1657 }
(...skipping 3804 matching lines...) Expand 10 before | Expand all | Expand 10 after
5464 "var x; export default x = 7", 5462 "var x; export default x = 7",
5465 "export { Q } from 'somemodule.js';", 5463 "export { Q } from 'somemodule.js';",
5466 "export * from 'somemodule.js';", 5464 "export * from 'somemodule.js';",
5467 "var foo; export { foo as for };", 5465 "var foo; export { foo as for };",
5468 "export { arguments } from 'm.js';", 5466 "export { arguments } from 'm.js';",
5469 "export { for } from 'm.js';", 5467 "export { for } from 'm.js';",
5470 "export { yield } from 'm.js'", 5468 "export { yield } from 'm.js'",
5471 "export { static } from 'm.js'", 5469 "export { static } from 'm.js'",
5472 "export { let } from 'm.js'", 5470 "export { let } from 'm.js'",
5473 "var a; export { a as b, a as c };", 5471 "var a; export { a as b, a as c };",
5472 "var a; export { a as await };",
5473 "var a; export { a as enum };",
5474 5474
5475 "import 'somemodule.js';", 5475 "import 'somemodule.js';",
5476 "import { } from 'm.js';", 5476 "import { } from 'm.js';",
5477 "import { a } from 'm.js';", 5477 "import { a } from 'm.js';",
5478 "import { a, b as d, c, } from 'm.js';", 5478 "import { a, b as d, c, } from 'm.js';",
5479 "import * as thing from 'm.js';", 5479 "import * as thing from 'm.js';",
5480 "import thing from 'm.js';", 5480 "import thing from 'm.js';",
5481 "import thing, * as rest from 'm.js';", 5481 "import thing, * as rest from 'm.js';",
5482 "import thing, { a, b, c } from 'm.js';", 5482 "import thing, { a, b, c } from 'm.js';",
5483 "import { arguments as a } from 'm.js';", 5483 "import { arguments as a } from 'm.js';",
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
5589 "import a { b, c } from 'm.js';", 5589 "import a { b, c } from 'm.js';",
5590 "import arguments from 'm.js';", 5590 "import arguments from 'm.js';",
5591 "import eval from 'm.js';", 5591 "import eval from 'm.js';",
5592 "import { arguments } from 'm.js';", 5592 "import { arguments } from 'm.js';",
5593 "import { eval } from 'm.js';", 5593 "import { eval } from 'm.js';",
5594 "import { a as arguments } from 'm.js';", 5594 "import { a as arguments } from 'm.js';",
5595 "import { for } from 'm.js';", 5595 "import { for } from 'm.js';",
5596 "import { y as yield } from 'm.js'", 5596 "import { y as yield } from 'm.js'",
5597 "import { s as static } from 'm.js'", 5597 "import { s as static } from 'm.js'",
5598 "import { l as let } from 'm.js'", 5598 "import { l as let } from 'm.js'",
5599 "import { a as await } from 'm.js';",
5600 "import { a as enum } from 'm.js';",
5599 "import { x }, def from 'm.js';", 5601 "import { x }, def from 'm.js';",
5600 "import def, def2 from 'm.js';", 5602 "import def, def2 from 'm.js';",
5601 "import * as x, def from 'm.js';", 5603 "import * as x, def from 'm.js';",
5602 "import * as x, * as y from 'm.js';", 5604 "import * as x, * as y from 'm.js';",
5603 "import {x}, {y} from 'm.js';", 5605 "import {x}, {y} from 'm.js';",
5604 "import * as x, {y} from 'm.js';", 5606 "import * as x, {y} from 'm.js';",
5605 }; 5607 };
5606 // clang-format on 5608 // clang-format on
5607 5609
5608 i::Isolate* isolate = CcTest::i_isolate(); 5610 i::Isolate* isolate = CcTest::i_isolate();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
5658 5660
5659 i::Handle<i::Script> script = factory->NewScript(source); 5661 i::Handle<i::Script> script = factory->NewScript(source);
5660 i::Zone zone(CcTest::i_isolate()->allocator()); 5662 i::Zone zone(CcTest::i_isolate()->allocator());
5661 i::ParseInfo info(&zone, script); 5663 i::ParseInfo info(&zone, script);
5662 i::Parser parser(&info); 5664 i::Parser parser(&info);
5663 info.set_module(); 5665 info.set_module();
5664 CHECK(!parser.Parse(&info)); 5666 CHECK(!parser.Parse(&info));
5665 } 5667 }
5666 } 5668 }
5667 5669
5670 TEST(ModuleAwaitReserved) {
5671 // clang-format off
5672 const char* kErrorSources[] = {
5673 "await;",
5674 "await: ;",
5675 "var await;",
5676 "var [await] = [];",
5677 "var { await } = {};",
5678 "var { x: await } = {};",
5679 "{ var await; }",
5680 "let await;",
5681 "let [await] = [];",
5682 "let { await } = {};",
5683 "let { x: await } = {};",
5684 "{ let await; }",
5685 "const await = null;",
5686 "const [await] = [];",
5687 "const { await } = {};",
5688 "const { x: await } = {};",
5689 "{ const await = null; }",
5690 "function await() {}",
5691 "function f(await) {}",
5692 "function* await() {}",
5693 "function* g(await) {}",
5694 "(function await() {});",
5695 "(function (await) {});",
5696 "(function* await() {});",
5697 "(function* (await) {});",
5698 "(await) => {};",
5699 "await => {};",
5700 "class await {}",
5701 "class C { constructor(await) {} }",
5702 "class C { m(await) {} }",
5703 "class C { static m(await) {} }",
5704 "class C { *m(await) {} }",
5705 "class C { static *m(await) {} }",
5706 "(class await {})",
5707 "(class { constructor(await) {} });",
5708 "(class { m(await) {} });",
5709 "(class { static m(await) {} });",
5710 "(class { *m(await) {} });",
5711 "(class { static *m(await) {} });",
5712 "({ m(await) {} });",
5713 "({ *m(await) {} });",
5714 "({ set p(await) {} });",
5715 "try {} catch (await) {}",
5716 "try {} catch (await) {} finally {}",
5717 NULL
5718 };
5719 // clang-format on
5720 const char* context_data[][2] = {{"", ""}, {NULL, NULL}};
5721
5722 RunModuleParserSyncTest(context_data, kErrorSources, kError);
5723 }
5724
5725 TEST(ModuleAwaitReservedPreParse) {
5726 const char* context_data[][2] = {{"", ""}, {NULL, NULL}};
5727 const char* error_data[] = {"function f() { var await = 0; }", NULL};
5728
5729 RunModuleParserSyncTest(context_data, error_data, kError);
5730 }
5731
5732 TEST(ModuleAwaitPermitted) {
5733 // clang-format off
5734 const char* kValidSources[] = {
5735 "({}).await;",
5736 "({ await: null });",
5737 "({ await() {} });",
5738 "({ get await() {} });",
5739 "({ set await(x) {} });",
5740 "(class { await() {} });",
5741 "(class { static await() {} });",
5742 "(class { *await() {} });",
5743 "(class { static *await() {} });",
5744 NULL
5745 };
5746 // clang-format on
5747 const char* context_data[][2] = {{"", ""}, {NULL, NULL}};
5748
5749 RunModuleParserSyncTest(context_data, kValidSources, kSuccess);
5750 }
5751
5752 TEST(EnumReserved) {
5753 // clang-format off
5754 const char* kErrorSources[] = {
5755 "enum;",
5756 "enum: ;",
5757 "var enum;",
5758 "var [enum] = [];",
5759 "var { enum } = {};",
5760 "var { x: enum } = {};",
5761 "{ var enum; }",
5762 "let enum;",
5763 "let [enum] = [];",
5764 "let { enum } = {};",
5765 "let { x: enum } = {};",
5766 "{ let enum; }",
5767 "const enum = null;",
5768 "const [enum] = [];",
5769 "const { enum } = {};",
5770 "const { x: enum } = {};",
5771 "{ const enum = null; }",
5772 "function enum() {}",
5773 "function f(enum) {}",
5774 "function* enum() {}",
5775 "function* g(enum) {}",
5776 "(function enum() {});",
5777 "(function (enum) {});",
5778 "(function* enum() {});",
5779 "(function* (enum) {});",
5780 "(enum) => {};",
5781 "enum => {};",
5782 "class enum {}",
5783 "class C { constructor(enum) {} }",
5784 "class C { m(enum) {} }",
5785 "class C { static m(enum) {} }",
5786 "class C { *m(enum) {} }",
5787 "class C { static *m(enum) {} }",
5788 "(class enum {})",
5789 "(class { constructor(enum) {} });",
5790 "(class { m(enum) {} });",
5791 "(class { static m(enum) {} });",
5792 "(class { *m(enum) {} });",
5793 "(class { static *m(enum) {} });",
5794 "({ m(enum) {} });",
5795 "({ *m(enum) {} });",
5796 "({ set p(enum) {} });",
5797 "try {} catch (enum) {}",
5798 "try {} catch (enum) {} finally {}",
5799 NULL
5800 };
5801 // clang-format on
5802 const char* context_data[][2] = {{"", ""}, {NULL, NULL}};
5803
5804 RunModuleParserSyncTest(context_data, kErrorSources, kError);
5805 }
5668 5806
5669 TEST(ModuleParsingInternals) { 5807 TEST(ModuleParsingInternals) {
5670 i::Isolate* isolate = CcTest::i_isolate(); 5808 i::Isolate* isolate = CcTest::i_isolate();
5671 i::Factory* factory = isolate->factory(); 5809 i::Factory* factory = isolate->factory();
5672 v8::HandleScope handles(CcTest::isolate()); 5810 v8::HandleScope handles(CcTest::isolate());
5673 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate()); 5811 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate());
5674 v8::Context::Scope context_scope(context); 5812 v8::Context::Scope context_scope(context);
5675 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - 5813 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() -
5676 128 * 1024); 5814 128 * 1024);
5677 5815
(...skipping 1582 matching lines...) Expand 10 before | Expand all | Expand 10 after
7260 // "Array() **= 10", 7398 // "Array() **= 10",
7261 NULL 7399 NULL
7262 }; 7400 };
7263 // clang-format on 7401 // clang-format on
7264 7402
7265 static const ParserFlag always_flags[] = { 7403 static const ParserFlag always_flags[] = {
7266 kAllowHarmonyExponentiationOperator}; 7404 kAllowHarmonyExponentiationOperator};
7267 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, 7405 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags,
7268 arraysize(always_flags)); 7406 arraysize(always_flags));
7269 } 7407 }
OLDNEW
« src/parsing/preparser.h ('K') | « src/parsing/token.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698