| Index: runtime/bin/main.cc
|
| diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
|
| index 6a104c19b028771a5981724f32cd903e3e0d89bd..2a2604e99f634cbede38ff4fe81127bbd83d2962 100644
|
| --- a/runtime/bin/main.cc
|
| +++ b/runtime/bin/main.cc
|
| @@ -105,6 +105,7 @@ static bool trace_loading = false;
|
| static char* app_script_uri = NULL;
|
| static const uint8_t* app_isolate_snapshot_data = NULL;
|
| static const uint8_t* app_isolate_snapshot_instructions = NULL;
|
| +static AppSnapshot* app_snapshot = NULL;
|
|
|
|
|
| static Dart_Isolate main_isolate = NULL;
|
| @@ -816,6 +817,7 @@ static Dart_Isolate CreateIsolateAndSetupHelper(bool is_main_isolate,
|
| const uint8_t* isolate_snapshot_data = app_isolate_snapshot_data;
|
| const uint8_t* isolate_snapshot_instructions =
|
| app_isolate_snapshot_instructions;
|
| + AppSnapshot* app_snapshot = NULL;
|
| #else
|
| // JIT: Main isolate starts from the app snapshot, if any. Other isolates
|
| // use the core libraries snapshot.
|
| @@ -823,6 +825,7 @@ static Dart_Isolate CreateIsolateAndSetupHelper(bool is_main_isolate,
|
| const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data;
|
| const uint8_t* isolate_snapshot_instructions =
|
| core_isolate_snapshot_instructions;
|
| + AppSnapshot* app_snapshot = NULL;
|
| if ((app_isolate_snapshot_data != NULL) &&
|
| (is_main_isolate || ((app_script_uri != NULL) &&
|
| (strcmp(script_uri, app_script_uri) == 0)))) {
|
| @@ -830,17 +833,14 @@ static Dart_Isolate CreateIsolateAndSetupHelper(bool is_main_isolate,
|
| isolate_snapshot_data = app_isolate_snapshot_data;
|
| isolate_snapshot_instructions = app_isolate_snapshot_instructions;
|
| } else if (!is_main_isolate) {
|
| - const uint8_t* file_vm_snapshot_data = NULL;
|
| - const uint8_t* file_vm_snapshot_instructions = NULL;
|
| - const uint8_t* file_isolate_snapshot_data = NULL;
|
| - const uint8_t* file_isolate_snapshot_instructions = NULL;
|
| - if (Snapshot::ReadAppSnapshot(
|
| - script_uri, &file_vm_snapshot_data, &file_vm_snapshot_instructions,
|
| - &file_isolate_snapshot_data, &file_isolate_snapshot_instructions)) {
|
| - // TODO(rmacnak): We are leaking the snapshot when the isolate shuts down.
|
| + app_snapshot = Snapshot::TryReadAppSnapshot(script_uri);
|
| + if (app_snapshot != NULL) {
|
| isolate_run_app_snapshot = true;
|
| - isolate_snapshot_data = file_isolate_snapshot_data;
|
| - isolate_snapshot_instructions = file_isolate_snapshot_instructions;
|
| + const uint8_t* ignore_vm_snapshot_data;
|
| + const uint8_t* ignore_vm_snapshot_instructions;
|
| + app_snapshot->SetBuffers(
|
| + &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
|
| + &isolate_snapshot_data, &isolate_snapshot_instructions);
|
| }
|
| }
|
| #endif
|
| @@ -881,7 +881,7 @@ static Dart_Isolate CreateIsolateAndSetupHelper(bool is_main_isolate,
|
| }
|
|
|
| IsolateData* isolate_data =
|
| - new IsolateData(script_uri, package_root, packages_config);
|
| + new IsolateData(script_uri, package_root, packages_config, app_snapshot);
|
| // If the script is a Kernel binary, then we will try to bootstrap from the
|
| // script.
|
| Dart_Isolate isolate =
|
| @@ -1639,10 +1639,12 @@ void main(int argc, char** argv) {
|
| Platform::Exit(kErrorExitCode);
|
| }
|
|
|
| - if (Snapshot::ReadAppSnapshot(
|
| - script_name, &vm_snapshot_data, &vm_snapshot_instructions,
|
| - &app_isolate_snapshot_data, &app_isolate_snapshot_instructions)) {
|
| + app_snapshot = Snapshot::TryReadAppSnapshot(script_name);
|
| + if (app_snapshot != NULL) {
|
| vm_run_app_snapshot = true;
|
| + app_snapshot->SetBuffers(&vm_snapshot_data, &vm_snapshot_instructions,
|
| + &app_isolate_snapshot_data,
|
| + &app_isolate_snapshot_instructions);
|
| }
|
|
|
| #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
|
| @@ -1718,6 +1720,7 @@ void main(int argc, char** argv) {
|
| }
|
| EventHandler::Stop();
|
|
|
| + delete app_snapshot;
|
| free(app_script_uri);
|
|
|
| // Free copied argument strings if converted.
|
|
|