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

Unified Diff: runtime/vm/unit_test.cc

Issue 2993013002: Introduce IKG into kernel-service to support incremental compilation. (Closed)
Patch Set: Add TODO to add assert that isolate exists. Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/unit_test.h ('k') | utils/kernel-service/kernel-service.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/unit_test.cc
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index e49a3d3570d9e0d38d25acfebb43fa640d3556e7..f7e71d73a7c5945224f5a4c0028c0da20232671b 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -164,11 +164,12 @@ static Dart_Handle ResolvePackageUri(const char* uri_chars) {
}
static ThreadLocalKey script_reload_key = kUnsetThreadLocalKey;
+static ThreadLocalKey kernel_reload_key = kUnsetThreadLocalKey;
char* TestCase::CompileTestScriptWithDFE(const char* url,
const char* source,
- void** kernel_pgm) {
- Zone* zone = Thread::Current()->zone();
+ void** kernel_pgm,
+ bool incrementally) {
// clang-format off
Dart_SourceFile sourcefiles[] = {
{
@@ -178,9 +179,19 @@ char* TestCase::CompileTestScriptWithDFE(const char* url,
"file:///.packages", "untitled:/"
}};
// clang-format on
- int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile);
- Dart_KernelCompilationResult compilation_result =
- Dart_CompileSourcesToKernel(url, sourcefiles_count, sourcefiles);
+ return CompileTestScriptWithDFE(url,
+ sizeof(sourcefiles) / sizeof(Dart_SourceFile),
+ sourcefiles, kernel_pgm, incrementally);
+}
+
+char* TestCase::CompileTestScriptWithDFE(const char* url,
+ int sourcefiles_count,
+ Dart_SourceFile sourcefiles[],
+ void** kernel_pgm,
+ bool incrementally) {
+ Zone* zone = Thread::Current()->zone();
+ Dart_KernelCompilationResult compilation_result = Dart_CompileSourcesToKernel(
+ url, sourcefiles_count, sourcefiles, incrementally);
if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
return OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
@@ -202,25 +213,35 @@ static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag,
Dart_Handle url) {
if (FLAG_use_dart_frontend) {
// Reload request.
- ASSERT(script_reload_key != kUnsetThreadLocalKey);
- const char* script_source = reinterpret_cast<const char*>(
- OSThread::GetThreadLocal(script_reload_key));
- ASSERT(script_source != NULL);
- OSThread::SetThreadLocal(script_reload_key, 0);
+
const char* urlstr = NULL;
Dart_Handle result = Dart_StringToCString(url, &urlstr);
if (Dart_IsError(result)) {
return Dart_NewApiError("accessing url characters failed");
}
+
+ // Updated library either arrives as dart source or as
+ // a precompiled kernel binary.
void* kernel_pgm;
- char* error =
- TestCase::CompileTestScriptWithDFE(urlstr, script_source, &kernel_pgm);
- if (error == NULL) {
- return Dart_LoadScript(url, Dart_Null(),
- reinterpret_cast<Dart_Handle>(kernel_pgm), 0, 0);
+ if (script_reload_key != kUnsetThreadLocalKey) {
+ const char* script_source = reinterpret_cast<const char*>(
+ OSThread::GetThreadLocal(script_reload_key));
+ ASSERT(script_source != NULL);
+ OSThread::SetThreadLocal(script_reload_key, 0);
+ char* error = TestCase::CompileTestScriptWithDFE(urlstr, script_source,
+ &kernel_pgm);
+ if (error != NULL) {
+ return Dart_NewApiError(error);
+ }
} else {
- return Dart_NewApiError(error);
+ ASSERT(kernel_reload_key != kUnsetThreadLocalKey);
+ kernel_pgm =
+ reinterpret_cast<void*>(OSThread::GetThreadLocal(kernel_reload_key));
+ ASSERT(kernel_pgm != NULL);
+ OSThread::SetThreadLocal(kernel_reload_key, 0);
}
+ return Dart_LoadScript(url, Dart_Null(),
+ reinterpret_cast<Dart_Handle>(kernel_pgm), 0, 0);
}
if (tag == Dart_kCanonicalizeUrl) {
Dart_Handle library_url = Dart_LibraryUrl(library);
@@ -328,45 +349,47 @@ static Dart_Handle LoadTestScriptWithVMParser(const char* script,
return lib;
}
-static Dart_Handle LoadTestScriptWithDFE(const char* script,
- Dart_NativeEntryResolver resolver,
- const char* lib_url,
- bool finalize_classes) {
- Dart_Handle url = NewString(lib_url);
+Dart_Handle TestCase::LoadTestScript(const char* script,
+ Dart_NativeEntryResolver resolver,
+ const char* lib_url,
+ bool finalize_classes) {
+ return FLAG_use_dart_frontend
+ ? LoadTestScriptWithDFE(
+ 1,
+ (Dart_SourceFile[1]){{OS::SCreate(Thread::Current()->zone(),
+ "file:///%s", lib_url),
+ script}},
+ resolver, finalize_classes)
+ : LoadTestScriptWithVMParser(script, resolver, lib_url,
+ finalize_classes);
+}
+
+Dart_Handle TestCase::LoadTestScriptWithDFE(int sourcefiles_count,
+ Dart_SourceFile sourcefiles[],
+ Dart_NativeEntryResolver resolver,
+ bool finalize,
+ bool incrementally) {
+ // First script is the main script.
+ Dart_Handle url = NewString(sourcefiles[0].uri);
Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler);
EXPECT_VALID(result);
void* kernel_pgm = NULL;
- char* error =
- TestCase::CompileTestScriptWithDFE(lib_url, script, &kernel_pgm);
- if (error == NULL) {
- Dart_Handle lib = Dart_LoadScript(
- url, Dart_Null(), reinterpret_cast<Dart_Handle>(kernel_pgm), 0, 0);
- DART_CHECK_VALID(lib);
- result = Dart_SetNativeResolver(lib, resolver, NULL);
- DART_CHECK_VALID(result);
- if (finalize_classes) {
- result = Dart_FinalizeLoading(false);
- DART_CHECK_VALID(result);
- }
- return lib;
- } else {
+ char* error = TestCase::CompileTestScriptWithDFE(
+ sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_pgm,
+ incrementally);
+ if (error != NULL) {
return Dart_NewApiError(error);
}
-}
-
-Dart_Handle TestCase::LoadTestScript(const char* script,
- Dart_NativeEntryResolver resolver,
- const char* lib_url,
- bool finalize_classes) {
- if (!FLAG_use_dart_frontend) {
- return LoadTestScriptWithVMParser(script, resolver, lib_url,
- finalize_classes);
- } else {
- Zone* zone = Thread::Current()->zone();
- char* resolved_lib_url = OS::SCreate(zone, "file:///%s", lib_url);
- return LoadTestScriptWithDFE(script, resolver, resolved_lib_url,
- finalize_classes);
+ Dart_Handle lib = Dart_LoadScript(
+ url, Dart_Null(), reinterpret_cast<Dart_Handle>(kernel_pgm), 0, 0);
+ DART_CHECK_VALID(lib);
+ result = Dart_SetNativeResolver(lib, resolver, NULL);
+ DART_CHECK_VALID(result);
+ if (finalize) {
+ result = Dart_FinalizeLoading(false);
+ DART_CHECK_VALID(result);
}
+ return lib;
}
#ifndef PRODUCT
@@ -381,6 +404,16 @@ void TestCase::SetReloadTestScript(const char* script) {
OSThread::SetThreadLocal(script_reload_key, reinterpret_cast<uword>(script));
}
+void TestCase::SetReloadTestKernel(const void* kernel) {
+ if (kernel_reload_key == kUnsetThreadLocalKey) {
+ kernel_reload_key = OSThread::CreateThreadLocal();
+ }
+ ASSERT(kernel_reload_key != kUnsetThreadLocalKey);
+ ASSERT(OSThread::GetThreadLocal(kernel_reload_key) == 0);
+ // Store the new script in TLS.
+ OSThread::SetThreadLocal(kernel_reload_key, reinterpret_cast<uword>(kernel));
+}
+
Dart_Handle TestCase::TriggerReload() {
Isolate* isolate = Isolate::Current();
JSONStream js;
@@ -435,6 +468,28 @@ Dart_Handle TestCase::ReloadTestScript(const char* script) {
return result;
}
+Dart_Handle TestCase::ReloadTestKernel(const void* kernel) {
+ SetReloadTestKernel(kernel);
+
+ Dart_Handle result = TriggerReload();
+ if (Dart_IsError(result)) {
+ return result;
+ }
+
+ result = GetReloadErrorOrRootLibrary();
+
+ {
+ Thread* thread = Thread::Current();
+ TransitionNativeToVM transition(thread);
+ Isolate* isolate = thread->isolate();
+ if (isolate->reload_context() != NULL) {
+ isolate->DeleteReloadContext();
+ }
+ }
+
+ return result;
+}
+
#endif // !PRODUCT
Dart_Handle TestCase::LoadCoreTestScript(const char* script,
« no previous file with comments | « runtime/vm/unit_test.h ('k') | utils/kernel-service/kernel-service.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698