| Index: runtime/bin/gen_snapshot.cc | 
| =================================================================== | 
| --- runtime/bin/gen_snapshot.cc	(revision 44745) | 
| +++ runtime/bin/gen_snapshot.cc	(working copy) | 
| @@ -25,7 +25,6 @@ | 
|  | 
| #define CHECK_RESULT(result)                                                   \ | 
| if (Dart_IsError(result)) {                                                  \ | 
| -    free(snapshot_buffer);                                                     \ | 
| Log::PrintErr("Error: %s", Dart_GetError(result));                         \ | 
| Dart_ExitScope();                                                          \ | 
| Dart_ShutdownIsolate();                                                    \ | 
| @@ -35,9 +34,9 @@ | 
|  | 
| // Global state that indicates whether a snapshot is to be created and | 
| // if so which file to write the snapshot into. | 
| -static const char* snapshot_filename = NULL; | 
| +static const char* vm_isolate_snapshot_filename = NULL; | 
| +static const char* isolate_snapshot_filename = NULL; | 
| static const char* package_root = NULL; | 
| -static uint8_t* snapshot_buffer = NULL; | 
|  | 
|  | 
| // Global state which contains a pointer to the script name for which | 
| @@ -67,10 +66,10 @@ | 
| } | 
|  | 
|  | 
| -static bool ProcessSnapshotOption(const char* option) { | 
| -  const char* name = ProcessOption(option, "--snapshot="); | 
| +static bool ProcessVmIsolateSnapshotOption(const char* option) { | 
| +  const char* name = ProcessOption(option, "--vm_isolate_snapshot="); | 
| if (name != NULL) { | 
| -    snapshot_filename = name; | 
| +    vm_isolate_snapshot_filename = name; | 
| return true; | 
| } | 
| return false; | 
| @@ -77,6 +76,16 @@ | 
| } | 
|  | 
|  | 
| +static bool ProcessIsolateSnapshotOption(const char* option) { | 
| +  const char* name = ProcessOption(option, "--isolate_snapshot="); | 
| +  if (name != NULL) { | 
| +    isolate_snapshot_filename = name; | 
| +    return true; | 
| +  } | 
| +  return false; | 
| +} | 
| + | 
| + | 
| static bool ProcessPackageRootOption(const char* option) { | 
| const char* name = ProcessOption(option, "--package_root="); | 
| if (name != NULL) { | 
| @@ -114,7 +123,8 @@ | 
|  | 
| // Parse out the vm options. | 
| while ((i < argc) && IsValidFlag(argv[i], kPrefix, kPrefixLen)) { | 
| -    if (ProcessSnapshotOption(argv[i]) || | 
| +    if (ProcessVmIsolateSnapshotOption(argv[i]) || | 
| +        ProcessIsolateSnapshotOption(argv[i]) || | 
| ProcessURLmappingOption(argv[i]) || | 
| ProcessPackageRootOption(argv[i])) { | 
| i += 1; | 
| @@ -132,20 +142,27 @@ | 
| *script_name = NULL; | 
| } | 
|  | 
| -  if (snapshot_filename == NULL) { | 
| -    Log::PrintErr("No snapshot output file specified.\n\n"); | 
| +  if (vm_isolate_snapshot_filename == NULL) { | 
| +    Log::PrintErr("No vm isolate snapshot output file specified.\n\n"); | 
| return -1; | 
| } | 
|  | 
| +  if (isolate_snapshot_filename == NULL) { | 
| +    Log::PrintErr("No isolate snapshot output file specified.\n\n"); | 
| +    return -1; | 
| +  } | 
| + | 
| return 0; | 
| } | 
|  | 
|  | 
| -static void WriteSnapshotFile(const uint8_t* buffer, const intptr_t size) { | 
| -  File* file = File::Open(snapshot_filename, File::kWriteTruncate); | 
| +static void WriteSnapshotFile(const char* filename, | 
| +                              const uint8_t* buffer, | 
| +                              const intptr_t size) { | 
| +  File* file = File::Open(filename, File::kWriteTruncate); | 
| ASSERT(file != NULL); | 
| if (!file->WriteFully(buffer, size)) { | 
| -    Log::PrintErr("Error: Failed to write full snapshot.\n\n"); | 
| +    Log::PrintErr("Error: Failed to write snapshot file.\n\n"); | 
| } | 
| delete file; | 
| } | 
| @@ -438,15 +455,26 @@ | 
|  | 
| static void CreateAndWriteSnapshot() { | 
| Dart_Handle result; | 
| -  uint8_t* buffer = NULL; | 
| -  intptr_t size = 0; | 
| +  uint8_t* vm_isolate_buffer = NULL; | 
| +  intptr_t vm_isolate_size = 0; | 
| +  uint8_t* isolate_buffer = NULL; | 
| +  intptr_t isolate_size = 0; | 
|  | 
| // First create a snapshot. | 
| -  result = Dart_CreateSnapshot(&buffer, &size); | 
| +  result = Dart_CreateSnapshot(&vm_isolate_buffer, | 
| +                               &vm_isolate_size, | 
| +                               &isolate_buffer, | 
| +                               &isolate_size); | 
| CHECK_RESULT(result); | 
|  | 
| -  // Now write the snapshot out to specified file and exit. | 
| -  WriteSnapshotFile(buffer, size); | 
| +  // Now write the vm isolate and isolate snapshots out to the | 
| +  // specified file and exit. | 
| +  WriteSnapshotFile(vm_isolate_snapshot_filename, | 
| +                    vm_isolate_buffer, | 
| +                    vm_isolate_size); | 
| +  WriteSnapshotFile(isolate_snapshot_filename, | 
| +                    isolate_buffer, | 
| +                    isolate_size); | 
| Dart_ExitScope(); | 
|  | 
| // Shutdown the isolate. | 
| @@ -510,7 +538,8 @@ | 
| // Initialize the Dart VM. | 
| // Note: We don't expect isolates to be created from dart code during | 
| // snapshot generation. | 
| -  if (!Dart_Initialize(NULL, NULL, NULL, NULL, | 
| +  if (!Dart_Initialize(NULL, | 
| +                       NULL, NULL, NULL, NULL, | 
| DartUtils::OpenFile, | 
| DartUtils::ReadFile, | 
| DartUtils::WriteFile, | 
| @@ -532,7 +561,8 @@ | 
| Dart_Handle library; | 
| Dart_EnterScope(); | 
|  | 
| -  ASSERT(snapshot_filename != NULL); | 
| +  ASSERT(vm_isolate_snapshot_filename != NULL); | 
| +  ASSERT(isolate_snapshot_filename != NULL); | 
| // Load up the script before a snapshot is created. | 
| if (app_script_name != NULL) { | 
| // This is the case of a custom embedder (e.g: dartium) trying to | 
|  |