21#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
27 int64_t integer_result = 0;
30 return integer_result;
35 const char* result_str =
nullptr;
58 const char* kReloadScript =
70 const char* kScriptChars =
82 const char* kUpdatedScriptChars =
108 nullptr ,
true ,
true );
113 EXPECT_EQ(42,
value);
126 const uint8_t* kernel_buffer =
nullptr;
127 intptr_t kernel_buffer_size = 0;
131 updated_sourcefiles, &kernel_buffer, &kernel_buffer_size,
134 EXPECT_NOTNULL(kernel_buffer);
142 EXPECT_EQ(24,
value);
145TEST_CASE(IsolateReload_KernelIncrementalCompileAppAndLib) {
149 "file:///test-app.dart",
150 "import 'test-lib.dart';\n"
152 " return WhatsTheMeaningOfAllThis();\n"
156 "file:///test-lib.dart",
157 "WhatsTheMeaningOfAllThis() {\n"
165 nullptr ,
true ,
true );
171 EXPECT_EQ(42,
value);
176 "file:///test-lib.dart",
177 "WhatsTheMeaningOfAllThis() {\n"
185 const uint8_t* kernel_buffer =
nullptr;
186 intptr_t kernel_buffer_size = 0;
188 "file:///test-app.dart",
190 updated_sourcefiles, &kernel_buffer, &kernel_buffer_size,
193 EXPECT_NOTNULL(kernel_buffer);
201 EXPECT_EQ(24,
value);
204TEST_CASE(IsolateReload_KernelIncrementalCompileGenerics) {
208 "file:///test-app.dart",
209 "import 'test-lib.dart';\n"
211 " int balance() => 42;\n"
213 "class MyAccountState extends State<Account> {\n"
214 " MyAccountState(Account a): super(a) {}\n"
217 " return (new MyAccountState(new Account()))\n"
218 " .howAreTheThings().balance();\n"
222 "file:///test-lib.dart",
226 " T howAreTheThings() => t;\n"
233 nullptr ,
true ,
true );
239 EXPECT_EQ(42,
value);
244 "file:///test-app.dart",
245 "import 'test-lib.dart';\n"
247 " int balance() => 24;\n"
249 "class MyAccountState extends State<Account> {\n"
250 " MyAccountState(Account a): super(a) {}\n"
253 " return (new MyAccountState(new Account()))\n"
254 " .howAreTheThings().balance();\n"
259 const uint8_t* kernel_buffer =
nullptr;
260 intptr_t kernel_buffer_size = 0;
262 "file:///test-app.dart",
264 updated_sourcefiles, &kernel_buffer, &kernel_buffer_size,
267 EXPECT_NOTNULL(kernel_buffer);
275 EXPECT_EQ(24,
value);
278TEST_CASE(IsolateReload_KernelIncrementalCompileBaseClass) {
283 "class State<T, U> {\n"
287 " t = l[0] is T ? l[0] : null;\n"
288 " u = l[1] is U ? l[1] : null;\n"
291 nullable_tag, nullable_tag),
295 "file:///test-app.dart",
296 "import 'test-util.dart';\n"
299 " return v == 42 ? 1 : v == null ? -1 : 0;\n"
303 "file:///test-lib.dart",
307 "file:///test-util.dart",
308 "import 'test-lib.dart';\n"
309 "class MyAccountState extends State<int, String> {\n"
310 " MyAccountState(List l): super(l) {}\n"
313 "doWork() => new MyAccountState(<dynamic>[42, 'abc']).first();\n"
320 nullptr ,
true ,
true );
328 auto kUpdatedSourceFile =
330 "class State<U, T> {\n"
334 " t = l[0] is T ? l[0] : null;\n"
335 " u = l[1] is U ? l[1] : null;\n"
338 nullable_tag, nullable_tag),
341 "file:///test-lib.dart",
342 kUpdatedSourceFile.get(),
345 const uint8_t* kernel_buffer =
nullptr;
346 intptr_t kernel_buffer_size = 0;
348 "file:///test-app.dart",
350 updated_sourcefiles, &kernel_buffer, &kernel_buffer_size,
353 EXPECT_NOTNULL(kernel_buffer);
361 EXPECT_EQ(-1,
value);
365 const char* kScript =
379 const char* kReloadScript =
382 " final a kjsdf ksjdf ;\n"
396 const char* kScript =
397 "init() => 'old value';\n"
398 "var value = init();\n"
400 " return 'init()=${init()},value=${value}';\n"
405 EXPECT_STREQ(
"init()=old value,value=old value",
408 const char* kReloadScript =
410 "init() => 'new value';\n"
411 "var value = init();\n"
413 " return 'init()=${init()},value=${value}';\n"
418 EXPECT_STREQ(
"init()=new value,value=old value",
424 const char* kScript =
427 " return x + 'diluvian';\n"
431 " closure = () { return magic().toString() + '!'; };\n"
432 " return closure();\n"
442 const char* kReloadScript =
444 " return 'postapocalyptic';\n"
448 " return closure();\n"
457 const char* kScript =
460 " return 'value1=${value1}';\n"
467 const char* kReloadScript =
471 " return 'value1=${value1},value2=${value2}';\n"
480 const char* kScript =
493 const char* kReloadScript =
509 const char* kScript =
523 const char* kReloadScript =
540 const char* kScript =
554 const char* kReloadScript =
569 const char* kScript =
578 const char* kReloadScript =
581 " toString() => 'hello from A';\n"
584 " return new A().toString();\n"
593 const char* kScript =
595 " toString() => 'hello from A';\n"
597 "List<dynamic> list = <dynamic>[];"
599 " list.add(new A());\n"
600 " return list[0].toString();\n"
607 const char* kReloadScript =
608 "List<dynamic> list = <dynamic>[];\n"
610 " return list[0].toString();\n"
619 const char* kScript =
621 " return max(3, 4);\n"
624 const char* kReloadScript =
625 "import 'dart:math';\n"
627 " return max(3, 4);\n"
640 const char* kScript =
641 "import 'dart:math';\n"
643 " return max(3, 4);\n"
650 const char* kReloadScript =
652 " return max(3, 4);\n"
660 const char* kScript =
669 intptr_t lib_id = -1;
670 bool debuggable =
false;
673 EXPECT_EQ(
true, debuggable);
676 EXPECT_EQ(
false, debuggable);
680 const char* kReloadScript =
691 intptr_t new_lib_id = -1;
694 EXPECT_EQ(
false, debuggable);
701 const char* kScript =
705 "var savedA = new A();\n"
707 " var newA = new A();\n"
708 " return 'saved:${savedA.field} new:${newA.field}';\n"
715 const char* kReloadScript =
719 "var savedA = new A();\n"
721 " var newA = new A();\n"
722 " return 'saved:${savedA.field} new:${newA.field}';\n"
737 " A() { field = 20; }\n"
739 "var savedA = A();\n"
742 " return 'saved:${savedA.field} new:${newA.field}';\n"
758 " A() { field = 10; }\n"
760 "var savedA = A();\n"
763 " return 'saved:${savedA.field} new:${newA.field}';\n"
775 const char* kScript =
778 "class B extends A {\n"
780 "var list = [ new A(), new B() ];\n"
782 " return (list.map((x) => '${x is A}/${x is B}')).toString();\n"
789 const char* kReloadScript =
793 "class A extends B {\n"
795 "var list = [ new A(), new B() ];\n"
797 " return (list.map((x) => '${x is A}/${x is B}')).toString();\n"
809 const char* kScript =
812 "class B<T extends A> {\n"
815 " return new B<A>().toString();\n"
822 const char* kReloadScript =
825 "class B<T extends A> {\n"
828 " return new B<A>().toString();\n"
837 const char* kScript =
838 "import 'file:///test:isolate_reload_helper';\n"
842 " var oldType = getType();\n"
844 " var newType = getType();\n"
845 " return identical(oldType, newType).toString();\n"
851 const char* kReloadScript =
852 "import 'file:///test:isolate_reload_helper';\n"
853 "class T extends Stopwatch { }\n"
856 " var oldType = getType();\n"
858 " var newType = getType();\n"
859 " return identical(oldType, newType).toString();\n"
868 const char* kScript =
869 "import 'file:///test:isolate_reload_helper';\n"
871 "getType() => new T<int>().runtimeType;\n"
873 " var oldType = getType();\n"
875 " var newType = getType();\n"
876 " return identical(oldType, newType).toString();\n"
882 const char* kReloadScript =
883 "import 'file:///test:isolate_reload_helper';\n"
884 "class T<G> extends Stopwatch { }\n"
885 "getType() => new T<int>().runtimeType;\n"
887 " var oldType = getType();\n"
889 " var newType = getType();\n"
890 " return identical(oldType, newType).toString();\n"
899 const char* kScript =
900 "import 'dart:mirrors';\n"
901 "import 'file:///test:isolate_reload_helper';\n"
903 "getTypeVar() => reflectType(T).typeVariables[0];\n"
905 " var oldType = getTypeVar();\n"
907 " var newType = getTypeVar();\n"
908 " return (oldType == newType).toString();\n"
914 const char* kReloadScript =
915 "import 'dart:mirrors';\n"
916 "import 'file:///test:isolate_reload_helper';\n"
917 "class T<G> extends Stopwatch { }\n"
918 "getTypeVar() => reflectType(T).typeVariables[0];\n"
920 " var oldType = getTypeVar();\n"
922 " var newType = getTypeVar();\n"
923 " return (oldType == newType).toString();\n"
932 const char* kScript =
934 " var field = 'mixin1';\n"
935 " func() => 'mixin1';\n"
937 "class B extends Object with Mixin1 {\n"
939 "var saved = new B();\n"
941 " return 'saved:field=${saved.field},func=${saved.func()}';\n"
946 EXPECT_STREQ(
"saved:field=mixin1,func=mixin1",
SimpleInvokeStr(lib,
"main"));
948 const char* kReloadScript =
950 " var field = 'mixin2';\n"
951 " func() => 'mixin2';\n"
953 "class B extends Object with Mixin2 {\n"
955 "var saved = new B();\n"
957 " var newer = new B();\n"
958 " return 'saved:field=${saved.field},func=${saved.func()} '\n"
959 " 'newer:field=${newer.field},func=${newer.func()}';\n"
968 "saved:field=mixin1,func=mixin2 "
969 "newer:field=mixin2,func=mixin2",
974 const char* kScript =
979 "class B extends A {\n"
980 " B(name) : super(name);\n"
982 "class C extends B {\n"
983 " C(name) : super(name);\n"
985 "var list = <dynamic>[ new A('a'), new B('b'), new C('c') ];\n"
987 " return (list.map((x) {\n"
988 " return '${x.name} is A(${x is A})/ B(${x is B})/ C(${x is C})';\n"
995 "(a is A(true)/ B(false)/ C(false),"
996 " b is A(true)/ B(true)/ C(false),"
997 " c is A(true)/ B(true)/ C(true))",
1000 const char* kReloadScript =
1005 "class X extends C {\n"
1006 " X(name) : super(name);\n"
1008 "class A extends X {\n"
1009 " A(name) : super(name);\n"
1013 " list.add(new X('x'));\n"
1014 " return (list.map((x) {\n"
1015 " return '${x.name} is A(${x is A})/ C(${x is C})/ X(${x is X})';\n"
1016 " })).toString();\n"
1022 "(a is A(true)/ C(true)/ X(true),"
1023 " b is A(true)/ C(true)/ X(true),"
1024 " c is A(false)/ C(true)/ X(false),"
1025 " x is A(false)/ C(true)/ X(true))",
1030 const char* kReloadScript2 =
1035 "class A extends X{\n"
1036 " A(name) : super(name);\n"
1038 "class B extends X {\n"
1039 " B(name) : super(name);\n"
1041 "class C extends A {\n"
1042 " C(name) : super(name);\n"
1046 " return (list.map((x) {\n"
1047 " return '${x.name} is '\n"
1048 " 'A(${x is A})/ B(${x is B})/ C(${x is C})/ X(${x is X})';\n"
1049 " })).toString();\n"
1055 "(a is A(true)/ B(false)/ C(false)/ X(true),"
1056 " b is A(false)/ B(true)/ C(false)/ X(true),"
1057 " c is A(true)/ B(false)/ C(true)/ X(true),"
1058 " x is A(false)/ B(false)/ C(false)/ X(true))",
1063 const char* kScript =
1064 "import 'file:///test:isolate_reload_helper';\n"
1066 "alpha() { var x = helper(); reloadTest(); return x + helper(); }\n"
1067 "foo() => alpha();\n"
1076 const char* kReloadScript =
1077 "import 'file:///test:isolate_reload_helper';\n"
1078 "helper() => 100;\n"
1079 "alpha() => 5 + helper();\n"
1080 "foo() => alpha();\n"
1096 const char* kImportScript =
"importedFunc() => 'a';\n";
1099 const char* kScript =
1112 const char* kReloadScript =
1113 "import 'test:lib1';\n"
1115 " return importedFunc();\n"
1137 const char* kImportScript =
"importedFunc() => 'a';\n";
1142 const char* kScript =
1143 "import 'test:lib1' hide importedFunc;\n"
1145 " return importedFunc();\n"
1155 const char* kReloadScript =
1156 "import 'test:lib1';\n"
1158 " return importedFunc();\n"
1167 const char* kImportScript =
1168 "importedFunc() => 'a';\n"
1169 "importedIntFunc() => 4;\n";
1174 const char* kScript =
1175 "import 'test:lib1' show importedIntFunc;\n"
1177 " return importedFunc();\n"
1180 " return importedIntFunc();\n"
1193 const char* kReloadScript =
1194 "import 'test:lib1' show importedFunc;\n"
1196 " return importedFunc();\n"
1199 " return importedIntFunc();\n"
1209 const char* kImportScript =
"importedIntFunc() => 4;\n";
1212 const char* kScript =
1213 "import 'file:///test:isolate_reload_helper';\n"
1214 "import 'test:lib1' show importedIntFunc;\n"
1216 " var x = importedIntFunc();\n"
1217 " var y = importedIntFunc();\n"
1234 const char* kImportScript =
1235 "mixin ImportedMixin {\n"
1236 " mixinFunc() => 'mixin';\n"
1240 const char* kScript =
1241 "import 'test:lib1' show ImportedMixin;\n"
1242 "class A extends Object with ImportedMixin {\n"
1244 "var func = new A().mixinFunc;\n"
1254 const char* kReloadScript =
1255 "import 'test:lib1' show ImportedMixin;\n"
1256 "class A extends Object with ImportedMixin {\n"
1269 const char* kScript =
1278 const char* kReloadScript =
1279 "kjsadkfjaksldfjklsadf;\n"
1286 "Variables must be declared using the keywords"
1287 " 'const', 'final', 'var' or a type name.");
1290TEST_CASE(IsolateReload_PendingUnqualifiedCall_StaticToInstance) {
1291 const char* kScript =
1292 "import 'file:///test:isolate_reload_helper';\n"
1294 " static foo() => 'static';\n"
1301 " return new C().test();\n"
1307 const char* kReloadScript =
1308 "import 'file:///test:isolate_reload_helper';\n"
1310 " foo() => 'instance';\n"
1317 " return new C().test();\n"
1322 const char* expected =
"instance";
1324 EXPECT_STREQ(expected,
result);
1327 if ((
result ==
nullptr) || (strcmp(expected,
result) != 0)) {
1336TEST_CASE(IsolateReload_PendingUnqualifiedCall_InstanceToStatic) {
1337 const char* kScript =
1338 "import 'file:///test:isolate_reload_helper';\n"
1340 " foo() => 'instance';\n"
1347 " return new C().test();\n"
1353 const char* kReloadScript =
1354 "import 'file:///test:isolate_reload_helper';\n"
1356 " static foo() => 'static';\n"
1363 " return new C().test();\n"
1367 const char* expected =
"static";
1374 EXPECT_STREQ(expected,
result);
1381TEST_CASE(IsolateReload_PendingConstructorCall_AbstractToConcrete) {
1382 const char* kScript =
1383 "import 'file:///test:isolate_reload_helper';\n"
1384 "abstract class Foo {}\n"
1392 " new C().test();\n"
1395 " return 'exception';\n"
1402 const char* kReloadScript =
1403 "import 'file:///test:isolate_reload_helper';\n"
1408 " return new Foo();\n"
1413 " new C().test();\n"
1416 " return 'exception';\n"
1422 const char* expected =
"okay";
1424 EXPECT_STREQ(expected,
result);
1427 if ((
result ==
nullptr) || (strcmp(expected,
result) != 0)) {
1436TEST_CASE(IsolateReload_PendingConstructorCall_ConcreteToAbstract) {
1437 const char* kScript =
1438 "import 'file:///test:isolate_reload_helper';\n"
1443 " return new Foo();\n"
1448 " new C().test();\n"
1451 " return 'exception';\n"
1458 const char* kReloadScript =
1459 "import 'file:///test:isolate_reload_helper';\n"
1460 "abstract class Foo {}\n"
1464 " return new Foo();\n"
1469 " new C().test();\n"
1472 " return 'exception';\n"
1481 const char* kScript =
1482 "import 'file:///test:isolate_reload_helper';\n"
1484 " static foo() => 'static';\n"
1487 " return C.foo();\n"
1492 " return new C().test();\n"
1494 " return 'exception';\n"
1501 const char* kReloadScript =
1502 "import 'file:///test:isolate_reload_helper';\n"
1506 " return C.foo();\n"
1511 " return new C().test();\n"
1513 " return 'exception';\n"
1518 const char* expected =
"exception";
1526 EXPECT_STREQ(expected,
result);
1534 const char* kScript =
1535 "import 'file:///test:isolate_reload_helper';\n"
1539 " return C.foo();\n"
1544 " return new C().test();\n"
1546 " return 'exception';\n"
1553 const char* kReloadScript =
1554 "import 'file:///test:isolate_reload_helper';\n"
1556 " static foo() => 'static';\n"
1559 " return C.foo();\n"
1564 " return new C().test();\n"
1566 " return 'exception';\n"
1572 const char* expected =
"static";
1579 EXPECT_STREQ(expected,
result);
1587 const char* kScript =
1588 "import 'file:///test:isolate_reload_helper';\n"
1592 "class C extends S {\n"
1595 " var n = super.foo();\n"
1597 " return n + super.foo();\n"
1601 " return new C().test();\n"
1607 const char* kReloadScript =
1608 "import 'file:///test:isolate_reload_helper';\n"
1612 "class C extends S {\n"
1615 " var n = super.foo();\n"
1617 " return n + super.foo();\n"
1621 " return new C().test();\n"
1630 const char* kScript =
1631 "import 'file:///test:isolate_reload_helper';\n"
1633 " foo() => 'old';\n"
1636 " var c = new C();\n"
1637 " var f1 = c.foo;\n"
1639 " var f2 = c.foo;\n"
1640 " return '${f1()} ${f2()} ${f1 == f2} ${identical(f1, f2)}';\n"
1646 const char* kReloadScript =
1647 "import 'file:///test:isolate_reload_helper';\n"
1649 " foo() => 'new';\n"
1652 " var c = new C();\n"
1653 " var f1 = c.foo;\n"
1655 " var f2 = c.foo;\n"
1656 " return '${f1()} ${f2()} ${f1 == f2} ${identical(f1, f2)}';\n"
1668 const char* kScript =
1669 "import 'file:///test:isolate_reload_helper';\n"
1671 " static foo() => 'old';\n"
1674 " var f1 = C.foo;\n"
1682 const char* kReloadScript =
1683 "import 'file:///test:isolate_reload_helper';\n"
1685 " static foo(i) => 'new:$i';\n"
1688 " var f1 = C.foo;\n"
1698 "/test-lib:8:12: Error: Too few positional"
1699 " arguments: 1 required, 0 given.\n"
1705 const char* kScript =
1706 "import 'file:///test:isolate_reload_helper';\n"
1708 " static foo({String bar = 'bar'}) => 'old';\n"
1711 " var f1 = C.foo;\n"
1715 " } catch(e) { return '$e'; }\n"
1721 const char* kReloadScript =
1722 "import 'file:///test:isolate_reload_helper';\n"
1730 " } catch(e) { return '$e'; }\n"
1736 "NoSuchMethodError: No static method 'foo' declared in class 'C'.",
1744 const char* kScript =
1745 "import 'file:///test:isolate_reload_helper';\n"
1747 " static foo() => 'old';\n"
1749 "getFoo() => C.foo;\n"
1751 " var f1 = getFoo();\n"
1753 " var f2 = getFoo();\n"
1754 " return '${f1()} ${f2()} ${f1 == f2} ${identical(f1, f2)}';\n"
1760 const char* kReloadScript =
1761 "import 'file:///test:isolate_reload_helper';\n"
1763 " static foo() => 'new';\n"
1765 "getFoo() => C.foo;\n"
1767 " var f1 = getFoo();\n"
1769 " var f2 = getFoo();\n"
1770 " return '${f1()} ${f2()} ${f1 == f2} ${identical(f1, f2)}';\n"
1782 const char* kScript =
1783 "import 'file:///test:isolate_reload_helper';\n"
1785 "getFoo() => foo;\n"
1787 " var f1 = getFoo();\n"
1789 " var f2 = getFoo();\n"
1790 " return '${f1()} ${f2()} ${f1 == f2} ${identical(f1, f2)}';\n"
1796 const char* kReloadScript =
1797 "import 'file:///test:isolate_reload_helper';\n"
1799 "getFoo() => foo;\n"
1801 " var f1 = getFoo();\n"
1803 " var f2 = getFoo();\n"
1804 " return '${f1()} ${f2()} ${f1 == f2} ${identical(f1, f2)}';\n"
1816 const char* kScript =
1817 "import 'file:///test:isolate_reload_helper';\n"
1819 " foo() => 'old';\n"
1821 "List list = List<dynamic>.filled(2, null);\n"
1822 "Set set = Set();\n"
1825 " list[0] = c.foo;\n"
1826 " list[1] = c.foo;\n"
1827 " set.add(c.foo);\n"
1828 " set.add(c.foo);\n"
1829 " int countBefore = set.length;\n"
1831 " list[1] = c.foo;\n"
1832 " set.add(c.foo);\n"
1833 " set.add(c.foo);\n"
1834 " int countAfter = set.length;\n"
1835 " return '${list[0]()} ${list[1]()} ${list[0] == list[1]} '\n"
1836 " '${countBefore == 1} ${countAfter == 1} ${(set.first)()} '\n"
1837 " '${set.first == c.foo} ${set.first == c.foo} '\n"
1838 " '${set.remove(c.foo)}';\n"
1844 const char* kReloadScript =
1845 "import 'file:///test:isolate_reload_helper';\n"
1847 " foo() => 'new';\n"
1849 "List list = List<dynamic>.filled(2, null);\n"
1850 "Set set = Set();\n"
1853 " list[0] = c.foo;\n"
1854 " list[1] = c.foo;\n"
1855 " set.add(c.foo);\n"
1856 " set.add(c.foo);\n"
1857 " int countBefore = set.length;\n"
1859 " list[1] = c.foo;\n"
1860 " set.add(c.foo);\n"
1861 " set.add(c.foo);\n"
1862 " int countAfter = set.length;\n"
1863 " return '${list[0]()} ${list[1]()} ${list[0] == list[1]} '\n"
1864 " '${countBefore == 1} ${countAfter == 1} ${(set.first)()} '\n"
1865 " '${set.first == c.foo} ${set.first == c.foo} '\n"
1866 " '${set.remove(c.foo)}';\n"
1871 EXPECT_STREQ(
"new new true true true new true true true",
1879 const char* kScript =
1880 "import 'file:///test:isolate_reload_helper';\n"
1888 " return e.toString().split('\\n').first;\n"
1892 " var c = new C();\n"
1894 " var r1 = invoke(f, 1);\n"
1896 " var r2 = invoke(f, 1);\n"
1897 " return '$r1 $r2';\n"
1903 const char* kReloadScript =
1904 "import 'file:///test:isolate_reload_helper';\n"
1906 " foo(x, y, z) => x + y + z;\n"
1912 " return e.toString().split('\\n').first;\n"
1916 " var c = new C();\n"
1918 " var r1 = invoke(f, 1);\n"
1920 " var r2 = invoke(f, 1);\n"
1921 " return '$r1 $r2';\n"
1927 "1 NoSuchMethodError: Class 'C' has no instance method "
1928 "'foo' with matching arguments.",
1936 const char* kScript =
1937 "import 'file:///test:isolate_reload_helper';\n"
1939 " static foo(x) => x;\n"
1945 " return e.toString().split('\\n').first;\n"
1950 " var r1 = invoke(f, 1);\n"
1952 " var r2 = invoke(f, 1);\n"
1953 " return '$r1 $r2';\n"
1959 const char* kReloadScript =
1960 "import 'file:///test:isolate_reload_helper';\n"
1962 " static foo(x, y, z) => x + y + z;\n"
1968 " return e.toString().split('\\n').first;\n"
1973 " var r1 = invoke(f, 1);\n"
1975 " var r2 = invoke(f, 1);\n"
1976 " return '$r1 $r2';\n"
1982 "1 NoSuchMethodError: Closure call with mismatched arguments: "
1991 const char* kScript =
1998 " x = Fruit.Banana;\n"
1999 " return Fruit.Apple.toString();\n"
2007 const char* kReloadScript =
2014 " if (x == Fruit.Banana) {\n"
2027 const char* kScript =
2034 " x = Fruit.Banana;\n"
2035 " return Fruit.Apple.toString();\n"
2042 const char* kReloadScript =
2049 " if (identical(x, Fruit.Banana)) {\n"
2062 const char* kScript =
2069 " x = Fruit.Banana;\n"
2070 " return Fruit.Apple.toString();\n"
2077 const char* kReloadScript =
2084 " if (identical(x, Fruit.Banana)) {\n"
2097 const char* kScript =
2104 " return Fruit.Apple.toString();\n"
2111 const char* kReloadScript =
2119 " String r = '${Fruit.Apple.index}/${Fruit.Apple} ';\n"
2120 " r += '${Fruit.Cantaloupe.index}/${Fruit.Cantaloupe} ';\n"
2121 " r += '${Fruit.Banana.index}/${Fruit.Banana}';\n"
2127 EXPECT_STREQ(
"0/Fruit.Apple 1/Fruit.Cantaloupe 2/Fruit.Banana",
2132 const char* kScript =
2137 " return Fruit.Apple.toString();\n"
2144 const char* kReloadScript =
2146 " final int zero = 0;\n"
2149 " return new Fruit().zero.toString();\n"
2157 const char* kScript =
2159 " final int zero = 0;\n"
2162 " return new Fruit().zero.toString();\n"
2169 const char* kReloadScript =
2174 " return Fruit.Apple.toString();\n"
2182 const char* kScript =
2190 " x = Fruit.Cantaloupe;\n"
2191 " return Fruit.Apple.toString();\n"
2201 const char* kReloadScript =
2208 " String r = '$x ${x.hashCode is int} ${x.index}';\n"
2214 EXPECT_STREQ(
"Fruit.Deleted enum value from Fruit true -1",
2219 const char* kScript =
2230 " x = { Fruit.Apple: Fruit.Apple.index,\n"
2231 " Fruit.Banana: Fruit.Banana.index,\n"
2232 " Fruit.Cantaloupe: Fruit.Cantaloupe.index};\n"
2233 " y = Fruit.Apple;\n"
2234 " z = Fruit.Banana;\n"
2235 " w = Fruit.Cantaloupe;\n"
2236 " return Fruit.Apple.toString();\n"
2243 const char* kReloadScript =
2253 "bool identityCheck(Fruit f, int index) {\n"
2254 " return identical(Fruit.values[index], f);\n"
2258 " x.forEach((key, value) {\n"
2259 " r += '${identityCheck(key, value)} ';\n"
2261 " r += '${x[Fruit.Apple] == Fruit.Apple.index} ';\n"
2262 " r += '${x[Fruit.Banana] == Fruit.Banana.index} ';\n"
2263 " r += '${x[Fruit.Cantaloupe] == Fruit.Cantaloupe.index} ';\n"
2264 " r += '${identical(y, Fruit.values[x[Fruit.Apple]])} ';\n"
2265 " r += '${identical(z, Fruit.values[x[Fruit.Banana]])} ';\n"
2266 " r += '${identical(w, Fruit.values[x[Fruit.Cantaloupe]])} ';\n"
2272 EXPECT_STREQ(
"true true true true true true true true true ",
2277 const char* kScript =
2278 "enum Fruit { Apple, Banana }\n"
2281 " retained = Fruit.Apple;\n"
2282 " return retained.toString();\n"
2289 const char* kReloadScript =
2291 " Apple('Apple', 'A'),\n"
2292 " Banana('Banana', 'B');\n"
2293 " const Fruit(this.name, this.initial);\n"
2294 " final String name;\n"
2295 " final String initial;\n"
2299 " return retained.initial;\n"
2308 const char* kScript =
2309 "enum Fruit { Apple, Banana }\n"
2312 " retained = Fruit.Apple;\n"
2313 " return retained.toString();\n"
2320 const char* kReloadScript =
2322 " Apple('Apple', 'A'),\n"
2323 " Banana('Banana', 'B'),\n"
2324 " Cherry('Cherry', 'C');\n"
2325 " const Fruit(this.name, this.initial);\n"
2326 " final String name;\n"
2327 " final String initial;\n"
2331 " return Fruit.Cherry.initial;\n"
2340 const char* kScript =
2341 "enum Fruit { Apple, Banana }\n"
2344 " retained = Fruit.Banana;\n"
2345 " return retained.toString();\n"
2352 const char* kReloadScript =
2354 " Apple('Apple', 'A');\n"
2355 " const Fruit(this.name, this.initial);\n"
2356 " final String name;\n"
2357 " final String initial;\n"
2361 " return retained.toString();\n"
2366 EXPECT_STREQ(
"Fruit.Deleted enum value from Fruit",
2371 const char* kScript =
2374 " const Box(this.x);\n"
2377 " Apple('Apple', const Box('A')),\n"
2378 " Banana('Banana', const Box('B')),\n"
2379 " Cherry('Cherry', const Box('C')),\n"
2380 " Durian('Durian', const Box('D')),\n"
2381 " Elderberry('Elderberry', const Box('E')),\n"
2382 " Fig('Fig', const Box('F')),\n"
2383 " Grape('Grape', const Box('G')),\n"
2384 " Huckleberry('Huckleberry', const Box('H')),\n"
2385 " Jackfruit('Jackfruit', const Box('J'));\n"
2386 " const Fruit(this.name, this.initial);\n"
2387 " final String name;\n"
2388 " final Box initial;\n"
2392 " retained = Fruit.Apple;\n"
2393 " return retained.toString();\n"
2400 const char* kReloadScript =
2405 " const Box(this.x, this.y, this.z);\n"
2408 " Apple('Apple', const Box('A', 0, 0)),\n"
2409 " Banana('Banana', const Box('B', 0, 0)),\n"
2410 " Cherry('Cherry', const Box('C', 0, 0)),\n"
2411 " Durian('Durian', const Box('D', 0, 0)),\n"
2412 " Elderberry('Elderberry', const Box('E', 0, 0)),\n"
2413 " Fig('Fig', const Box('F', 0, 0)),\n"
2414 " Grape('Grape', const Box('G', 0, 0)),\n"
2415 " Huckleberry('Huckleberry', const Box('H', 0, 0)),\n"
2416 " Jackfruit('Jackfruit', const Box('J', 0, 0)),\n"
2417 " Lemon('Lemon', const Box('L', 0, 0));\n"
2418 " const Fruit(this.name, this.initial);\n"
2419 " final String name;\n"
2420 " final Box initial;\n"
2424 " return retained.toString();\n"
2433 const char* kScript =
2435 " final String name;\n"
2436 " const Fruit(this.name);\n"
2437 " String toString() => name;\n"
2441 " x = const Fruit('Pear');\n"
2442 " return x.toString();\n"
2449 const char* kReloadScript =
2451 " final String name;\n"
2452 " const Fruit(this.name);\n"
2453 " String toString() => name;\n"
2457 " if (identical(x, const Fruit('Pear'))) {\n"
2470 const char* kScript =
2471 "deleted() { return 'hello'; }\n"
2474 " retained = () => deleted();\n"
2475 " return retained();\n"
2482 const char* kReloadScript =
2486 " return retained();\n"
2488 " return e.toString();\n"
2495 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
2496 EXPECT_SUBSTRING(
"deleted",
result);
2499TEST_CASE(IsolateReload_CallDeleted_TopLevelFunctionArityChange) {
2500 const char* kScript =
2501 "deleted() { return 'hello'; }\n"
2504 " retained = () => deleted();\n"
2505 " return retained();\n"
2512 const char* kReloadScript =
2513 "deleted(newParameter) { return 'hello'; }\n"
2517 " return retained();\n"
2519 " return e.toString();\n"
2526 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
2527 EXPECT_SUBSTRING(
"deleted",
result);
2530TEST_CASE(IsolateReload_CallDeleted_TopLevelAddTypeArguments) {
2531 const char* kScript =
2532 "deleted() { return 'hello'; }\n"
2535 " retained = () => deleted();\n"
2536 " return retained();\n"
2543 const char* kReloadScript =
2544 "deleted<A, B, C>() { return 'hello'; }\n"
2548 " return retained();\n"
2550 " return e.toString();\n"
2559TEST_CASE(IsolateReload_CallDeleted_TopLevelRemoveTypeArguments) {
2560 const char* kScript =
2561 "deleted<A, B, C>() { return 'hello'; }\n"
2564 " retained = () => deleted<int, int, int>();\n"
2565 " return retained();\n"
2572 const char* kReloadScript =
2573 "deleted() { return 'hello'; }\n"
2577 " return retained();\n"
2579 " return e.toString();\n"
2586 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
2587 EXPECT_SUBSTRING(
"deleted",
result);
2590TEST_CASE(IsolateReload_CallDeleted_TopLevelMissingPassingTypeArguments) {
2591 const char* kScript =
2592 "deleted<A, B, C>() { return 'hello'; }\n"
2595 " retained = () => deleted<int, int, int>();\n"
2596 " return retained();\n"
2603 const char* kReloadScript =
2607 " return retained();\n"
2609 " return e.toString();\n"
2616 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
2617 EXPECT_SUBSTRING(
"deleted",
result);
2620TEST_CASE(IsolateReload_CallDeleted_TopLevelFunctionEvaluationOrder) {
2621 const char* kScript =
2622 "first(flag) { if (flag) throw 'first!'; }\n"
2623 "deleted(_) { return 'hello'; }\n"
2626 " retained = (bool flag) => deleted(first(flag));\n"
2627 " return retained(false);\n"
2634 const char* kReloadScript =
2635 "first(flag) { if (flag) throw 'first!'; }\n"
2639 " return retained(true);\n"
2641 " return e.toString();\n"
2648 EXPECT_STREQ(
"first!",
result);
2651TEST_CASE(IsolateReload_CallDeleted_TopLevelFunctionLibraryDeleted) {
2655 "file:///test-app.dart",
2657 "import 'test-lib.dart';\n"
2660 " retained = () => deleted();\n"
2661 " return retained();\n"
2665 "file:///test-lib.dart",
2667 "deleted() { return 'hello'; }\n",
2674 NULL ,
true ,
true );
2681 "file:///test-app.dart",
2686 " return retained();\n"
2688 " return e.toString();\n"
2695 const uint8_t* kernel_buffer = NULL;
2696 intptr_t kernel_buffer_size = 0;
2698 "file:///test-app.dart",
2700 updated_sourcefiles, &kernel_buffer, &kernel_buffer_size,
2703 EXPECT_NOTNULL(kernel_buffer);
2708 EXPECT_STREQ(
result,
"hello");
2716 const char* kScript =
2717 "get deleted { return 'hello'; }\n"
2720 " retained = () => deleted;\n"
2721 " return retained();\n"
2728 const char* kReloadScript =
2732 " return retained();\n"
2734 " return e.toString();\n"
2741 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
2742 EXPECT_SUBSTRING(
"deleted",
result);
2746 const char* kScript =
2747 "set deleted(x) {}\n"
2750 " retained = () => deleted = 'hello';\n"
2751 " return retained();\n"
2758 const char* kReloadScript =
2762 " return retained();\n"
2764 " return e.toString();\n"
2771 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
2772 EXPECT_SUBSTRING(
"deleted",
result);
2775TEST_CASE(IsolateReload_CallDeleted_TopLevelSetterEvaluationOrder) {
2776 const char* kScript =
2777 "first(flag) { if (flag) throw 'first!'; return 'hello'; }\n"
2778 "set deleted(x) {}\n"
2781 " retained = (bool flag) => deleted = first(flag);\n"
2782 " return retained(false);\n"
2789 const char* kReloadScript =
2790 "first(flag) { if (flag) throw 'first!'; return 'hello'; }\n"
2794 " return retained(true);\n"
2796 " return e.toString();\n"
2803 EXPECT_STREQ(
"first!",
result);
2807 const char* kScript =
2808 "class C { static deleted() { return 'hello'; } }\n"
2811 " retained = () => C.deleted();\n"
2812 " return retained();\n"
2819 const char* kReloadScript =
2823 " return retained();\n"
2825 " return e.toString();\n"
2832 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
2833 EXPECT_SUBSTRING(
"deleted",
result);
2836TEST_CASE(IsolateReload_CallDeleted_ClassFunctionArityChange) {
2837 const char* kScript =
2838 "class C { static deleted() { return 'hello'; } }\n"
2841 " retained = () => C.deleted();\n"
2842 " return retained();\n"
2849 const char* kReloadScript =
2850 "class C { static deleted(newParameter) { return 'hello'; } }\n"
2854 " return retained();\n"
2856 " return e.toString();\n"
2863 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
2864 EXPECT_SUBSTRING(
"deleted",
result);
2867TEST_CASE(IsolateReload_CallDeleted_ClassFunctionEvaluationOrder) {
2868 const char* kScript =
2869 "first(flag) { if (flag) throw 'first!'; }\n"
2870 "class C { static deleted(_) { return 'hello'; } }\n"
2873 " retained = (bool flag) => C.deleted(first(flag));\n"
2874 " return retained(false);\n"
2881 const char* kReloadScript =
2882 "first(flag) { if (flag) throw 'first!'; }\n"
2887 " return retained(true);\n"
2889 " return e.toString();\n"
2896 EXPECT_STREQ(
"first!",
result);
2900 const char* kScript =
2901 "class C { static get deleted { return 'hello'; } }\n"
2904 " retained = () => C.deleted;\n"
2905 " return retained();\n"
2912 const char* kReloadScript =
2916 " return retained();\n"
2918 " return e.toString();\n"
2925 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
2926 EXPECT_SUBSTRING(
"deleted",
result);
2930 const char* kScript =
2931 "class C { static set deleted(x) {}}\n"
2934 " retained = () => C.deleted = 'hello';\n"
2935 " return retained();\n"
2942 const char* kReloadScript =
2946 " return retained();\n"
2948 " return e.toString();\n"
2955 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
2956 EXPECT_SUBSTRING(
"deleted",
result);
2959TEST_CASE(IsolateReload_CallDeleted_ClassSetterEvaluationOrder) {
2960 const char* kScript =
2961 "first(flag) { if (flag) throw 'first!'; return 'hello'; }\n"
2962 "class C { static set deleted(x) {}}\n"
2965 " retained = (bool flag) => C.deleted = first(flag);\n"
2966 " return retained(false);\n"
2973 const char* kReloadScript =
2974 "first(flag) { if (flag) throw 'first!'; return 'hello'; }\n"
2978 " return retained(true);\n"
2980 " return e.toString();\n"
2987 EXPECT_STREQ(
"first!",
result);
2990TEST_CASE(IsolateReload_CallDeleted_ClassGenerativeConstructor) {
2991 const char* kScript =
2992 "class C { C.deleted(); }\n"
2995 " retained = () => C.deleted().toString();\n"
2996 " return retained();\n"
3003 const char* kReloadScript =
3008 " return retained();\n"
3010 " return e.toString();\n"
3017 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
3018 EXPECT_SUBSTRING(
"deleted",
result);
3021TEST_CASE(IsolateReload_CallDeleted_ClassGenerativeConstructorArityChange) {
3022 const char* kScript =
3023 "class C { C.deleted(); }\n"
3026 " retained = () => C.deleted().toString();\n"
3027 " return retained();\n"
3034 const char* kReloadScript =
3035 "class C { C.deleted(newParameter); }\n"
3039 " return retained();\n"
3041 " return e.toString();\n"
3048 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
3049 EXPECT_SUBSTRING(
"deleted",
result);
3052TEST_CASE(IsolateReload_CallDeleted_ClassGenerativeConstructorClassDeleted) {
3053 const char* kScript =
3054 "class C { C.deleted(); }\n"
3057 " retained = () => C.deleted().toString();\n"
3058 " return retained();\n"
3065 const char* kReloadScript =
3069 " return retained();\n"
3071 " return e.toString();\n"
3078 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
3079 EXPECT_SUBSTRING(
"deleted",
result);
3082TEST_CASE(IsolateReload_CallDeleted_ClassFactoryConstructor) {
3083 const char* kScript =
3084 "class C { factory C.deleted() => new C(); C(); }\n"
3087 " retained = () => C.deleted().toString();\n"
3088 " return retained();\n"
3095 const char* kReloadScript =
3100 " return retained();\n"
3102 " return e.toString();\n"
3109 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
3110 EXPECT_SUBSTRING(
"deleted",
result);
3113TEST_CASE(IsolateReload_CallDeleted_ClassFactoryConstructorArityChange) {
3114 const char* kScript =
3115 "class C { factory C.deleted() => new C(); C(); }\n"
3118 " retained = () => C.deleted().toString();\n"
3119 " return retained();\n"
3126 const char* kReloadScript =
3127 "class C { factory C.deleted(newParameter) => new C(); C(); }\n"
3131 " return retained();\n"
3133 " return e.toString();\n"
3140 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
3141 EXPECT_SUBSTRING(
"deleted",
result);
3144TEST_CASE(IsolateReload_CallDeleted_ClassFactoryConstructorClassDeleted) {
3145 const char* kScript =
3146 "class C { factory C.deleted() => new C(); C(); }\n"
3149 " retained = () => C.deleted().toString();\n"
3150 " return retained();\n"
3157 const char* kReloadScript =
3161 " return retained();\n"
3163 " return e.toString();\n"
3170 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
3171 EXPECT_SUBSTRING(
"deleted",
result);
3175 const char* kScript =
3176 "class C { deleted() { return 'hello'; } }\n"
3177 "class D extends C { curry() => () => super.deleted(); }\n"
3180 " retained = new D().curry();\n"
3181 " return retained();\n"
3188 const char* kReloadScript =
3190 "class D extends C {}\n"
3194 " return retained();\n"
3196 " return e.toString();\n"
3203 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
3204 EXPECT_SUBSTRING(
"deleted",
result);
3207TEST_CASE(IsolateReload_CallDeleted_SuperFunctionArityChange) {
3208 const char* kScript =
3209 "class C { deleted() { return 'hello'; } }\n"
3210 "class D extends C { curry() => () => super.deleted(); }\n"
3213 " retained = new D().curry();\n"
3214 " return retained();\n"
3221 const char* kReloadScript =
3222 "class C { deleted(newParameter) { return 'hello'; } }\n"
3223 "class D extends C {}\n"
3227 " return retained();\n"
3229 " return e.toString();\n"
3236 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
3237 EXPECT_SUBSTRING(
"deleted",
result);
3241 const char* kScript =
3242 "class C { get deleted { return 'hello'; } }\n"
3243 "class D extends C { curry() => () => super.deleted; }\n"
3246 " retained = new D().curry();\n"
3247 " return retained();\n"
3254 const char* kReloadScript =
3256 "class D extends C {}\n"
3260 " return retained();\n"
3262 " return e.toString();\n"
3269 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
3270 EXPECT_SUBSTRING(
"deleted",
result);
3274 const char* kScript =
3275 "class C { set deleted(x) {} }\n"
3276 "class D extends C { curry() => () => super.deleted = 'hello'; }\n"
3279 " retained = new D().curry();\n"
3280 " return retained();\n"
3287 const char* kReloadScript =
3289 "class D extends C {}\n"
3293 " return retained();\n"
3295 " return e.toString();\n"
3302 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
3303 EXPECT_SUBSTRING(
"deleted",
result);
3307 const char* kScript =
3308 "class C { var deleted = 'hello'; }\n"
3309 "class D extends C { curry() => () => super.deleted; }\n"
3312 " retained = new D().curry();\n"
3313 " return retained();\n"
3320 const char* kReloadScript =
3322 "class D extends C {}\n"
3326 " return retained();\n"
3328 " return e.toString();\n"
3335 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
3336 EXPECT_SUBSTRING(
"deleted",
result);
3340 const char* kScript =
3341 "class C { var deleted; }\n"
3342 "class D extends C { curry() => () => super.deleted = 'hello'; }\n"
3345 " retained = new D().curry();\n"
3346 " return retained();\n"
3353 const char* kReloadScript =
3355 "class D extends C {}\n"
3359 " return retained();\n"
3361 " return e.toString();\n"
3368 EXPECT_SUBSTRING(
"NoSuchMethodError",
result);
3369 EXPECT_SUBSTRING(
"deleted",
result);
3373 const char* kScript =
3381 " r += Fruit.Apple.toString();\n"
3383 " r += Fruit.Banana.toString();\n"
3389 EXPECT_STREQ(
"Fruit.Apple Fruit.Banana",
SimpleInvokeStr(lib,
"main"));
3393 const char* kReloadScript =
3402 " r += Fruit.Apple.toString();\n"
3404 " r += Fruit.Cantaloupe.toString();\n"
3406 " r += Fruit.Banana.toString();\n"
3412 EXPECT_STREQ(
"Fruit.Apple Fruit.Cantaloupe Fruit.Banana",
3429 intptr_t saved_subclass_count = subclasses.IsNull() ? 0 : subclasses.Length();
3431 const char* kScript =
3432 "class AStopwatch extends Stopwatch {\n"
3435 " new AStopwatch();\n"
3448 EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
3451 new_subclass = subclasses.At(subclasses.Length() - 1);
3452 name = Class::Cast(new_subclass).Name();
3453 EXPECT_STREQ(
"AStopwatch",
name.ToCString());
3455 const char* kReloadScript =
3456 "class AStopwatch {\n"
3458 "class BStopwatch extends Stopwatch {\n"
3461 " new AStopwatch();\n"
3462 " new BStopwatch();\n"
3475 EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
3478 new_subclass = subclasses.At(subclasses.Length() - 1);
3479 name = Class::Cast(new_subclass).Name();
3480 EXPECT_STREQ(
"BStopwatch",
name.ToCString());
3496 intptr_t saved_subclass_count = subclasses.IsNull() ? 0 : subclasses.Length();
3498 const char* kScript =
3499 "class AStopwatch extends Stopwatch {\n"
3502 " new AStopwatch();\n"
3515 EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
3518 new_subclass = subclasses.At(subclasses.Length() - 1);
3519 name = Class::Cast(new_subclass).Name();
3520 EXPECT_STREQ(
"AStopwatch",
name.ToCString());
3522 const char* kReloadScript =
3523 "class BStopwatch extends Stopwatch {\n"
3526 " new BStopwatch();\n"
3539 EXPECT_EQ(saved_subclass_count + 2, subclasses.Length());
3542 new_subclass = subclasses.At(subclasses.Length() - 2);
3543 name = Class::Cast(new_subclass).Name();
3544 EXPECT_STREQ(
"AStopwatch",
name.ToCString());
3546 new_subclass = subclasses.At(subclasses.Length() - 1);
3547 name = Class::Cast(new_subclass).Name();
3548 EXPECT_STREQ(
"BStopwatch",
name.ToCString());
3565 intptr_t saved_subclass_count = subclasses.IsNull() ? 0 : subclasses.Length();
3567 const char* kScript =
3568 "class AStopwatch extends Stopwatch {\n"
3575 " new AStopwatch();\n"
3589 EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
3593 new_subclass = subclasses.At(subclasses.Length() - 1);
3594 name = Class::Cast(new_subclass).Name();
3595 EXPECT_STREQ(
"AStopwatch",
name.ToCString());
3598 const char* kReloadScript =
3599 "class BStopwatch extends Stopwatch {\n"
3602 " final a kjsdf ksjdf ;\n"
3606 " new BStopwatch();\n"
3621 EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
3624 new_subclass = subclasses.At(subclasses.Length() - 1);
3625 name = Class::Cast(new_subclass).Name();
3626 EXPECT_STREQ(
"AStopwatch",
name.ToCString());
3633 const char* kScript =
3650 const char* kReloadScript =
3668 const char* kScript =
3681 const char* kReloadScript =
3687 " return (f.c == null) ? 42: 21;\n"
3699 const char* kScript =
3714 const char* kReloadScript =
3735 const char* kScript =
3736 "class Foo<A,B> {\n"
3756 const char* kReloadScript =
3757 "class Foo<A,B> {\n"
3775 const char* kScript =
3779 "class Foo extends Bar{\n"
3794 const char* kReloadScript =
3812 const char* kScript =
3817 "class Foo extends Bar{\n"
3831 const char* kReloadScript =
3835 "class Foo extends Bar {\n"
3851 const char* kScript =
3852 "class Foo<A, B> {\n"
3865 const char* kReloadScript =
3878 const char* kScript =
3879 "class Foo<A, B> {\n"
3887 const char* kReloadScript =
3898 const char* kScript =
3903 " var x, y, z, w;\n"
3909 " return '$a $b';\n"
3914 EXPECT_STREQ(
"Instance of 'A' Instance of 'B'",
SimpleInvokeStr(lib,
"main"));
3916 const char* kReloadScript =
3921 " var x, y, z, w, v;\n"
3925 " return '$a $b';\n"
3930 EXPECT_STREQ(
"Instance of 'A' Instance of 'B'",
SimpleInvokeStr(lib,
"main"));
3937 const char* kScript =
3941 "class Bar<B, C> extends Foo<B> {}\n"
3942 "class Baz extends Foo<String> {}"
3952 const char* kReloadScript =
3956 "class Bar<B, C> extends Foo<B> {}\n"
3957 "class Baz extends Bar<String, double> {}"
3967 const char* kScript =
3970 " get yourself => this;\n"
3975 " retained1 = new A();\n"
3976 " retained2 = new A();\n"
3977 " retained1.x = retained2;\n"
3978 " retained2.x = retained1;\n"
3979 " return '${identical(retained1.x.yourself, retained2)}'\n"
3980 " '${identical(retained2.x.yourself, retained1)}';\n"
3987 const char* kReloadScript =
3993 " get yourself => this;\n"
3998 " return '${identical(retained1.x.yourself, retained2)}'\n"
3999 " '${identical(retained2.x.yourself, retained1)}';\n"
4008 const char* kScript =
4012 "var a, hash1, hash2;\n"
4015 " hash1 = a.hashCode;\n"
4023 const char* kReloadScript =
4027 "var a, hash1, hash2;\n"
4029 " hash2 = a.hashCode;\n"
4030 " return (hash1 == hash2).toString();\n"
4039 const char* kScript =
4042 " const A(this.x);\n"
4044 "var a, hash1, hash2;\n"
4046 " a = const A(1);\n"
4047 " hash1 = a.hashCode;\n"
4055 const char* kReloadScript =
4058 " const A(this.x, this.y, this.z);\n"
4060 "var a, hash1, hash2;\n"
4062 " hash2 = a.hashCode;\n"
4063 " return (hash1 == hash2).toString();\n"
4079 const char* kScript = R
"(
4080 import 'file:///test:isolate_reload_helper';
4097 const char* kReloadScript = R
"(
4098 import 'file:///test:isolate_reload_helper';
4101 const A(this.x, this.y, this.z);
4105 a = const A(1, null, null);
4115 const char* kReloadScript2 = R
"(
4116 import 'file:///test:isolate_reload_helper';
4118 final x, y, z, w, u;
4119 const A(this.x, this.y, this.z, this.w, this.u);
4123 a = const A(1, null, null, null, null);
4135 const char* kScript = R
"(
4136 import 'file:///test:isolate_reload_helper';
4139 const A(this.x, this.y, this.z);
4143 a = const A(1, 2, 3);
4153 const char* kReloadScript = R
"(
4154 import 'file:///test:isolate_reload_helper';
4157 const A(this.x, this.y);
4161 a = const A(1, null);
4169 "Const class cannot remove fields: "
4170 "Library:'file:///test-lib' Class: A");
4173 const char* kReloadScript2 = R
"(
4174 import 'file:///test:isolate_reload_helper';
4177 const A(this.x, this.y, this.w);
4181 a = const A(1, null, null);
4189 "Const class cannot remove fields: "
4190 "Library:'file:///test-lib' Class: A");
4194 const char* kScript = R
"(
4195 @pragma('vm:deeply-immutable')
4210 const char* kReloadScript = R
"(
4223 "Classes cannot change their @pragma('vm:deeply-immutable'): "
4224 "Library:'file:///test-lib' Class: A");
4228 const char* kScript = R
"(
4243 const char* kReloadScript = R
"(
4244 @pragma('vm:deeply-immutable')
4257 "Classes cannot change their @pragma('vm:deeply-immutable'): "
4258 "Library:'file:///test-lib' Class: A");
4265 "file:///test-app.dart",
4267 import 'test-lib.dart';
4269 @pragma('vm:deeply-immutable')
4281 "file:///test-lib.dart",
4283 @pragma('vm:deeply-immutable')
4294 nullptr ,
true ,
true );
4300 EXPECT_EQ(42,
value);
4305 "file:///test-lib.dart",
4316 const uint8_t* kernel_buffer =
nullptr;
4317 intptr_t kernel_buffer_size = 0;
4319 "file:///test-app.dart",
4321 updated_sourcefiles, &kernel_buffer, &kernel_buffer_size,
4325 EXPECT_NULLPTR(kernel_buffer);
4329TEST_CASE(IsolateReload_DeeplyImmutableChange_TypeBound) {
4333 "file:///test-app.dart",
4335 import 'test-lib.dart';
4337 @pragma('vm:deeply-immutable')
4338 final class A<T extends B> {
4349 "file:///test-lib.dart",
4351 @pragma('vm:deeply-immutable')
4362 nullptr ,
true ,
true );
4368 EXPECT_EQ(42, value);
4373 "file:///test-lib.dart",
4384 const uint8_t* kernel_buffer =
nullptr;
4385 intptr_t kernel_buffer_size = 0;
4387 "file:///test-app.dart",
4389 updated_sourcefiles, &kernel_buffer, &kernel_buffer_size,
4393 EXPECT_NULLPTR(kernel_buffer);
4397TEST_CASE(IsolateReload_ConstToNonConstClass) {
4398 const char* kScript = R
"(
4414 const char* kReloadScript = R
"(
4427 "Const class cannot become non-const: "
4428 "Library:'file:///test-lib' Class: A");
4431TEST_CASE(IsolateReload_ConstToNonConstClass_Empty) {
4432 const char* kScript = R
"(
4447 const char* kReloadScript = R
"(
4460 "Const class cannot become non-const: "
4461 "Library:'file:///test-lib' Class: A");
4464TEST_CASE(IsolateReload_StaticTearOffRetainsHash) {
4465 const char* kScript =
4467 "var hash1, hash2;\n"
4469 " hash1 = foo.hashCode;\n"
4477 const char* kReloadScript =
4479 "var hash1, hash2;\n"
4481 " hash2 = foo.hashCode;\n"
4482 " return (hash1 == hash2).toString();\n"
4494TEST_CASE(IsolateReload_NoLibsModified) {
4495 const char* kImportScript =
"importedFunc() => 'fancy';";
4498 const char* kScript =
4499 "import 'test:lib1';\n"
4501 " return importedFunc() + ' feast';\n"
4508 const char* kReloadImportScript =
"importedFunc() => 'bossy';";
4511 const char* kReloadScript =
4512 "import 'test:lib1';\n"
4514 " return importedFunc() + ' pants';\n"
4527 if ((strcmp(url,
"test-lib") == 0) ||
4528 (strcmp(url,
"file:///test-lib") == 0)) {
4534TEST_CASE(IsolateReload_MainLibModified) {
4535 const char* kImportScript =
"importedFunc() => 'fancy';";
4538 const char* kScript =
4539 "import 'test:lib1';\n"
4541 " return importedFunc() + ' feast';\n"
4548 const char* kReloadImportScript =
"importedFunc() => 'bossy';";
4551 const char* kReloadScript =
4552 "import 'test:lib1';\n"
4554 " return importedFunc() + ' pants';\n"
4567 if (strcmp(url,
"test:lib1") == 0) {
4573TEST_CASE(IsolateReload_ImportedLibModified) {
4574 const char* kImportScript =
"importedFunc() => 'fancy';";
4577 const char* kScript =
4578 "import 'test:lib1';\n"
4580 " return importedFunc() + ' feast';\n"
4587 const char* kReloadImportScript =
"importedFunc() => 'bossy';";
4590 const char* kReloadScript =
4591 "import 'test:lib1';\n"
4593 " return importedFunc() + ' pants';\n"
4605TEST_CASE(IsolateReload_PrefixImportedLibModified) {
4606 const char* kImportScript =
"importedFunc() => 'fancy';";
4609 const char* kScript =
4610 "import 'test:lib1' as cobra;\n"
4612 " return cobra.importedFunc() + ' feast';\n"
4619 const char* kReloadImportScript =
"importedFunc() => 'bossy';";
4622 const char* kReloadScript =
4623 "import 'test:lib1' as cobra;\n"
4625 " return cobra.importedFunc() + ' pants';\n"
4639 if (strcmp(url,
"test:exportlib") == 0) {
4645TEST_CASE(IsolateReload_ExportedLibModified) {
4646 const char* kImportScript =
"export 'test:exportlib';";
4649 const char* kExportScript =
"exportedFunc() => 'fancy';";
4652 const char* kScript =
4653 "import 'test:importlib';\n"
4655 " return exportedFunc() + ' feast';\n"
4662 const char* kReloadExportScript =
"exportedFunc() => 'bossy';";
4665 const char* kReloadScript =
4666 "import 'test:importlib';\n"
4668 " return exportedFunc() + ' pants';\n"
4680TEST_CASE(IsolateReload_SimpleConstFieldUpdate) {
4681 const char* kScript =
4682 "const value = 'a';\n"
4684 " return 'value=${value}';\n"
4691 const char* kReloadScript =
4692 "const value = 'b';\n"
4694 " return 'value=${value}';\n"
4702TEST_CASE(IsolateReload_ConstFieldUpdate) {
4703 const char* kScript =
4704 "const value = const Duration(seconds: 1);\n"
4706 " return 'value=${value}';\n"
4713 const char* kReloadScript =
4714 "const value = const Duration(seconds: 2);\n"
4716 " return 'value=${value}';\n"
4724TEST_CASE(IsolateReload_RunNewFieldInitializers) {
4734 " return value.x;\n"
4753 " return value.y;\n"
4765TEST_CASE(IsolateReload_RunNewFieldInitializersReferenceStaticField) {
4770 "int myInitialValue = 8 * 7;\n"
4777 " return value.x;\n"
4789 auto kReloadScript =
4791 "int myInitialValue = 8 * 7;\n"
4794 " int y = myInitialValue;\n"
4798 " return value.y;\n"
4810TEST_CASE(IsolateReload_RunNewFieldInitializersLazy) {
4815 "int myInitialValue = 8 * 7;\n"
4823 " value1 = Foo();\n"
4824 " return value.x;\n"
4826 late_tag, late_tag),
4838 "int myInitialValue = 8 * 7;\n"
4841 " int y = myInitialValue++;\n"
4846 " return '${myInitialValue} ${value.y} ${value1.y} "
4847 "${myInitialValue}';\n"
4849 late_tag, late_tag),
4859TEST_CASE(IsolateReload_RunNewFieldInitializersLazyConst) {
4869 " return value.x;\n"
4902 auto kReloadScript2 =
4910 " return value.y;\n"
4920TEST_CASE(IsolateReload_RunNewFieldInitializersLazyTransitive) {
4925 "int myInitialValue = 8 * 7;\n"
4933 " value1 = Foo();\n"
4934 " return value.x;\n"
4936 late_tag, late_tag),
4946 auto kReloadScript =
4948 "int myInitialValue = 8 * 7;\n"
4951 " int y = myInitialValue++;\n"
4956 " return '${myInitialValue}';\n"
4958 late_tag, late_tag),
4971 "int myInitialValue = 8 * 7;\n"
4974 " int y = myInitialValue++;\n"
4979 " return '${myInitialValue} ${value.y} ${value1.y} "
4980 "${myInitialValue}';\n"
4982 late_tag, late_tag),
5002 " return value.x;\n"
5014 auto kReloadScript =
5018 " int y = throw 'exception';\n"
5023 " return value.y.toString();\n"
5025 " return e.toString();\n"
5038TEST_CASE(IsolateReload_RunNewFieldInitializersCyclicInitialization) {
5048 " return value.x;\n"
5060 auto kReloadScript =
5064 " int y = value.y;\n"
5069 " return value.y.toString();\n"
5071 " return e.toString();\n"
5084TEST_CASE(IsolateReload_RunNewFieldInitializersSyntaxError) {
5094 " return value.x;\n"
5106 auto kReloadScript =
5110 " int y = ......;\n"
5114 " return '${value.y == null}';"
5128TEST_CASE(IsolateReload_RunNewFieldInitializersSyntaxError2) {
5134 " Foo() { /* default constructor */ }\n"
5140 " return value.x;\n"
5155 " Foo() { /* default constructor */ }\n"
5157 " int y = ......;\n"
5161 " return '${value.y == null}';"
5175TEST_CASE(IsolateReload_RunNewFieldInitializersSyntaxError3) {
5181 " Foo() { /* default constructor */ }\n"
5187 " return value.x;\n"
5202 " Foo() { /* default constructor */ }\n"
5208 " return '${value.y == null}';"
5220TEST_CASE(IsolateReload_RunNewFieldInitializersSuperClass) {
5226 " static var foo = 'right';\n"
5228 "class Foo extends Super {\n"
5229 " static var foo = 'wrong';\n"
5247 auto kReloadScript =
5250 " static var foo = 'right';\n"
5251 " var newField = foo;\n"
5253 "class Foo extends Super {\n"
5254 " static var foo = 'wrong';\n"
5258 " return value.newField;\n"
5269 EXPECT(actual !=
nullptr);
5270 if (actual !=
nullptr) {
5271 EXPECT_STREQ(
"right", actual);
5275TEST_CASE(IsolateReload_RunNewFieldInitializersWithConsts) {
5282 " const C(this.x);\n"
5284 "var a = const C(const C(1));\n"
5285 "var b = const C(const C(2));\n"
5286 "var c = const C(const C(3));\n"
5287 "var d = const C(const C(4));\n"
5310 " const C(this.x);\n"
5312 "var a = const C(const C(1));\n"
5313 "var b = const C(const C(2));\n"
5314 "var c = const C(const C(3));\n"
5315 "var d = const C(const C(4));\n"
5317 " var d = const C(const C(4));\n"
5318 " var c = const C(const C(3));\n"
5319 " var b = const C(const C(2));\n"
5320 " var a = const C(const C(1));\n"
5324 " return '${identical(a, value.a)} ${identical(b, value.b)}'"
5325 " ' ${identical(c, value.c)} ${identical(d, value.d)}';\n"
5337TEST_CASE(IsolateReload_RunNewFieldInitializersWithGenerics) {
5349 " value1 = Foo<String>();\n"
5350 " value2 = Foo<int>();\n"
5353 nullable_tag, late_tag, late_tag),
5366 " List<T> y = List<T>.empty();"
5367 " dynamic z = <T,T>{};"
5372 " return '${value1.y.runtimeType} ${value1.z.runtimeType}'"
5373 " ' ${value2.y.runtimeType} ${value2.z.runtimeType}';\n"
5375 nullable_tag, late_tag, late_tag),
5383 EXPECT_STREQ(
"List<String> _Map<String, String> List<int> _Map<int, int>",
5387TEST_CASE(IsolateReload_AddNewStaticField) {
5388 const char* kScript =
5399 const char* kReloadScript =
5401 " static var x = 42;\n"
5404 " return '${C.x}';\n"
5412TEST_CASE(IsolateReload_StaticFieldInitialValueDoesnotChange) {
5413 const char* kScript =
5415 " static var x = 42;\n"
5418 " return '${C.x}';\n"
5425 const char* kReloadScript =
5427 " static var x = 13;\n"
5430 " return '${C.x}';\n"
5439class CidCountingVisitor :
public ObjectVisitor {
5441 explicit CidCountingVisitor(intptr_t
cid) : cid_(
cid) {}
5445 if (obj->GetClassId() == cid_) {
5450 intptr_t
count()
const {
return count_; }
5454 intptr_t count_ = 0;
5457TEST_CASE(IsolateReload_DeleteStaticField) {
5458 const char* kScript =
5462 "static var x = C();\n"
5470 intptr_t
cid = 1118;
5482 const char* kReloadScript =
5488 " return '${Foo()}';\n"
5496 TransitionNativeToVM transition(thread);
5497 GCTestHelper::CollectAllGarbage();
5500 HeapIterationScope iteration(thread);
5501 CidCountingVisitor counting_visitor(
cid);
5502 iteration.IterateObjects(&counting_visitor);
5506 EXPECT_NE(counting_visitor.count(), 0);
5514 const char* from_type,
5515 const char* from_init,
5516 const char* to_type,
5517 const char* to_init) {
5522 import 'dart:typed_data';
5524 void doubleEq(double got, double expected) {
5525 if (got != expected) throw 'expected $expected got $got';
5528 void float32x4Eq(Float32x4 got, Float32x4 expected) {
5529 if (got.equal(expected).signMask != 0xf) throw 'expected $expected got $got';
5549 verify), std::free);
5558 import 'dart:typed_data';
5560 void doubleEq(double got, double expected) {
5561 if (got != expected) throw 'expected $expected got $got';
5564 void float32x4Eq(Float32x4 got, Float32x4 expected) {
5565 if (got.equal(expected).signMask != 0xf) throw 'expected $expected got $got';
5577 return value.x.toString();
5579 return e.toString();
5582 )", prefix, to_type, to_init, suffix,
5583 late_tag, verify), std::free);
5591 "type '%s' is not a subtype of type '%s' of 'function result'",
5592 from_type, to_type),
5596TEST_CASE(IsolateReload_ExistingFieldChangesType) {
5602TEST_CASE(IsolateReload_ExistingFieldChangesTypeWithOtherUnboxedFields) {
5605 "Float32x4 b = Float32x4(1.0, 2.0, 3.0, 4.0);",
5606 "doubleEq(value.a, 1.5); float32x4Eq(value.b, Float32x4(1.0, 2.0, 3.0, "
5608 "int",
"42",
"double",
5612TEST_CASE(IsolateReload_ExistingFieldUnboxedToBoxed) {
5615 "Float32x4 b = Float32x4(1.0, 2.0, 3.0, 4.0);",
5616 "doubleEq(value.a, 1.5); float32x4Eq(value.b, Float32x4(1.0, 2.0, 3.0, "
5618 "double",
"42.0",
"String",
5622TEST_CASE(IsolateReload_ExistingFieldBoxedToUnboxed) {
5626 "Float32x4 b = Float32x4(1.0, 2.0, 3.0, 4.0);",
5627 "doubleEq(value.a, 1.5); float32x4Eq(value.b, Float32x4(1.0, 2.0, 3.0, "
5629 "String",
"'42.0'",
"double",
5633TEST_CASE(IsolateReload_ExistingFieldUnboxedToUnboxed) {
5637 "Float32x4 b = Float32x4(1.0, 2.0, 3.0, 4.0);",
5638 "doubleEq(value.a, 1.5); float32x4Eq(value.b, Float32x4(1.0, 2.0, 3.0, "
5640 "double",
"42.0",
"Float32x4",
5641 "Float32x4(1.0, 2.0, 3.0, 4.0)");
5644TEST_CASE(IsolateReload_ExistingStaticFieldChangesType) {
5645 const char* kScript = R
"(
5649 return value.toString();
5657 const char* kReloadScript = R
"(
5658 double value = init();
5662 return value.toString();
5664 return e.toString();
5672 "type 'int' is not a subtype of type 'double' of 'function result'",
5676TEST_CASE(IsolateReload_ExistingFieldChangesTypeIndirect) {
5681 class B extends A {}
5691 )", late_tag), std::free);
5710 return value.x.toString();
5712 return e.toString();
5715 )", late_tag), std::free);
5720 EXPECT_STREQ(
"type 'B' is not a subtype of type 'A' of 'function result'",
5724TEST_CASE(IsolateReload_ExistingStaticFieldChangesTypeIndirect) {
5725 const char* kScript = R
"(
5727 class B extends A {}
5731 return value.toString();
5740 const char* kReloadScript = R
"(
5747 return value.toString();
5749 return e.toString();
5756 EXPECT_STREQ("type 'B' is not a subtype of type 'A' of 'function result'",
5760TEST_CASE(IsolateReload_ExistingFieldChangesTypeIndirectGeneric) {
5765 class B extends A {}
5772 value = Foo(List<B>.empty());
5775 )", late_tag), std::free);
5794 return value.x.toString();
5796 return e.toString();
5799 )", late_tag), std::free);
5805 "type 'List<B>' is not a subtype of type 'List<A>' of 'function result'",
5809TEST_CASE(IsolateReload_ExistingStaticFieldChangesTypeIndirectGeneric) {
5810 const char* kScript = R
"(
5812 class B extends A {}
5813 List<A> value = init();
5814 init() => List<B>.empty();
5816 return value.toString();
5825 const char* kReloadScript = R
"(
5828 List<A> value = init();
5829 init() => List<A>.empty();
5832 return value.toString();
5834 return e.toString();
5842 "type 'List<B>' is not a subtype of type 'List<A>' of 'function result'",
5846TEST_CASE(IsolateReload_ExistingFieldChangesTypeIndirectFunction) {
5851 class B extends A {}
5852 typedef bool Predicate(B b);
5859 value = Foo((A a) => true);
5862 )", late_tag), std::free);
5874 typedef bool Predicate(B b);
5882 return value.x.toString();
5884 return e.toString();
5887 )", late_tag), std::free);
5893 "type '(A) => bool' is not a subtype of type '(B) => bool' of 'function "
5898TEST_CASE(IsolateReload_ExistingStaticFieldChangesTypeIndirectFunction) {
5899 const char* kScript = R
"(
5901 class B extends A {}
5902 typedef bool Predicate(B b);
5903 Predicate value = init();
5904 init() => (A a) => true;
5906 return value.toString();
5915 const char* kReloadScript = R
"(
5918 typedef bool Predicate(B b);
5919 Predicate value = init();
5920 init() => (B a) => true;
5923 return value.toString();
5925 return e.toString();
5933 "type '(A) => bool' is not a subtype of type '(B) => bool' of 'function "
5938TEST_CASE(IsolateReload_TypedefToNotTypedef) {
5942 const char* kScript =
5943 "typedef bool Predicate(dynamic x);\n"
5945 " return (42 is Predicate).toString();\n"
5952 const char* kReloadScript =
5953 "class Predicate {\n"
5954 " bool call(dynamic x) { return false; }\n"
5957 " return (42 is Predicate).toString();\n"
5964TEST_CASE(IsolateReload_NotTypedefToTypedef) {
5965 const char* kScript =
5966 "class Predicate {\n"
5967 " bool call(dynamic x) { return false; }\n"
5970 " return (42 is Predicate).toString();\n"
5980 const char* kReloadScript =
5981 "typedef bool Predicate(dynamic x);\n"
5983 " return (42 is Predicate).toString();\n"
5990TEST_CASE(IsolateReload_TypedefAddParameter) {
5991 const char* kScript =
5992 "typedef bool Predicate(dynamic x);\n"
5994 " bool foo(x) => true;\n"
5995 " return (foo is Predicate).toString();\n"
6002 const char* kReloadScript =
6003 "typedef bool Predicate(dynamic x, dynamic y);\n"
6005 " bool foo(x) => true;\n"
6006 " return (foo is Predicate).toString();\n"
6014TEST_CASE(IsolateReload_PatchStaticInitializerWithClosure) {
6015 const char* kScript =
6016 "dynamic field = (a) => 'a$a';\n"
6018 " dynamic f = field;\n"
6026 const char* kReloadScript =
6027 "extraFunction() => 'Just here to change kernel offsets';\n"
6028 "dynamic field = (_, __) => 'Not executed';\n"
6030 " dynamic f = field;\n"
6039TEST_CASE(IsolateReload_StaticTargetArityChange) {
6040 const char* kScript = R
"(
6044 const A(this.x, this.y);
6050 closure = () => A(1, 2);
6059 const char* kReloadScript = R
"(
6068 // Call the old closure, which will try to call A(1, 2).
6078 "Unhandled exception:\n"
6079 "NoSuchMethodError: No constructor 'A.' "
6080 "with matching arguments declared in class 'A'.");
6083TEST_CASE(IsolateReload_SuperGetterReboundToMethod) {
6084 const char* kScript = R
"(
6085 import 'file:///test:isolate_reload_helper';
6093 var old_x = super.x;
6095 var new_x = super.x;
6096 return "$old_x:$new_x";
6101 return B().f().toString();
6108 const char* kReloadScript = R
"(
6109 import 'file:///test:isolate_reload_helper';
6117 var old_x = super.x;
6119 var new_x = super.x;
6120 return "$old_x:$new_x";
6131 EXPECT_STREQ("123:Closure: () => dynamic from Function 'x':.",
6145 const uint8_t** kernel_buffer,
6146 intptr_t* kernel_buffer_size) {
6149 sources[0].uri,
ARRAY_SIZE(sources), sources, kernel_buffer,
6153 EXPECT_NOTNULL(kernel_buffer);
6160class KernelTagHandler {
6162 KernelTagHandler(uint8_t* kernel_buffer, intptr_t kernel_buffer_size)
6163 : kernel_buffer_(kernel_buffer), kernel_buffer_size_(kernel_buffer_size) {
6168 ~KernelTagHandler() {
6170 instance_ =
nullptr;
6173 static KernelTagHandler* Current() {
return instance_; }
6175 bool was_called()
const {
return was_called_; }
6176 bool was_finalized()
const {
return was_finalized_; }
6179 static void Finalizer(
void* isolate_callback_data,
void* peer) {
6180 if (
auto handler = KernelTagHandler::Current()) {
6181 handler->was_finalized_ =
true;
6189 auto handler = KernelTagHandler::Current();
6190 handler->was_called_ =
true;
6194 handler->kernel_buffer_size_);
6196 handler->kernel_buffer_size_, &Finalizer);
6203 static KernelTagHandler* instance_;
6204 uint8_t* kernel_buffer_;
6205 intptr_t kernel_buffer_size_;
6206 bool was_finalized_ =
false;
6207 bool was_called_ =
false;
6210KernelTagHandler* KernelTagHandler::instance_ =
nullptr;
6213TEST_CASE(IsolateReload_RegressB179030011) {
6216 const uint8_t* kernel_buffer;
6217 intptr_t kernel_buffer_size;
6221 std::array<Component, 2> components = {{
6240 for (
auto& component : components) {
6241 CompileToKernel(component.source, &component.kernel_buffer,
6242 &component.kernel_buffer_size);
6247 intptr_t kernel_buffer_size = 0;
6248 for (
auto component : components) {
6249 kernel_buffer_size += component.kernel_buffer_size;
6251 uint8_t* kernel_buffer =
static_cast<uint8_t*
>(
malloc(kernel_buffer_size));
6254 for (
auto component : components) {
6255 memcpy(kernel_buffer +
pos, component.kernel_buffer,
6256 component.kernel_buffer_size);
6257 pos += component.kernel_buffer_size;
6263 components[0].kernel_buffer, components[0].kernel_buffer_size);
6268 KernelTagHandler handler(kernel_buffer, kernel_buffer_size);
6276 EXPECT(handler.was_called());
6280 TransitionNativeToVM transition(thread);
6281 GCTestHelper::CollectAllGarbage();
6282 EXPECT(!handler.was_finalized());
6287TEST_CASE(IsolateReload_GenericConstructorTearOff) {
6288 const char* kScript = R
"(
6289 typedef Create<T, R> = T Function(R ref);
6292 Base(void Function(Create<void, Input> create) factory) : _factory = factory;
6294 final void Function(Create<void, Input> create) _factory;
6296 void fn() => _factory((ref) {});
6300 Check(Create<Object?, List<T>> create);
6303 final f = Base<List<int>>(Check<int>.new);
6321TEST_CASE(IsolateReload_ImplicitGetterWithLoadGuard) {
6322 const char* kLibScript = R
"(
6323 import 'file:///test:isolate_reload_helper';
6328 A.withUinitializedObject(int Function() callback) : x = callback();
6335 // Trigger OSR and optimize this function.
6336 for (int i = 0; i < 30000; ++i) {
6339 // Make sure A.get:x is compiled.
6341 // Reload while having an uninitialized
6342 // object A on the stack. This should result in
6343 // a load guard for A.x.
6344 A.withUinitializedObject(() {
6348 // Trigger OSR and optimize this function once again.
6349 for (int i = 0; i < 30000; ++i) {
6352 // Trigger deoptimization in A.get:x.
6353 // It should correctly deoptimize into an implicit
6354 // getter with a load guard.
6355 a.x = 0x8070605040302010;
6356 int z = a.x & 0xffff;
6357 return "y: $y, z: $z";
6365 const char* kMainScript = R
"(
6378TEST_CASE(IsolateReload_EnumInMainLibraryModified) {
6379 const char* kScript =
6380 "enum Bar { bar }\n"
6381 "class Foo { int? a; toString() => 'foo'; }"
6383 " return Foo().toString();\n"
6391 const char* kReloadScript =
6392 "enum Bar { bar }\n"
6393 "class Foo { int? a; String? b; toString() => 'foo'; }"
6395 " return Foo().toString();\n"
6407 const char* kScript =
6408 "import 'file:///test:isolate_reload_helper';\n"
6410 " @pragma('vm:prefer-inline')\n"
6422 const char* kReloadScript =
6423 "import 'file:///test:isolate_reload_helper';\n"
6442 TransitionNativeToVM transition(thread);
6452 Symbols::vm_prefer_inline()));
6454 Symbols::vm_prefer_inline()));
6458 const char* kScript =
6460 " member1({Enum2.member1, Enum2.member2}),\n"
6461 " member2({Enum2.member2}),\n"
6462 " member3({Enum2.member1}),\n"
6463 " member4({Enum2.member2, Enum2.member1}),\n"
6464 " member5({Enum2.member1}),\n"
6465 " member6({Enum2.member1});\n"
6466 " const Enum1(this.set);\n"
6467 " final Set<Enum2> set;\n"
6469 "enum Enum2 { member1, member2; }\n"
6472 " retained = Enum1.member4;\n"
6479 const char* kReloadScript =
6480 "enum Enum2 { member1, member2; }\n"
6482 " member1({Enum2.member1, Enum2.member2}),\n"
6483 " member2({Enum2.member2}),\n"
6484 " member3({Enum2.member1}),\n"
6485 " member4({Enum2.member2, Enum2.member1}),\n"
6486 " member5({Enum2.member1}),\n"
6487 " member6({Enum2.member1});\n"
6488 " const Enum1(this.set);\n"
6489 " final Set<Enum2> set;\n"
6493 " return switch (e as Enum1) {\n"
6494 " Enum1.member1 => \"a\",\n"
6495 " Enum1.member2 => \"b\",\n"
6496 " Enum1.member3 => \"c\",\n"
6497 " Enum1.member4 => \"d\",\n"
6498 " Enum1.member5 => \"e\",\n"
6499 " Enum1.member6 => \"f\",\n"
6503 " return foo(retained);\n"
6522 for (intptr_t i = 0; i < constants.
Length(); i++) {
6523 constants.
SetAt(i, Object::sentinel());
6532 const char* kScript =
6533 "import 'file:///test:isolate_reload_helper';\n"
6535 " @pragma('vm:prefer-inline')\n"
6547 const char* kReloadScript =
6548 "import 'file:///test:isolate_reload_helper';\n"
6550 " @pragma('vm:never-inline')\n"
6568 TransitionNativeToVM transition(thread);
6576 Symbols::vm_prefer_inline()));
6578 Symbols::vm_never_inline()));
6580 Symbols::vm_prefer_inline()));
6582 Symbols::vm_never_inline()));
6587 const char* kScript =
6588 "import 'file:///test:isolate_reload_helper';\n"
6601 const char* kReloadScript =
6602 "import 'file:///test:isolate_reload_helper';\n"
6604 " @pragma('vm:never-inline')\n"
6622 TransitionNativeToVM transition(thread);
6630 Symbols::vm_never_inline()));
6633 Symbols::vm_never_inline()));
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
static ObjectPtr UnwrapHandle(Dart_Handle object)
static intptr_t ClassId(Dart_Handle handle)
void SetAt(intptr_t index, const Object &value) const
virtual void VisitObject(ObjectPtr obj)
virtual ~CidCountingVisitor()
GrowableObjectArrayPtr direct_subclasses_unsafe() const
ObjectStore * object_store() const
static IsolateGroup * Current()
static bool FindPragma(Thread *T, bool only_core, const Object &object, const String &pragma_name, bool multiple=false, Object *options=nullptr)
ClassPtr LookupClass(const String &name) const
KernelProgramInfoPtr kernel_program_info() const
static char * SCreate(Zone *zone, const char *format,...) PRINTF_ATTRIBUTE(2
static ObjectPtr RawCast(ObjectPtr obj)
static StringPtr New(const char *cstr, Heap::Space space=Heap::kNew)
static void AddToKernelBuffers(const uint8_t *kernel_buffer)
static Dart_Handle TriggerReload(const uint8_t *kernel_buffer, intptr_t kernel_buffer_size)
static Dart_Handle LoadTestScriptWithDFE(int sourcefiles_count, Dart_SourceFile sourcefiles[], Dart_NativeEntryResolver resolver=nullptr, bool finalize=true, bool incrementally=true, bool allow_compile_errors=false, const char *entry_script_uri=nullptr, const char *multiroot_filepaths=nullptr, const char *multiroot_scheme=nullptr)
static void AddTestLib(const char *url, const char *source)
static Dart_Handle LoadTestScript(const char *script, Dart_NativeEntryResolver resolver, const char *lib_uri=RESOLVED_USER_TEST_URI, bool finalize=true, bool allow_compile_errors=false)
static Dart_Handle ReloadTestScript(const char *script)
static char * CompileTestScriptWithDFE(const char *url, const char *source, const uint8_t **kernel_buffer, intptr_t *kernel_buffer_size, bool incrementally=true, bool allow_compile_errors=false, const char *multiroot_filepaths=nullptr, const char *multiroot_scheme=nullptr)
static const char * LateTag()
static Dart_Handle SetReloadTestScript(const char *script)
static Dart_Handle LoadTestScriptWithErrors(const char *script, Dart_NativeEntryResolver resolver=nullptr, const char *lib_uri=RESOLVED_USER_TEST_URI, bool finalize=true)
static Dart_Handle LoadTestLibrary(const char *lib_uri, const char *script, Dart_NativeEntryResolver resolver=nullptr)
static Dart_Handle ReloadTestKernel(const uint8_t *kernel_buffer, intptr_t kernel_buffer_size)
static const char * NullableTag()
static Thread * Current()
std::unique_ptr< char, decltype(std::free) * > CStringUniquePtr
struct _Dart_Handle * Dart_Handle
const uint8_t uint32_t uint32_t GError ** error
Dart_NativeFunction function
DART_EXPORT bool Dart_IsLibrary(Dart_Handle object)
Dart_Handle Dart_GetLibraryDebuggable(intptr_t library_id, bool *is_debuggable)
DART_EXPORT void Dart_EnterScope()
DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target, Dart_Handle name, int number_of_arguments, Dart_Handle *arguments)
DART_EXPORT Dart_Handle Dart_RootLibrary()
const char * SimpleInvokeStr(Dart_Handle lib, const char *method)
static bool NothingModifiedCallback(const char *url, int64_t since)
void * malloc(size_t size)
static bool MainModifiedCallback(const char *url, int64_t since)
static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, Dart_Handle library, Dart_Handle url)
DART_EXPORT Dart_FinalizableHandle Dart_NewFinalizableHandle(Dart_Handle object, void *peer, intptr_t external_allocation_size, Dart_HandleFinalizer callback)
DART_EXPORT char * Dart_SetFileModifiedCallback(Dart_FileModifiedCallback file_modified_callback)
Dart_Handle Dart_SetLibraryDebuggable(intptr_t library_id, bool is_debuggable)
static void TestReloadWithFieldChange(const char *prefix, const char *suffix, const char *verify, const char *from_type, const char *from_init, const char *to_type, const char *to_init)
DART_EXPORT bool Dart_IsError(Dart_Handle handle)
DART_EXPORT Dart_Handle Dart_NewExternalTypedData(Dart_TypedData_Type type, void *data, intptr_t length)
static bool ExportModifiedCallback(const char *url, int64_t since)
Dart_Handle Dart_LibraryId(Dart_Handle library, intptr_t *library_id)
Dart_Handle NewString(const char *str)
int64_t SimpleInvoke(Dart_Handle lib, const char *method)
DART_EXPORT Dart_Handle Dart_SetLibraryTagHandler(Dart_LibraryTagHandler handler)
DART_EXPORT void Dart_ExitScope()
DART_EXPORT Dart_Handle Dart_FinalizeAllClasses()
DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url)
DART_EXPORT bool Dart_IsInteger(Dart_Handle object)
DART_EXPORT Dart_Handle Dart_Null()
DART_EXPORT bool Dart_IsString(Dart_Handle object)
DART_EXPORT Dart_Handle Dart_SetRootLibrary(Dart_Handle library)
DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object, const char **cstr)
static bool ImportModifiedCallback(const char *url, int64_t since)
Dart_Handle SimpleInvokeError(Dart_Handle lib, const char *method)
DART_EXPORT Dart_Handle Dart_LoadLibraryFromKernel(const uint8_t *buffer, intptr_t buffer_size)
DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer, int64_t *value)
#define EXPECT_ERROR(handle, substring)
#define ISOLATE_UNIT_TEST_CASE(name)
#define EXPECT_NON_NULL(handle)
#define EXPECT_VALID(handle)
#define ARRAY_SIZE(array)