| Index: runtime/vm/isolate_reload_test.cc
|
| diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
|
| index ea63190baed91aeb0a2d80d9d17a12bbc1f7a7a1..cbe991bd7d588b05383db4fe4f0ec17f8c9d68a7 100644
|
| --- a/runtime/vm/isolate_reload_test.cc
|
| +++ b/runtime/vm/isolate_reload_test.cc
|
| @@ -67,6 +67,217 @@ TEST_CASE(IsolateReload_FunctionReplacement) {
|
| EXPECT_EQ(10, SimpleInvoke(lib, "main"));
|
| }
|
|
|
| +TEST_CASE(IsolateReload_IncrementalCompile) {
|
| + const char* kScriptChars =
|
| + "main() {\n"
|
| + " return 42;\n"
|
| + "}\n";
|
| + Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
|
| + EXPECT_VALID(lib);
|
| + Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
|
| + int64_t value = 0;
|
| + result = Dart_IntegerToInt64(result, &value);
|
| + EXPECT_VALID(result);
|
| + EXPECT_EQ(42, value);
|
| +
|
| + const char* kUpdatedScriptChars =
|
| + "main() {\n"
|
| + " return 24;\n"
|
| + "}\n"
|
| + "";
|
| + lib = TestCase::ReloadTestScript(kUpdatedScriptChars);
|
| + EXPECT_VALID(lib);
|
| + result = Dart_Invoke(lib, NewString("main"), 0, NULL);
|
| + result = Dart_IntegerToInt64(result, &value);
|
| + EXPECT_VALID(result);
|
| + EXPECT_EQ(24, value);
|
| +}
|
| +
|
| +TEST_CASE(IsolateReload_KernelIncrementalCompile) {
|
| + // clang-format off
|
| + Dart_SourceFile sourcefiles[] = {
|
| + {
|
| + "file:///test-app",
|
| + "main() {\n"
|
| + " return 42;\n"
|
| + "}\n",
|
| + },
|
| + {
|
| + "file:///.packages", "untitled:/"
|
| + }};
|
| + // clang-format on
|
| +
|
| + Dart_Handle lib = TestCase::LoadTestScriptWithDFE(
|
| + sizeof(sourcefiles) / sizeof(Dart_SourceFile), sourcefiles,
|
| + NULL /* resolver */, true /* finalize */, true /* incrementally */);
|
| + Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
|
| + int64_t value = 0;
|
| + result = Dart_IntegerToInt64(result, &value);
|
| + EXPECT_VALID(result);
|
| + EXPECT_EQ(42, value);
|
| +
|
| + // clang-format off
|
| + Dart_SourceFile updated_sourcefiles[] = {
|
| + {
|
| + "file:///test-app",
|
| + "main() {\n"
|
| + " return 24;\n"
|
| + "}\n"
|
| + ""
|
| + }};
|
| + // clang-format on
|
| + {
|
| + void* kernel_pgm = NULL;
|
| + char* error = TestCase::CompileTestScriptWithDFE(
|
| + "file:///test-app",
|
| + sizeof(updated_sourcefiles) / sizeof(Dart_SourceFile),
|
| + updated_sourcefiles, &kernel_pgm, true /* incrementally */);
|
| + EXPECT(error == NULL);
|
| + EXPECT_NOTNULL(kernel_pgm);
|
| +
|
| + lib = TestCase::ReloadTestKernel(kernel_pgm);
|
| + EXPECT_VALID(lib);
|
| + }
|
| + result = Dart_Invoke(lib, NewString("main"), 0, NULL);
|
| + result = Dart_IntegerToInt64(result, &value);
|
| + EXPECT_VALID(result);
|
| + EXPECT_EQ(24, value);
|
| +}
|
| +
|
| +TEST_CASE(IsolateReload_KernelIncrementalCompileAppAndLib) {
|
| + // clang-format off
|
| + Dart_SourceFile sourcefiles[] = {
|
| + {
|
| + "file:///test-app.dart",
|
| + "import 'test-lib.dart';\n"
|
| + "main() {\n"
|
| + " return WhatsTheMeaningOfAllThis();\n"
|
| + "}\n",
|
| + },
|
| + {
|
| + "file:///test-lib.dart",
|
| + "WhatsTheMeaningOfAllThis() {\n"
|
| + " return 42;\n"
|
| + "}\n",
|
| + },
|
| + {
|
| + "file:///.packages", "untitled:/"
|
| + }};
|
| + // clang-format on
|
| +
|
| + Dart_Handle lib = TestCase::LoadTestScriptWithDFE(
|
| + sizeof(sourcefiles) / sizeof(Dart_SourceFile), sourcefiles,
|
| + NULL /* resolver */, true /* finalize */, true /* incrementally */);
|
| + EXPECT_VALID(lib);
|
| + Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
|
| + int64_t value = 0;
|
| + result = Dart_IntegerToInt64(result, &value);
|
| + EXPECT_VALID(result);
|
| + EXPECT_EQ(42, value);
|
| +
|
| + // clang-format off
|
| + Dart_SourceFile updated_sourcefiles[] = {
|
| + {
|
| + "file:///test-lib.dart",
|
| + "WhatsTheMeaningOfAllThis() {\n"
|
| + " return 24;\n"
|
| + "}\n"
|
| + ""
|
| + }};
|
| + // clang-format on
|
| + {
|
| + void* kernel_pgm = NULL;
|
| + char* error = TestCase::CompileTestScriptWithDFE(
|
| + "file:///test-app",
|
| + sizeof(updated_sourcefiles) / sizeof(Dart_SourceFile),
|
| + updated_sourcefiles, &kernel_pgm, true /* incrementally */);
|
| + EXPECT(error == NULL);
|
| + EXPECT_NOTNULL(kernel_pgm);
|
| +
|
| + lib = TestCase::ReloadTestKernel(kernel_pgm);
|
| + EXPECT_VALID(lib);
|
| + }
|
| + result = Dart_Invoke(lib, NewString("main"), 0, NULL);
|
| + result = Dart_IntegerToInt64(result, &value);
|
| + EXPECT_VALID(result);
|
| + EXPECT_EQ(24, value);
|
| +}
|
| +
|
| +TEST_CASE(IsolateReload_KernelIncrementalCompileGenerics) {
|
| + // clang-format off
|
| + Dart_SourceFile sourcefiles[] = {
|
| + {
|
| + "file:///test-app.dart",
|
| + "import 'test-lib.dart';\n"
|
| + "class Account {\n"
|
| + " int balance() => 42;\n"
|
| + "}\n"
|
| + "class MyAccountState extends State<Account> {\n"
|
| + " MyAccountState(Account a): super(a) {}\n"
|
| + "}\n"
|
| + "main() {\n"
|
| + " return (new MyAccountState(new Account()))\n"
|
| + " .howAreTheThings().balance();\n"
|
| + "}\n",
|
| + },
|
| + {
|
| + "file:///test-lib.dart",
|
| + "class State<T> {\n"
|
| + " T t;"
|
| + " State(this.t);\n"
|
| + " T howAreTheThings() => t;\n"
|
| + "}\n",
|
| + },
|
| + {
|
| + "file:///.packages", "untitled:/"
|
| + }};
|
| + // clang-format on
|
| +
|
| + Dart_Handle lib = TestCase::LoadTestScriptWithDFE(
|
| + sizeof(sourcefiles) / sizeof(Dart_SourceFile), sourcefiles,
|
| + NULL /* resolver */, true /* finalize */, true /* incrementally */);
|
| + EXPECT_VALID(lib);
|
| + Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
|
| + int64_t value = 0;
|
| + result = Dart_IntegerToInt64(result, &value);
|
| + EXPECT_VALID(result);
|
| + EXPECT_EQ(42, value);
|
| +
|
| + // clang-format off
|
| + Dart_SourceFile updated_sourcefiles[] = {
|
| + {
|
| + "file:///test-app.dart",
|
| + "import 'test-lib.dart';\n"
|
| + "class Account {\n"
|
| + " int balance() => 24;\n"
|
| + "}\n"
|
| + "class MyAccountState extends State<Account> {\n"
|
| + " MyAccountState(Account a): super(a) {}\n"
|
| + "}\n"
|
| + "main() {\n"
|
| + " return (new MyAccountState(new Account()))\n"
|
| + " .howAreTheThings().balance();\n"
|
| + "}\n",
|
| + }};
|
| + // clang-format on
|
| + {
|
| + void* kernel_pgm = NULL;
|
| + char* error = TestCase::CompileTestScriptWithDFE(
|
| + "file:///test-app",
|
| + sizeof(updated_sourcefiles) / sizeof(Dart_SourceFile),
|
| + updated_sourcefiles, &kernel_pgm, true /* incrementally */);
|
| + EXPECT(error == NULL);
|
| + EXPECT_NOTNULL(kernel_pgm);
|
| +
|
| + lib = TestCase::ReloadTestKernel(kernel_pgm);
|
| + EXPECT_VALID(lib);
|
| + }
|
| + result = Dart_Invoke(lib, NewString("main"), 0, NULL);
|
| + result = Dart_IntegerToInt64(result, &value);
|
| + EXPECT_VALID(result);
|
| + EXPECT_EQ(24, value);
|
| +}
|
| +
|
| TEST_CASE(IsolateReload_BadClass) {
|
| const char* kScript =
|
| "class Foo {\n"
|
|
|