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

Unified Diff: runtime/bin/main.cc

Issue 2485993002: VM: Support bootstrapping core libraries from Kernel binaries instead of source. (Closed)
Patch Set: Done Created 4 years, 1 month 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
Index: runtime/bin/main.cc
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index b481a67980e4721ed264860c35b2811757340efb..b36681d8f02233e098a3a291c6bd34f21ea738bc 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -799,10 +799,26 @@ static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
return NULL;
}
+ // If the script is a Kernel binary, then we will try to bootstrap from the
+ // script.
+ const uint8_t* kernel_file = NULL;
+ intptr_t kernel_length = -1;
+ const bool is_kernel =
+ !run_app_snapshot &&
+ TryReadKernel(script_uri, &kernel_file, &kernel_length);
+
IsolateData* isolate_data =
new IsolateData(script_uri, package_root, packages_config);
- Dart_Isolate isolate = Dart_CreateIsolate(
- script_uri, main, isolate_snapshot_buffer, flags, isolate_data, error);
+ Dart_Isolate isolate =
+ is_kernel ? Dart_CreateIsolateFromKernel(script_uri, main, kernel_file,
+ kernel_length, flags,
+ isolate_data, error)
+ : Dart_CreateIsolate(script_uri, main, isolate_snapshot_buffer,
+ flags, isolate_data, error);
+ if (is_kernel) {
+ free(const_cast<uint8_t*>(kernel_file));
+ }
+
if (isolate == NULL) {
delete isolate_data;
return NULL;
@@ -810,7 +826,20 @@ static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
Dart_EnterScope();
- if (isolate_snapshot_buffer != NULL) {
+ // Set up the library tag handler for this isolate.
+ Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler);
+ CHECK_RESULT(result);
+
+ if (is_kernel) {
+ // TODO(27590): We should not read the kernel file again!
+ if (!TryReadKernel(script_uri, &kernel_file, &kernel_length)) {
+ FATAL("Failed to read kernel second time");
+ }
+ Dart_Handle result = Dart_LoadKernel(kernel_file, kernel_length);
siva 2016/11/16 05:49:34 The TODO says do not read the kernel file again, d
Vyacheslav Egorov (Google) 2016/11/16 12:47:46 There is a difference between snapshots we have an
+ free(const_cast<uint8_t*>(kernel_file));
+ CHECK_RESULT(result);
+ }
+ if (is_kernel || (isolate_snapshot_buffer != NULL)) {
// Setup the native resolver as the snapshot does not carry it.
Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
Builtin::SetNativeResolver(Builtin::kIOLibrary);
@@ -820,10 +849,6 @@ static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
CHECK_RESULT(result);
}
- // Set up the library tag handler for this isolate.
- Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler);
- CHECK_RESULT(result);
-
if (Dart_IsServiceIsolate(isolate)) {
// If this is the service isolate, load embedder specific bits and return.
bool skip_library_load = run_app_snapshot;
@@ -872,8 +897,10 @@ static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
Dart_Handle uri =
DartUtils::ResolveScript(Dart_NewStringFromCString(script_uri));
CHECK_RESULT(uri);
- result = Loader::LibraryTagHandler(Dart_kScriptTag, Dart_Null(), uri);
- CHECK_RESULT(result);
+ if (!is_kernel) {
+ result = Loader::LibraryTagHandler(Dart_kScriptTag, Dart_Null(), uri);
+ CHECK_RESULT(result);
+ }
Dart_TimelineEvent("LoadScript", Dart_TimelineGetMicros(),
Dart_GetMainPortId(), Dart_Timeline_Event_Async_End, 0,

Powered by Google App Engine
This is Rietveld 408576698