OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "include/dart_api.h" | 5 #include "include/dart_api.h" |
6 #include "include/dart_tools_api.h" | 6 #include "include/dart_tools_api.h" |
7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
8 #include "vm/globals.h" | 8 #include "vm/globals.h" |
9 #include "vm/isolate.h" | 9 #include "vm/isolate.h" |
10 #include "vm/lockers.h" | 10 #include "vm/lockers.h" |
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 "}\n" | 627 "}\n" |
628 "class B extends Object with Mixin1 {\n" | 628 "class B extends Object with Mixin1 {\n" |
629 "}\n" | 629 "}\n" |
630 "var saved = new B();\n" | 630 "var saved = new B();\n" |
631 "main() {\n" | 631 "main() {\n" |
632 " return 'saved:field=${saved.field},func=${saved.func()}';\n" | 632 " return 'saved:field=${saved.field},func=${saved.func()}';\n" |
633 "}\n"; | 633 "}\n"; |
634 | 634 |
635 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 635 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
636 EXPECT_VALID(lib); | 636 EXPECT_VALID(lib); |
637 EXPECT_STREQ("saved:field=mixin1,func=mixin1", | 637 EXPECT_STREQ("saved:field=mixin1,func=mixin1", SimpleInvokeStr(lib, "main")); |
638 SimpleInvokeStr(lib, "main")); | |
639 | 638 |
640 const char* kReloadScript = | 639 const char* kReloadScript = |
641 "class Mixin2 {\n" | 640 "class Mixin2 {\n" |
642 " var field = 'mixin2';\n" | 641 " var field = 'mixin2';\n" |
643 " func() => 'mixin2';\n" | 642 " func() => 'mixin2';\n" |
644 "}\n" | 643 "}\n" |
645 "class B extends Object with Mixin2 {\n" | 644 "class B extends Object with Mixin2 {\n" |
646 "}\n" | 645 "}\n" |
647 "var saved = new B();\n" | 646 "var saved = new B();\n" |
648 "main() {\n" | 647 "main() {\n" |
649 " var newer = new B();\n" | 648 " var newer = new B();\n" |
650 " return 'saved:field=${saved.field},func=${saved.func()} '\n" | 649 " return 'saved:field=${saved.field},func=${saved.func()} '\n" |
651 " 'newer:field=${newer.field},func=${newer.func()}';\n" | 650 " 'newer:field=${newer.field},func=${newer.func()}';\n" |
652 "}\n"; | 651 "}\n"; |
653 | 652 |
654 lib = TestCase::ReloadTestScript(kReloadScript); | 653 lib = TestCase::ReloadTestScript(kReloadScript); |
655 EXPECT_VALID(lib); | 654 EXPECT_VALID(lib); |
656 | 655 |
657 // The saved instance of B retains its old field value from mixin1, | 656 // The saved instance of B retains its old field value from mixin1, |
658 // but it gets the new implementation of func from mixin2. | 657 // but it gets the new implementation of func from mixin2. |
659 EXPECT_STREQ("saved:field=mixin1,func=mixin2 " | 658 EXPECT_STREQ( |
660 "newer:field=mixin2,func=mixin2", | 659 "saved:field=mixin1,func=mixin2 " |
661 SimpleInvokeStr(lib, "main")); | 660 "newer:field=mixin2,func=mixin2", |
| 661 SimpleInvokeStr(lib, "main")); |
662 } | 662 } |
663 | 663 |
664 | 664 |
665 TEST_CASE(IsolateReload_ComplexInheritanceChange) { | 665 TEST_CASE(IsolateReload_ComplexInheritanceChange) { |
666 const char* kScript = | 666 const char* kScript = |
667 "class A {\n" | 667 "class A {\n" |
668 " String name;\n" | 668 " String name;\n" |
669 " A(this.name);\n" | 669 " A(this.name);\n" |
670 "}\n" | 670 "}\n" |
671 "class B extends A {\n" | 671 "class B extends A {\n" |
672 " B(name) : super(name);\n" | 672 " B(name) : super(name);\n" |
673 "}\n" | 673 "}\n" |
674 "class C extends B {\n" | 674 "class C extends B {\n" |
675 " C(name) : super(name);\n" | 675 " C(name) : super(name);\n" |
676 "}\n" | 676 "}\n" |
677 "var list = [ new A('a'), new B('b'), new C('c') ];\n" | 677 "var list = [ new A('a'), new B('b'), new C('c') ];\n" |
678 "main() {\n" | 678 "main() {\n" |
679 " return (list.map((x) {\n" | 679 " return (list.map((x) {\n" |
680 " return '${x.name} is A(${x is A})/ B(${x is B})/ C(${x is C})';\n" | 680 " return '${x.name} is A(${x is A})/ B(${x is B})/ C(${x is C})';\n" |
681 " })).toString();\n" | 681 " })).toString();\n" |
682 "}\n"; | 682 "}\n"; |
683 | 683 |
684 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 684 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
685 EXPECT_VALID(lib); | 685 EXPECT_VALID(lib); |
686 EXPECT_STREQ("(a is A(true)/ B(false)/ C(false)," | 686 EXPECT_STREQ( |
687 " b is A(true)/ B(true)/ C(false)," | 687 "(a is A(true)/ B(false)/ C(false)," |
688 " c is A(true)/ B(true)/ C(true))", | 688 " b is A(true)/ B(true)/ C(false)," |
689 SimpleInvokeStr(lib, "main")); | 689 " c is A(true)/ B(true)/ C(true))", |
| 690 SimpleInvokeStr(lib, "main")); |
690 | 691 |
691 const char* kReloadScript = | 692 const char* kReloadScript = |
692 "class C {\n" | 693 "class C {\n" |
693 " String name;\n" | 694 " String name;\n" |
694 " C(this.name);\n" | 695 " C(this.name);\n" |
695 "}\n" | 696 "}\n" |
696 "class X extends C {\n" | 697 "class X extends C {\n" |
697 " X(name) : super(name);\n" | 698 " X(name) : super(name);\n" |
698 "}\n" | 699 "}\n" |
699 "class A extends X {\n" | 700 "class A extends X {\n" |
700 " A(name) : super(name);\n" | 701 " A(name) : super(name);\n" |
701 "}\n" | 702 "}\n" |
702 "var list;\n" | 703 "var list;\n" |
703 "main() {\n" | 704 "main() {\n" |
704 " list.add(new X('x'));\n" | 705 " list.add(new X('x'));\n" |
705 " return (list.map((x) {\n" | 706 " return (list.map((x) {\n" |
706 " return '${x.name} is A(${x is A})/ C(${x is C})/ X(${x is X})';\n" | 707 " return '${x.name} is A(${x is A})/ C(${x is C})/ X(${x is X})';\n" |
707 " })).toString();\n" | 708 " })).toString();\n" |
708 "}\n"; | 709 "}\n"; |
709 | 710 |
710 lib = TestCase::ReloadTestScript(kReloadScript); | 711 lib = TestCase::ReloadTestScript(kReloadScript); |
711 EXPECT_VALID(lib); | 712 EXPECT_VALID(lib); |
712 EXPECT_STREQ("(a is A(true)/ C(true)/ X(true)," | 713 EXPECT_STREQ( |
713 " b is A(true)/ C(true)/ X(true)," // still extends A... | 714 "(a is A(true)/ C(true)/ X(true)," |
714 " c is A(false)/ C(true)/ X(false)," | 715 " b is A(true)/ C(true)/ X(true)," // still extends A... |
715 " x is A(false)/ C(true)/ X(true))", | 716 " c is A(false)/ C(true)/ X(false)," |
716 SimpleInvokeStr(lib, "main")); | 717 " x is A(false)/ C(true)/ X(true))", |
| 718 SimpleInvokeStr(lib, "main")); |
717 | 719 |
718 // Revive the class B and make sure all allocated instances take | 720 // Revive the class B and make sure all allocated instances take |
719 // their place in the inheritance hierarchy. | 721 // their place in the inheritance hierarchy. |
720 const char* kReloadScript2 = | 722 const char* kReloadScript2 = |
721 "class X {\n" | 723 "class X {\n" |
722 " String name;\n" | 724 " String name;\n" |
723 " X(this.name);\n" | 725 " X(this.name);\n" |
724 "}\n" | 726 "}\n" |
725 "class A extends X{\n" | 727 "class A extends X{\n" |
726 " A(name) : super(name);\n" | 728 " A(name) : super(name);\n" |
727 "}\n" | 729 "}\n" |
728 "class B extends X {\n" | 730 "class B extends X {\n" |
729 " B(name) : super(name);\n" | 731 " B(name) : super(name);\n" |
730 "}\n" | 732 "}\n" |
731 "class C extends A {\n" | 733 "class C extends A {\n" |
732 " C(name) : super(name);\n" | 734 " C(name) : super(name);\n" |
733 "}\n" | 735 "}\n" |
734 "var list;\n" | 736 "var list;\n" |
735 "main() {\n" | 737 "main() {\n" |
736 " return (list.map((x) {\n" | 738 " return (list.map((x) {\n" |
737 " return '${x.name} is '\n" | 739 " return '${x.name} is '\n" |
738 " 'A(${x is A})/ B(${x is B})/ C(${x is C})/ X(${x is X})';\n" | 740 " 'A(${x is A})/ B(${x is B})/ C(${x is C})/ X(${x is X})';\n" |
739 " })).toString();\n" | 741 " })).toString();\n" |
740 "}\n"; | 742 "}\n"; |
741 | 743 |
742 lib = TestCase::ReloadTestScript(kReloadScript2); | 744 lib = TestCase::ReloadTestScript(kReloadScript2); |
743 EXPECT_VALID(lib); | 745 EXPECT_VALID(lib); |
744 EXPECT_STREQ("(a is A(true)/ B(false)/ C(false)/ X(true)," | 746 EXPECT_STREQ( |
745 " b is A(false)/ B(true)/ C(false)/ X(true)," | 747 "(a is A(true)/ B(false)/ C(false)/ X(true)," |
746 " c is A(true)/ B(false)/ C(true)/ X(true)," | 748 " b is A(false)/ B(true)/ C(false)/ X(true)," |
747 " x is A(false)/ B(false)/ C(false)/ X(true))", | 749 " c is A(true)/ B(false)/ C(true)/ X(true)," |
748 SimpleInvokeStr(lib, "main")); | 750 " x is A(false)/ B(false)/ C(false)/ X(true))", |
| 751 SimpleInvokeStr(lib, "main")); |
749 } | 752 } |
750 | 753 |
751 | 754 |
752 TEST_CASE(IsolateReload_LiveStack) { | 755 TEST_CASE(IsolateReload_LiveStack) { |
753 const char* kScript = | 756 const char* kScript = |
754 "import 'test:isolate_reload_helper';\n" | 757 "import 'test:isolate_reload_helper';\n" |
755 "helper() => 7;\n" | 758 "helper() => 7;\n" |
756 "alpha() { var x = helper(); reloadTest(); return x + helper(); }\n" | 759 "alpha() { var x = helper(); reloadTest(); return x + helper(); }\n" |
757 "foo() => alpha();\n" | 760 "foo() => alpha();\n" |
758 "bar() => foo();\n" | 761 "bar() => foo();\n" |
(...skipping 18 matching lines...) Expand all Loading... |
777 | 780 |
778 EXPECT_EQ(107, SimpleInvoke(lib, "main")); | 781 EXPECT_EQ(107, SimpleInvoke(lib, "main")); |
779 | 782 |
780 lib = TestCase::GetReloadErrorOrRootLibrary(); | 783 lib = TestCase::GetReloadErrorOrRootLibrary(); |
781 EXPECT_VALID(lib); | 784 EXPECT_VALID(lib); |
782 EXPECT_EQ(105, SimpleInvoke(lib, "main")); | 785 EXPECT_EQ(105, SimpleInvoke(lib, "main")); |
783 } | 786 } |
784 | 787 |
785 | 788 |
786 TEST_CASE(IsolateReload_LibraryLookup) { | 789 TEST_CASE(IsolateReload_LibraryLookup) { |
787 const char* kImportScript = | 790 const char* kImportScript = "importedFunc() => 'a';\n"; |
788 "importedFunc() => 'a';\n"; | |
789 TestCase::AddTestLib("test:lib1", kImportScript); | 791 TestCase::AddTestLib("test:lib1", kImportScript); |
790 | 792 |
791 const char* kScript = | 793 const char* kScript = |
792 "main() {\n" | 794 "main() {\n" |
793 " return importedFunc();\n" | 795 " return importedFunc();\n" |
794 "}\n"; | 796 "}\n"; |
795 Dart_Handle result; | 797 Dart_Handle result; |
796 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 798 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
797 EXPECT_VALID(lib); | 799 EXPECT_VALID(lib); |
798 EXPECT_ERROR(SimpleInvokeError(lib, "main"), "importedFunc"); | 800 EXPECT_ERROR(SimpleInvokeError(lib, "main"), "importedFunc"); |
(...skipping 21 matching lines...) Expand all Loading... |
820 lib = TestCase::ReloadTestScript(kScript); | 822 lib = TestCase::ReloadTestScript(kScript); |
821 EXPECT_VALID(lib); | 823 EXPECT_VALID(lib); |
822 | 824 |
823 // Fail to find 'test:lib1' in the isolate. | 825 // Fail to find 'test:lib1' in the isolate. |
824 result = Dart_LookupLibrary(NewString("test:lib1")); | 826 result = Dart_LookupLibrary(NewString("test:lib1")); |
825 EXPECT(Dart_IsError(result)); | 827 EXPECT(Dart_IsError(result)); |
826 } | 828 } |
827 | 829 |
828 | 830 |
829 TEST_CASE(IsolateReload_LibraryHide) { | 831 TEST_CASE(IsolateReload_LibraryHide) { |
830 const char* kImportScript = | 832 const char* kImportScript = "importedFunc() => 'a';\n"; |
831 "importedFunc() => 'a';\n"; | |
832 TestCase::AddTestLib("test:lib1", kImportScript); | 833 TestCase::AddTestLib("test:lib1", kImportScript); |
833 | 834 |
834 // Import 'test:lib1' with importedFunc hidden. Will result in an | 835 // Import 'test:lib1' with importedFunc hidden. Will result in an |
835 // error. | 836 // error. |
836 const char* kScript = | 837 const char* kScript = |
837 "import 'test:lib1' hide importedFunc;\n" | 838 "import 'test:lib1' hide importedFunc;\n" |
838 "main() {\n" | 839 "main() {\n" |
839 " return importedFunc();\n" | 840 " return importedFunc();\n" |
840 "}\n"; | 841 "}\n"; |
841 | 842 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
901 // Works. | 902 // Works. |
902 EXPECT_STREQ("a", SimpleInvokeStr(lib, "main")); | 903 EXPECT_STREQ("a", SimpleInvokeStr(lib, "main")); |
903 // Results in an error. | 904 // Results in an error. |
904 EXPECT_ERROR(SimpleInvokeError(lib, "mainInt"), "importedIntFunc"); | 905 EXPECT_ERROR(SimpleInvokeError(lib, "mainInt"), "importedIntFunc"); |
905 } | 906 } |
906 | 907 |
907 | 908 |
908 // Verifies that we clear the ICs for the functions live on the stack in a way | 909 // Verifies that we clear the ICs for the functions live on the stack in a way |
909 // that is compatible with the fast path smi stubs. | 910 // that is compatible with the fast path smi stubs. |
910 TEST_CASE(IsolateReload_SmiFastPathStubs) { | 911 TEST_CASE(IsolateReload_SmiFastPathStubs) { |
911 const char* kImportScript = | 912 const char* kImportScript = "importedIntFunc() => 4;\n"; |
912 "importedIntFunc() => 4;\n"; | |
913 TestCase::AddTestLib("test:lib1", kImportScript); | 913 TestCase::AddTestLib("test:lib1", kImportScript); |
914 | 914 |
915 const char* kScript = | 915 const char* kScript = |
916 "import 'test:isolate_reload_helper';\n" | 916 "import 'test:isolate_reload_helper';\n" |
917 "import 'test:lib1' show importedIntFunc;\n" | 917 "import 'test:lib1' show importedIntFunc;\n" |
918 "main() {\n" | 918 "main() {\n" |
919 " var x = importedIntFunc();\n" | 919 " var x = importedIntFunc();\n" |
920 " var y = importedIntFunc();\n" | 920 " var y = importedIntFunc();\n" |
921 " reloadTest();\n" | 921 " reloadTest();\n" |
922 " return x + y;\n" | 922 " return x + y;\n" |
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1588 " C.y = 4;\n" | 1588 " C.y = 4;\n" |
1589 " var f = C#y;\n" | 1589 " var f = C#y;\n" |
1590 " var r1 = invoke(f);\n" | 1590 " var r1 = invoke(f);\n" |
1591 " reloadTest();\n" | 1591 " reloadTest();\n" |
1592 " var r2 = invoke(f);\n" | 1592 " var r2 = invoke(f);\n" |
1593 " return '$r1 $r2';\n" | 1593 " return '$r1 $r2';\n" |
1594 "}\n"; | 1594 "}\n"; |
1595 | 1595 |
1596 TestCase::SetReloadTestScript(kReloadScript); | 1596 TestCase::SetReloadTestScript(kReloadScript); |
1597 | 1597 |
1598 EXPECT_STREQ("4 NoSuchMethodError: No static getter 'y' declared " | 1598 EXPECT_STREQ( |
1599 "in class 'C'.", SimpleInvokeStr(lib, "main")); | 1599 "4 NoSuchMethodError: No static getter 'y' declared " |
| 1600 "in class 'C'.", |
| 1601 SimpleInvokeStr(lib, "main")); |
1600 | 1602 |
1601 lib = TestCase::GetReloadErrorOrRootLibrary(); | 1603 lib = TestCase::GetReloadErrorOrRootLibrary(); |
1602 EXPECT_VALID(lib); | 1604 EXPECT_VALID(lib); |
1603 } | 1605 } |
1604 | 1606 |
1605 | 1607 |
1606 static void IsolateReload_DanlingGetter_LibraryReload( | 1608 static void IsolateReload_DanlingGetter_LibraryReload( |
1607 Dart_NativeArguments native_args) { | 1609 Dart_NativeArguments native_args) { |
1608 const char* kImportScript2 = | 1610 const char* kImportScript2 = "var x;\n"; |
1609 "var x;\n"; | |
1610 TestCase::AddTestLib("test:other", kImportScript2); | 1611 TestCase::AddTestLib("test:other", kImportScript2); |
1611 | 1612 |
1612 DART_CHECK_VALID(TestCase::TriggerReload()); | 1613 DART_CHECK_VALID(TestCase::TriggerReload()); |
1613 } | 1614 } |
1614 | 1615 |
1615 | 1616 |
1616 static Dart_NativeFunction IsolateReload_DanlingGetter_LibraryNativeResolver( | 1617 static Dart_NativeFunction IsolateReload_DanlingGetter_LibraryNativeResolver( |
1617 Dart_Handle name, | 1618 Dart_Handle name, |
1618 int num_of_arguments, | 1619 int num_of_arguments, |
1619 bool* auto_setup_scope) { | 1620 bool* auto_setup_scope) { |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1762 " C.y = 4;\n" | 1763 " C.y = 4;\n" |
1763 " var f = C#y=;\n" | 1764 " var f = C#y=;\n" |
1764 " var r1 = invoke(f, 5);\n" | 1765 " var r1 = invoke(f, 5);\n" |
1765 " reloadTest();\n" | 1766 " reloadTest();\n" |
1766 " var r2 = invoke(f, 6);\n" | 1767 " var r2 = invoke(f, 6);\n" |
1767 " return '$r1 $r2';\n" | 1768 " return '$r1 $r2';\n" |
1768 "}\n"; | 1769 "}\n"; |
1769 | 1770 |
1770 TestCase::SetReloadTestScript(kReloadScript); | 1771 TestCase::SetReloadTestScript(kReloadScript); |
1771 | 1772 |
1772 EXPECT_STREQ("5 NoSuchMethodError: No static setter 'y=' declared in " | 1773 EXPECT_STREQ( |
1773 "class 'C'.", SimpleInvokeStr(lib, "main")); | 1774 "5 NoSuchMethodError: No static setter 'y=' declared in " |
| 1775 "class 'C'.", |
| 1776 SimpleInvokeStr(lib, "main")); |
1774 | 1777 |
1775 lib = TestCase::GetReloadErrorOrRootLibrary(); | 1778 lib = TestCase::GetReloadErrorOrRootLibrary(); |
1776 EXPECT_VALID(lib); | 1779 EXPECT_VALID(lib); |
1777 } | 1780 } |
1778 | 1781 |
1779 | 1782 |
1780 static void IsolateReload_DanlingSetter_LibraryReload( | 1783 static void IsolateReload_DanlingSetter_LibraryReload( |
1781 Dart_NativeArguments native_args) { | 1784 Dart_NativeArguments native_args) { |
1782 const char* kImportScript2 = | 1785 const char* kImportScript2 = "var x;\n"; |
1783 "var x;\n"; | |
1784 TestCase::AddTestLib("test:other", kImportScript2); | 1786 TestCase::AddTestLib("test:other", kImportScript2); |
1785 | 1787 |
1786 DART_CHECK_VALID(TestCase::TriggerReload()); | 1788 DART_CHECK_VALID(TestCase::TriggerReload()); |
1787 } | 1789 } |
1788 | 1790 |
1789 | 1791 |
1790 static Dart_NativeFunction IsolateReload_DanlingSetter_LibraryNativeResolver( | 1792 static Dart_NativeFunction IsolateReload_DanlingSetter_LibraryNativeResolver( |
1791 Dart_Handle name, | 1793 Dart_Handle name, |
1792 int num_of_arguments, | 1794 int num_of_arguments, |
1793 bool* auto_setup_scope) { | 1795 bool* auto_setup_scope) { |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1876 " var c = new C();\n" | 1878 " var c = new C();\n" |
1877 " var f = c#foo;\n" | 1879 " var f = c#foo;\n" |
1878 " var r1 = invoke(f, 1);\n" | 1880 " var r1 = invoke(f, 1);\n" |
1879 " reloadTest();\n" | 1881 " reloadTest();\n" |
1880 " var r2 = invoke(f, 1);\n" | 1882 " var r2 = invoke(f, 1);\n" |
1881 " return '$r1 $r2';\n" | 1883 " return '$r1 $r2';\n" |
1882 "}\n"; | 1884 "}\n"; |
1883 | 1885 |
1884 TestCase::SetReloadTestScript(kReloadScript); | 1886 TestCase::SetReloadTestScript(kReloadScript); |
1885 | 1887 |
1886 EXPECT_STREQ("1 NoSuchMethodError: Class 'C' has no instance method " | 1888 EXPECT_STREQ( |
1887 "'foo' with matching arguments.", SimpleInvokeStr(lib, "main")); | 1889 "1 NoSuchMethodError: Class 'C' has no instance method " |
| 1890 "'foo' with matching arguments.", |
| 1891 SimpleInvokeStr(lib, "main")); |
1888 | 1892 |
1889 lib = TestCase::GetReloadErrorOrRootLibrary(); | 1893 lib = TestCase::GetReloadErrorOrRootLibrary(); |
1890 EXPECT_VALID(lib); | 1894 EXPECT_VALID(lib); |
1891 } | 1895 } |
1892 | 1896 |
1893 | 1897 |
1894 TEST_CASE(IsolateReload_TearOff_AddArguments2) { | 1898 TEST_CASE(IsolateReload_TearOff_AddArguments2) { |
1895 const char* kScript = | 1899 const char* kScript = |
1896 "import 'test:isolate_reload_helper';\n" | 1900 "import 'test:isolate_reload_helper';\n" |
1897 "class C {\n" | 1901 "class C {\n" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1930 "main() {\n" | 1934 "main() {\n" |
1931 " var f = C#foo;\n" | 1935 " var f = C#foo;\n" |
1932 " var r1 = invoke(f, 1);\n" | 1936 " var r1 = invoke(f, 1);\n" |
1933 " reloadTest();\n" | 1937 " reloadTest();\n" |
1934 " var r2 = invoke(f, 1);\n" | 1938 " var r2 = invoke(f, 1);\n" |
1935 " return '$r1 $r2';\n" | 1939 " return '$r1 $r2';\n" |
1936 "}\n"; | 1940 "}\n"; |
1937 | 1941 |
1938 TestCase::SetReloadTestScript(kReloadScript); | 1942 TestCase::SetReloadTestScript(kReloadScript); |
1939 | 1943 |
1940 EXPECT_STREQ("1 NoSuchMethodError: Closure call with mismatched arguments: " | 1944 EXPECT_STREQ( |
1941 "function 'C.foo'", SimpleInvokeStr(lib, "main")); | 1945 "1 NoSuchMethodError: Closure call with mismatched arguments: " |
| 1946 "function 'C.foo'", |
| 1947 SimpleInvokeStr(lib, "main")); |
1942 | 1948 |
1943 lib = TestCase::GetReloadErrorOrRootLibrary(); | 1949 lib = TestCase::GetReloadErrorOrRootLibrary(); |
1944 EXPECT_VALID(lib); | 1950 EXPECT_VALID(lib); |
1945 } | 1951 } |
1946 | 1952 |
1947 | 1953 |
1948 TEST_CASE(IsolateReload_EnumEquality) { | 1954 TEST_CASE(IsolateReload_EnumEquality) { |
1949 const char* kScript = | 1955 const char* kScript = |
1950 "enum Fruit {\n" | 1956 "enum Fruit {\n" |
1951 " Apple,\n" | 1957 " Apple,\n" |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2167 " Banana,\n" | 2173 " Banana,\n" |
2168 "}\n" | 2174 "}\n" |
2169 "var x;\n" | 2175 "var x;\n" |
2170 "main() {\n" | 2176 "main() {\n" |
2171 " String r = '$x ${x.hashCode is int} ${x.index}';\n" | 2177 " String r = '$x ${x.hashCode is int} ${x.index}';\n" |
2172 " return r;\n" | 2178 " return r;\n" |
2173 "}\n"; | 2179 "}\n"; |
2174 | 2180 |
2175 lib = TestCase::ReloadTestScript(kReloadScript); | 2181 lib = TestCase::ReloadTestScript(kReloadScript); |
2176 EXPECT_VALID(lib); | 2182 EXPECT_VALID(lib); |
2177 EXPECT_STREQ("Fruit.Cantalope true 2", | 2183 EXPECT_STREQ("Fruit.Cantalope true 2", SimpleInvokeStr(lib, "main")); |
2178 SimpleInvokeStr(lib, "main")); | |
2179 } | 2184 } |
2180 | 2185 |
2181 | 2186 |
2182 TEST_CASE(IsolateReload_EnumIdentityReload) { | 2187 TEST_CASE(IsolateReload_EnumIdentityReload) { |
2183 const char* kScript = | 2188 const char* kScript = |
2184 "enum Fruit {\n" | 2189 "enum Fruit {\n" |
2185 " Apple,\n" | 2190 " Apple,\n" |
2186 " Banana,\n" | 2191 " Banana,\n" |
2187 " Cantalope,\n" | 2192 " Cantalope,\n" |
2188 "}\n" | 2193 "}\n" |
(...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2874 EXPECT_STREQ("true", SimpleInvokeStr(lib, "main")); | 2879 EXPECT_STREQ("true", SimpleInvokeStr(lib, "main")); |
2875 } | 2880 } |
2876 | 2881 |
2877 | 2882 |
2878 static bool NothingModifiedCallback(const char* url, int64_t since) { | 2883 static bool NothingModifiedCallback(const char* url, int64_t since) { |
2879 return false; | 2884 return false; |
2880 } | 2885 } |
2881 | 2886 |
2882 | 2887 |
2883 TEST_CASE(IsolateReload_NoLibsModified) { | 2888 TEST_CASE(IsolateReload_NoLibsModified) { |
2884 const char* kImportScript = | 2889 const char* kImportScript = "importedFunc() => 'fancy';"; |
2885 "importedFunc() => 'fancy';"; | |
2886 TestCase::AddTestLib("test:lib1", kImportScript); | 2890 TestCase::AddTestLib("test:lib1", kImportScript); |
2887 | 2891 |
2888 const char* kScript = | 2892 const char* kScript = |
2889 "import 'test:lib1';\n" | 2893 "import 'test:lib1';\n" |
2890 "main() {\n" | 2894 "main() {\n" |
2891 " return importedFunc() + ' feast';\n" | 2895 " return importedFunc() + ' feast';\n" |
2892 "}\n"; | 2896 "}\n"; |
2893 | 2897 |
2894 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 2898 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
2895 EXPECT_VALID(lib); | 2899 EXPECT_VALID(lib); |
2896 EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main")); | 2900 EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main")); |
2897 | 2901 |
2898 const char* kReloadImportScript = | 2902 const char* kReloadImportScript = "importedFunc() => 'bossy';"; |
2899 "importedFunc() => 'bossy';"; | |
2900 TestCase::AddTestLib("test:lib1", kReloadImportScript); | 2903 TestCase::AddTestLib("test:lib1", kReloadImportScript); |
2901 | 2904 |
2902 const char* kReloadScript = | 2905 const char* kReloadScript = |
2903 "import 'test:lib1';\n" | 2906 "import 'test:lib1';\n" |
2904 "main() {\n" | 2907 "main() {\n" |
2905 " return importedFunc() + ' pants';\n" | 2908 " return importedFunc() + ' pants';\n" |
2906 "}\n"; | 2909 "}\n"; |
2907 | 2910 |
2908 Dart_SetFileModifiedCallback(&NothingModifiedCallback); | 2911 Dart_SetFileModifiedCallback(&NothingModifiedCallback); |
2909 lib = TestCase::ReloadTestScript(kReloadScript); | 2912 lib = TestCase::ReloadTestScript(kReloadScript); |
2910 EXPECT_VALID(lib); | 2913 EXPECT_VALID(lib); |
2911 Dart_SetFileModifiedCallback(NULL); | 2914 Dart_SetFileModifiedCallback(NULL); |
2912 | 2915 |
2913 // No reload occurred because no files were "modified". | 2916 // No reload occurred because no files were "modified". |
2914 EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main")); | 2917 EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main")); |
2915 } | 2918 } |
2916 | 2919 |
2917 | 2920 |
2918 static bool MainModifiedCallback(const char* url, int64_t since) { | 2921 static bool MainModifiedCallback(const char* url, int64_t since) { |
2919 if (strcmp(url, "test-lib") == 0) { | 2922 if (strcmp(url, "test-lib") == 0) { |
2920 return true; | 2923 return true; |
2921 } | 2924 } |
2922 return false; | 2925 return false; |
2923 } | 2926 } |
2924 | 2927 |
2925 | 2928 |
2926 TEST_CASE(IsolateReload_MainLibModified) { | 2929 TEST_CASE(IsolateReload_MainLibModified) { |
2927 const char* kImportScript = | 2930 const char* kImportScript = "importedFunc() => 'fancy';"; |
2928 "importedFunc() => 'fancy';"; | |
2929 TestCase::AddTestLib("test:lib1", kImportScript); | 2931 TestCase::AddTestLib("test:lib1", kImportScript); |
2930 | 2932 |
2931 const char* kScript = | 2933 const char* kScript = |
2932 "import 'test:lib1';\n" | 2934 "import 'test:lib1';\n" |
2933 "main() {\n" | 2935 "main() {\n" |
2934 " return importedFunc() + ' feast';\n" | 2936 " return importedFunc() + ' feast';\n" |
2935 "}\n"; | 2937 "}\n"; |
2936 | 2938 |
2937 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 2939 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
2938 EXPECT_VALID(lib); | 2940 EXPECT_VALID(lib); |
2939 EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main")); | 2941 EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main")); |
2940 | 2942 |
2941 const char* kReloadImportScript = | 2943 const char* kReloadImportScript = "importedFunc() => 'bossy';"; |
2942 "importedFunc() => 'bossy';"; | |
2943 TestCase::AddTestLib("test:lib1", kReloadImportScript); | 2944 TestCase::AddTestLib("test:lib1", kReloadImportScript); |
2944 | 2945 |
2945 const char* kReloadScript = | 2946 const char* kReloadScript = |
2946 "import 'test:lib1';\n" | 2947 "import 'test:lib1';\n" |
2947 "main() {\n" | 2948 "main() {\n" |
2948 " return importedFunc() + ' pants';\n" | 2949 " return importedFunc() + ' pants';\n" |
2949 "}\n"; | 2950 "}\n"; |
2950 | 2951 |
2951 Dart_SetFileModifiedCallback(&MainModifiedCallback); | 2952 Dart_SetFileModifiedCallback(&MainModifiedCallback); |
2952 lib = TestCase::ReloadTestScript(kReloadScript); | 2953 lib = TestCase::ReloadTestScript(kReloadScript); |
2953 EXPECT_VALID(lib); | 2954 EXPECT_VALID(lib); |
2954 Dart_SetFileModifiedCallback(NULL); | 2955 Dart_SetFileModifiedCallback(NULL); |
2955 | 2956 |
2956 // Imported library is not reloaded. | 2957 // Imported library is not reloaded. |
2957 EXPECT_STREQ("fancy pants", SimpleInvokeStr(lib, "main")); | 2958 EXPECT_STREQ("fancy pants", SimpleInvokeStr(lib, "main")); |
2958 } | 2959 } |
2959 | 2960 |
2960 | 2961 |
2961 static bool ImportModifiedCallback(const char* url, int64_t since) { | 2962 static bool ImportModifiedCallback(const char* url, int64_t since) { |
2962 if (strcmp(url, "test:lib1") == 0) { | 2963 if (strcmp(url, "test:lib1") == 0) { |
2963 return true; | 2964 return true; |
2964 } | 2965 } |
2965 return false; | 2966 return false; |
2966 } | 2967 } |
2967 | 2968 |
2968 | 2969 |
2969 TEST_CASE(IsolateReload_ImportedLibModified) { | 2970 TEST_CASE(IsolateReload_ImportedLibModified) { |
2970 const char* kImportScript = | 2971 const char* kImportScript = "importedFunc() => 'fancy';"; |
2971 "importedFunc() => 'fancy';"; | |
2972 TestCase::AddTestLib("test:lib1", kImportScript); | 2972 TestCase::AddTestLib("test:lib1", kImportScript); |
2973 | 2973 |
2974 const char* kScript = | 2974 const char* kScript = |
2975 "import 'test:lib1';\n" | 2975 "import 'test:lib1';\n" |
2976 "main() {\n" | 2976 "main() {\n" |
2977 " return importedFunc() + ' feast';\n" | 2977 " return importedFunc() + ' feast';\n" |
2978 "}\n"; | 2978 "}\n"; |
2979 | 2979 |
2980 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 2980 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
2981 EXPECT_VALID(lib); | 2981 EXPECT_VALID(lib); |
2982 EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main")); | 2982 EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main")); |
2983 | 2983 |
2984 const char* kReloadImportScript = | 2984 const char* kReloadImportScript = "importedFunc() => 'bossy';"; |
2985 "importedFunc() => 'bossy';"; | |
2986 TestCase::AddTestLib("test:lib1", kReloadImportScript); | 2985 TestCase::AddTestLib("test:lib1", kReloadImportScript); |
2987 | 2986 |
2988 const char* kReloadScript = | 2987 const char* kReloadScript = |
2989 "import 'test:lib1';\n" | 2988 "import 'test:lib1';\n" |
2990 "main() {\n" | 2989 "main() {\n" |
2991 " return importedFunc() + ' pants';\n" | 2990 " return importedFunc() + ' pants';\n" |
2992 "}\n"; | 2991 "}\n"; |
2993 | 2992 |
2994 Dart_SetFileModifiedCallback(&ImportModifiedCallback); | 2993 Dart_SetFileModifiedCallback(&ImportModifiedCallback); |
2995 lib = TestCase::ReloadTestScript(kReloadScript); | 2994 lib = TestCase::ReloadTestScript(kReloadScript); |
2996 EXPECT_VALID(lib); | 2995 EXPECT_VALID(lib); |
2997 Dart_SetFileModifiedCallback(NULL); | 2996 Dart_SetFileModifiedCallback(NULL); |
2998 | 2997 |
2999 // Modification of an imported library propagates to the importing library. | 2998 // Modification of an imported library propagates to the importing library. |
3000 EXPECT_STREQ("bossy pants", SimpleInvokeStr(lib, "main")); | 2999 EXPECT_STREQ("bossy pants", SimpleInvokeStr(lib, "main")); |
3001 } | 3000 } |
3002 | 3001 |
3003 | 3002 |
3004 TEST_CASE(IsolateReload_PrefixImportedLibModified) { | 3003 TEST_CASE(IsolateReload_PrefixImportedLibModified) { |
3005 const char* kImportScript = | 3004 const char* kImportScript = "importedFunc() => 'fancy';"; |
3006 "importedFunc() => 'fancy';"; | |
3007 TestCase::AddTestLib("test:lib1", kImportScript); | 3005 TestCase::AddTestLib("test:lib1", kImportScript); |
3008 | 3006 |
3009 const char* kScript = | 3007 const char* kScript = |
3010 "import 'test:lib1' as cobra;\n" | 3008 "import 'test:lib1' as cobra;\n" |
3011 "main() {\n" | 3009 "main() {\n" |
3012 " return cobra.importedFunc() + ' feast';\n" | 3010 " return cobra.importedFunc() + ' feast';\n" |
3013 "}\n"; | 3011 "}\n"; |
3014 | 3012 |
3015 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 3013 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
3016 EXPECT_VALID(lib); | 3014 EXPECT_VALID(lib); |
3017 EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main")); | 3015 EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main")); |
3018 | 3016 |
3019 const char* kReloadImportScript = | 3017 const char* kReloadImportScript = "importedFunc() => 'bossy';"; |
3020 "importedFunc() => 'bossy';"; | |
3021 TestCase::AddTestLib("test:lib1", kReloadImportScript); | 3018 TestCase::AddTestLib("test:lib1", kReloadImportScript); |
3022 | 3019 |
3023 const char* kReloadScript = | 3020 const char* kReloadScript = |
3024 "import 'test:lib1' as cobra;\n" | 3021 "import 'test:lib1' as cobra;\n" |
3025 "main() {\n" | 3022 "main() {\n" |
3026 " return cobra.importedFunc() + ' pants';\n" | 3023 " return cobra.importedFunc() + ' pants';\n" |
3027 "}\n"; | 3024 "}\n"; |
3028 | 3025 |
3029 Dart_SetFileModifiedCallback(&ImportModifiedCallback); | 3026 Dart_SetFileModifiedCallback(&ImportModifiedCallback); |
3030 lib = TestCase::ReloadTestScript(kReloadScript); | 3027 lib = TestCase::ReloadTestScript(kReloadScript); |
3031 EXPECT_VALID(lib); | 3028 EXPECT_VALID(lib); |
3032 Dart_SetFileModifiedCallback(NULL); | 3029 Dart_SetFileModifiedCallback(NULL); |
3033 | 3030 |
3034 // Modification of an prefix-imported library propagates to the | 3031 // Modification of an prefix-imported library propagates to the |
3035 // importing library. | 3032 // importing library. |
3036 EXPECT_STREQ("bossy pants", SimpleInvokeStr(lib, "main")); | 3033 EXPECT_STREQ("bossy pants", SimpleInvokeStr(lib, "main")); |
3037 } | 3034 } |
3038 | 3035 |
3039 | 3036 |
3040 static bool ExportModifiedCallback(const char* url, int64_t since) { | 3037 static bool ExportModifiedCallback(const char* url, int64_t since) { |
3041 if (strcmp(url, "test:exportlib") == 0) { | 3038 if (strcmp(url, "test:exportlib") == 0) { |
3042 return true; | 3039 return true; |
3043 } | 3040 } |
3044 return false; | 3041 return false; |
3045 } | 3042 } |
3046 | 3043 |
3047 | 3044 |
3048 TEST_CASE(IsolateReload_ExportedLibModified) { | 3045 TEST_CASE(IsolateReload_ExportedLibModified) { |
3049 const char* kImportScript = | 3046 const char* kImportScript = "export 'test:exportlib';"; |
3050 "export 'test:exportlib';"; | |
3051 TestCase::AddTestLib("test:importlib", kImportScript); | 3047 TestCase::AddTestLib("test:importlib", kImportScript); |
3052 | 3048 |
3053 const char* kExportScript = | 3049 const char* kExportScript = "exportedFunc() => 'fancy';"; |
3054 "exportedFunc() => 'fancy';"; | |
3055 TestCase::AddTestLib("test:exportlib", kExportScript); | 3050 TestCase::AddTestLib("test:exportlib", kExportScript); |
3056 | 3051 |
3057 const char* kScript = | 3052 const char* kScript = |
3058 "import 'test:importlib';\n" | 3053 "import 'test:importlib';\n" |
3059 "main() {\n" | 3054 "main() {\n" |
3060 " return exportedFunc() + ' feast';\n" | 3055 " return exportedFunc() + ' feast';\n" |
3061 "}\n"; | 3056 "}\n"; |
3062 | 3057 |
3063 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 3058 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
3064 EXPECT_VALID(lib); | 3059 EXPECT_VALID(lib); |
3065 EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main")); | 3060 EXPECT_STREQ("fancy feast", SimpleInvokeStr(lib, "main")); |
3066 | 3061 |
3067 const char* kReloadExportScript = | 3062 const char* kReloadExportScript = "exportedFunc() => 'bossy';"; |
3068 "exportedFunc() => 'bossy';"; | |
3069 TestCase::AddTestLib("test:exportlib", kReloadExportScript); | 3063 TestCase::AddTestLib("test:exportlib", kReloadExportScript); |
3070 | 3064 |
3071 const char* kReloadScript = | 3065 const char* kReloadScript = |
3072 "import 'test:importlib';\n" | 3066 "import 'test:importlib';\n" |
3073 "main() {\n" | 3067 "main() {\n" |
3074 " return exportedFunc() + ' pants';\n" | 3068 " return exportedFunc() + ' pants';\n" |
3075 "}\n"; | 3069 "}\n"; |
3076 | 3070 |
3077 Dart_SetFileModifiedCallback(&ExportModifiedCallback); | 3071 Dart_SetFileModifiedCallback(&ExportModifiedCallback); |
3078 lib = TestCase::ReloadTestScript(kReloadScript); | 3072 lib = TestCase::ReloadTestScript(kReloadScript); |
3079 EXPECT_VALID(lib); | 3073 EXPECT_VALID(lib); |
3080 Dart_SetFileModifiedCallback(NULL); | 3074 Dart_SetFileModifiedCallback(NULL); |
3081 | 3075 |
3082 // Modification of an exported library propagates. | 3076 // Modification of an exported library propagates. |
3083 EXPECT_STREQ("bossy pants", SimpleInvokeStr(lib, "main")); | 3077 EXPECT_STREQ("bossy pants", SimpleInvokeStr(lib, "main")); |
3084 } | 3078 } |
3085 | 3079 |
3086 | 3080 |
3087 TEST_CASE(IsolateReload_SimpleConstFieldUpdate) { | 3081 TEST_CASE(IsolateReload_SimpleConstFieldUpdate) { |
3088 const char* kScript = | 3082 const char* kScript = |
3089 "const value = 'a';\n" | 3083 "const value = 'a';\n" |
3090 "main() {\n" | 3084 "main() {\n" |
3091 " return 'value=${value}';\n" | 3085 " return 'value=${value}';\n" |
3092 "}\n"; | 3086 "}\n"; |
3093 | 3087 |
3094 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 3088 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
3095 EXPECT_VALID(lib); | 3089 EXPECT_VALID(lib); |
3096 EXPECT_STREQ("value=a", SimpleInvokeStr(lib, "main")); | 3090 EXPECT_STREQ("value=a", SimpleInvokeStr(lib, "main")); |
3097 | 3091 |
3098 const char* kReloadScript = | 3092 const char* kReloadScript = |
3099 "const value = 'b';\n" | 3093 "const value = 'b';\n" |
3100 "main() {\n" | 3094 "main() {\n" |
3101 " return 'value=${value}';\n" | 3095 " return 'value=${value}';\n" |
3102 "}\n"; | 3096 "}\n"; |
3103 | 3097 |
3104 lib = TestCase::ReloadTestScript(kReloadScript); | 3098 lib = TestCase::ReloadTestScript(kReloadScript); |
3105 EXPECT_VALID(lib); | 3099 EXPECT_VALID(lib); |
3106 EXPECT_STREQ("value=b", SimpleInvokeStr(lib, "main")); | 3100 EXPECT_STREQ("value=b", SimpleInvokeStr(lib, "main")); |
3107 } | 3101 } |
3108 | 3102 |
3109 | 3103 |
3110 TEST_CASE(IsolateReload_ConstFieldUpdate) { | 3104 TEST_CASE(IsolateReload_ConstFieldUpdate) { |
3111 const char* kScript = | 3105 const char* kScript = |
3112 "const value = const Duration(seconds: 1);\n" | 3106 "const value = const Duration(seconds: 1);\n" |
3113 "main() {\n" | 3107 "main() {\n" |
3114 " return 'value=${value}';\n" | 3108 " return 'value=${value}';\n" |
3115 "}\n"; | 3109 "}\n"; |
3116 | 3110 |
3117 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 3111 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
3118 EXPECT_VALID(lib); | 3112 EXPECT_VALID(lib); |
3119 EXPECT_STREQ("value=0:00:01.000000", SimpleInvokeStr(lib, "main")); | 3113 EXPECT_STREQ("value=0:00:01.000000", SimpleInvokeStr(lib, "main")); |
3120 | 3114 |
3121 const char* kReloadScript = | 3115 const char* kReloadScript = |
3122 "const value = const Duration(seconds: 2);\n" | 3116 "const value = const Duration(seconds: 2);\n" |
3123 "main() {\n" | 3117 "main() {\n" |
3124 " return 'value=${value}';\n" | 3118 " return 'value=${value}';\n" |
3125 "}\n"; | 3119 "}\n"; |
3126 | 3120 |
3127 lib = TestCase::ReloadTestScript(kReloadScript); | 3121 lib = TestCase::ReloadTestScript(kReloadScript); |
3128 EXPECT_VALID(lib); | 3122 EXPECT_VALID(lib); |
3129 EXPECT_STREQ("value=0:00:02.000000", SimpleInvokeStr(lib, "main")); | 3123 EXPECT_STREQ("value=0:00:02.000000", SimpleInvokeStr(lib, "main")); |
3130 } | 3124 } |
3131 | 3125 |
3132 #endif // !PRODUCT | 3126 #endif // !PRODUCT |
3133 | 3127 |
3134 } // namespace dart | 3128 } // namespace dart |
OLD | NEW |