| 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);
|
| + 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,
|
|
|