Index: runtime/bin/main.cc |
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc |
index 1429ff4e65315ec2d5760de07f3f8c92ad1eebbc..cbef2cff7e7f9c34da6579c42a6c4390ba78c7c5 100644 |
--- a/runtime/bin/main.cc |
+++ b/runtime/bin/main.cc |
@@ -38,6 +38,7 @@ extern const uint8_t* isolate_snapshot_buffer; |
// Global state that stores a pointer to the application script snapshot. |
static bool generate_script_snapshot = false; |
+static bool generate_script_snapshot_after_run = false; |
static const char* snapshot_filename = NULL; |
@@ -381,9 +382,10 @@ static bool ProcessDebugOption(const char* option_value, |
} |
-static bool ProcessGenScriptSnapshotOption(const char* filename, |
- CommandLineOptions* vm_options) { |
- if (filename != NULL && strlen(filename) != 0) { |
+static bool ProcessScriptSnapshotOptionHelper(const char* filename, |
+ bool* snapshot_option) { |
+ *snapshot_option = false; |
+ if ((filename != NULL) && (strlen(filename) != 0)) { |
// Ensure that we are already running using a full snapshot. |
if (isolate_snapshot_buffer == NULL) { |
Log::PrintErr("Script snapshots cannot be generated in this version of" |
@@ -391,13 +393,31 @@ static bool ProcessGenScriptSnapshotOption(const char* filename, |
return false; |
} |
snapshot_filename = filename; |
- generate_script_snapshot = true; |
+ *snapshot_option = true; |
+ if (generate_script_snapshot && generate_script_snapshot_after_run) { |
+ Log::PrintErr("--snapshot and --snapshot-after-run options" |
+ " cannot be specified at the same time\n"); |
+ return false; |
+ } |
return true; |
} |
return false; |
} |
+static bool ProcessScriptSnapshotOption(const char* filename, |
+ CommandLineOptions* vm_options) { |
+ return ProcessScriptSnapshotOptionHelper(filename, &generate_script_snapshot); |
+} |
+ |
+ |
+static bool ProcessScriptSnapshotAfterRunOption( |
+ const char* filename, CommandLineOptions* vm_options) { |
+ return ProcessScriptSnapshotOptionHelper(filename, |
+ &generate_script_snapshot_after_run); |
+} |
+ |
+ |
static bool ProcessEnableVmServiceOption(const char* option_value, |
CommandLineOptions* vm_options) { |
ASSERT(option_value != NULL); |
@@ -508,7 +528,8 @@ static struct { |
{ "--observe", ProcessObserveOption }, |
{ "--run-precompiled-snapshot", ProcessRunPrecompiledSnapshotOption }, |
{ "--shutdown", ProcessShutdownOption }, |
- { "--snapshot=", ProcessGenScriptSnapshotOption }, |
+ { "--snapshot=", ProcessScriptSnapshotOption }, |
+ { "--snapshot-after-run=", ProcessScriptSnapshotAfterRunOption }, |
{ "--trace-debug-protocol", ProcessTraceDebugProtocolOption }, |
{ "--trace-loading", ProcessTraceLoadingOption }, |
{ NULL, NULL } |
@@ -1106,6 +1127,34 @@ static void* LoadLibrarySymbol(const char* libname, const char* symname) { |
} |
+static void GenerateScriptSnapshot() { |
+ // First create a snapshot. |
+ uint8_t* buffer = NULL; |
+ intptr_t size = 0; |
+ Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size); |
+ if (Dart_IsError(result)) { |
+ ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); |
+ } |
+ |
+ // Open the snapshot file. |
+ File* snapshot_file = File::Open(snapshot_filename, File::kWriteTruncate); |
+ if (snapshot_file == NULL) { |
+ ErrorExit(kErrorExitCode, |
+ "Unable to open file %s for writing the snapshot\n", |
+ snapshot_filename); |
+ } |
+ |
+ // Write the magic number to indicate file is a script snapshot. |
+ DartUtils::WriteMagicNumber(snapshot_file); |
+ |
+ // Now write the snapshot out to specified file. |
+ bool bytes_written = snapshot_file->WriteFully(buffer, size); |
+ ASSERT(bytes_written); |
+ delete snapshot_file; |
+ snapshot_file = NULL; |
+} |
+ |
+ |
#define CHECK_RESULT(result) \ |
if (Dart_IsError(result)) { \ |
if (Dart_IsVMRestartRequest(result)) { \ |
@@ -1118,6 +1167,7 @@ static void* LoadLibrarySymbol(const char* libname, const char* symname) { |
ErrorExit(exit_code, "%s\n", Dart_GetError(result)); \ |
} |
+ |
bool RunMainIsolate(const char* script_name, |
CommandLineOptions* dart_options) { |
// Call CreateIsolateAndSetup which creates an isolate and loads up |
@@ -1164,29 +1214,7 @@ bool RunMainIsolate(const char* script_name, |
Dart_EnterScope(); |
if (generate_script_snapshot) { |
- // First create a snapshot. |
- Dart_Handle result; |
- uint8_t* buffer = NULL; |
- intptr_t size = 0; |
- result = Dart_CreateScriptSnapshot(&buffer, &size); |
- CHECK_RESULT(result); |
- |
- // Open the snapshot file. |
- File* snapshot_file = File::Open(snapshot_filename, File::kWriteTruncate); |
- if (snapshot_file == NULL) { |
- ErrorExit(kErrorExitCode, |
- "Unable to open file %s for writing the snapshot\n", |
- snapshot_filename); |
- } |
- |
- // Write the magic number to indicate file is a script snapshot. |
- DartUtils::WriteMagicNumber(snapshot_file); |
- |
- // Now write the snapshot out to specified file. |
- bool bytes_written = snapshot_file->WriteFully(buffer, size); |
- ASSERT(bytes_written); |
- delete snapshot_file; |
- snapshot_file = NULL; |
+ GenerateScriptSnapshot(); |
} else { |
// Lookup the library of the root script. |
Dart_Handle root_lib = Dart_RootLibrary(); |
@@ -1299,6 +1327,11 @@ bool RunMainIsolate(const char* script_name, |
// Keep handling messages until the last active receive port is closed. |
result = Dart_RunLoop(); |
CHECK_RESULT(result); |
+ |
+ // Generate a script snapshot after execution if specified. |
+ if (generate_script_snapshot_after_run) { |
+ GenerateScriptSnapshot(); |
+ } |
} |
} |