Chromium Code Reviews| Index: runtime/bin/gen_snapshot.cc |
| diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc |
| index 732493d5fe11dd42cf3c9cdf7dad25252f531a6f..d2046b93b0ef5f44069e671354dbc6641c55cc30 100644 |
| --- a/runtime/bin/gen_snapshot.cc |
| +++ b/runtime/bin/gen_snapshot.cc |
| @@ -42,7 +42,7 @@ static const int kRestartRequestExitCode = 1000; |
| #define CHECK_RESULT(result) \ |
| if (Dart_IsError(result)) { \ |
| intptr_t exit_code = 0; \ |
| - Log::PrintErr("Error: %s", Dart_GetError(result)); \ |
| + Log::PrintErr("Error: %s\n", Dart_GetError(result)); \ |
| if (Dart_IsCompilationError(result)) { \ |
| exit_code = kCompilationErrorExitCode; \ |
| } else if (Dart_IsApiError(result)) { \ |
| @@ -58,13 +58,27 @@ static const int kRestartRequestExitCode = 1000; |
| } |
| +// The core snapshot to use when creating isolates. Normally NULL, but loaded |
| +// from a file when creating script snapshots. |
| +const uint8_t* isolate_snapshot_data = NULL; |
| + |
| + |
| // Global state that indicates whether a snapshot is to be created and |
| // if so which file to write the snapshot into. |
| +enum SnapshotKind { |
| + kNone, |
| + kCore, |
| + kScript, |
| + kAppAOTBlobs, |
| + kAppAOTAssembly, |
| +}; |
|
siva
2017/02/14 03:56:09
why not move this to snapshot_utils.h and share it
|
| +static SnapshotKind snapshot_kind = kNone; |
| static const char* vm_snapshot_data_filename = NULL; |
| static const char* vm_snapshot_instructions_filename = NULL; |
| static const char* isolate_snapshot_data_filename = NULL; |
| static const char* isolate_snapshot_instructions_filename = NULL; |
| static const char* assembly_filename = NULL; |
| +static const char* script_snapshot_filename = NULL; |
| // Value of the --package-root flag. |
| @@ -189,6 +203,32 @@ static const char* ProcessOption(const char* option, const char* name) { |
| } |
| +static bool ProcessSnapshotKindOption(const char* option) { |
| + const char* kind = ProcessOption(option, "--snapshot_kind="); |
| + if (kind == NULL) { |
| + return false; |
| + } |
| + if (strcmp(kind, "core") == 0) { |
| + snapshot_kind = kCore; |
| + return true; |
| + } else if (strcmp(kind, "script") == 0) { |
| + snapshot_kind = kScript; |
| + return true; |
| + } else if (strcmp(kind, "app-aot-blobs") == 0) { |
| + snapshot_kind = kAppAOTBlobs; |
| + return true; |
| + } else if (strcmp(kind, "app-aot-assembly") == 0) { |
| + snapshot_kind = kAppAOTAssembly; |
| + return true; |
| + } |
| + Log::PrintErr( |
| + "Unrecognized snapshot kind: '%s'\nValid kinds are: " |
| + "core, script, app-aot-blobs, app-aot-assembly\n", |
| + kind); |
| + return false; |
| +} |
|
siva
2017/02/14 03:56:09
Can this also be moved to snapshot_utils.cc and sh
rmacnak
2017/02/14 23:39:39
They're different: main.cc doesn't generate core s
|
| + |
| + |
| static bool ProcessVmSnapshotDataOption(const char* option) { |
| const char* name = ProcessOption(option, "--vm_snapshot_data="); |
| if (name != NULL) { |
| @@ -239,6 +279,16 @@ static bool ProcessAssemblyOption(const char* option) { |
| } |
| +static bool ProcessScriptSnapshotOption(const char* option) { |
| + const char* name = ProcessOption(option, "--script_snapshot="); |
| + if (name != NULL) { |
| + script_snapshot_filename = name; |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| + |
| static bool ProcessEmbedderEntryPointsManifestOption(const char* option) { |
| const char* name = ProcessOption(option, "--embedder_entry_points_manifest="); |
| if (name != NULL) { |
| @@ -286,8 +336,7 @@ static bool ProcessURLmappingOption(const char* option) { |
| static bool IsSnapshottingForPrecompilation() { |
| - return (assembly_filename != NULL) || |
| - (vm_snapshot_instructions_filename != NULL); |
| + return (snapshot_kind == kAppAOTBlobs) || (snapshot_kind == kAppAOTAssembly); |
| } |
| @@ -305,11 +354,13 @@ static int ParseArguments(int argc, |
| // Parse out the vm options. |
| while ((i < argc) && IsValidFlag(argv[i], kPrefix, kPrefixLen)) { |
| - if (ProcessVmSnapshotDataOption(argv[i]) || |
| + if (ProcessSnapshotKindOption(argv[i]) || |
| + ProcessVmSnapshotDataOption(argv[i]) || |
| ProcessVmSnapshotInstructionsOption(argv[i]) || |
| ProcessIsolateSnapshotDataOption(argv[i]) || |
| ProcessIsolateSnapshotInstructionsOption(argv[i]) || |
| ProcessAssemblyOption(argv[i]) || |
| + ProcessScriptSnapshotOption(argv[i]) || |
| ProcessEmbedderEntryPointsManifestOption(argv[i]) || |
| ProcessURLmappingOption(argv[i]) || ProcessPackageRootOption(argv[i]) || |
| ProcessPackagesOption(argv[i]) || ProcessEnvironmentOption(argv[i])) { |
| @@ -333,43 +384,65 @@ static int ParseArguments(int argc, |
| (commandline_packages_file != NULL)) { |
| Log::PrintErr( |
| "Specifying both a packages directory and a packages " |
| - "file is invalid.\n"); |
| - return -1; |
| - } |
| - |
| - if (vm_snapshot_data_filename == NULL) { |
| - Log::PrintErr("No vm snapshot output file specified.\n\n"); |
| + "file is invalid.\n\n"); |
| return -1; |
| } |
| - if (isolate_snapshot_data_filename == NULL) { |
| - Log::PrintErr("No isolate snapshot output file specified.\n\n"); |
| - return -1; |
| + switch (snapshot_kind) { |
| + case kNone: { |
| + Log::PrintErr("No snapshot kind specified.\n\n"); |
| + return -1; |
| + } |
| + case kCore: { |
| + if ((vm_snapshot_data_filename == NULL) || |
| + (isolate_snapshot_data_filename == NULL)) { |
| + Log::PrintErr( |
| + "Building a core snapshot requires specifying output " |
| + "files for --vm_snapshot_data and --isolate_snapshot_data.\n\n"); |
| + return -1; |
| + } |
| + break; |
| + } |
| + case kScript: { |
| + if ((vm_snapshot_data_filename == NULL) || |
| + (isolate_snapshot_data_filename == NULL) || |
| + (script_snapshot_filename == NULL)) { |
| + Log::PrintErr( |
| + "Building a script snapshot requires specifying input " |
| + "files for --vm_snapshot_data and --isolate_snapshot_data and an " |
| + "output file for --script-snapshot.\n\n"); |
| + return -1; |
| + } |
| + break; |
| + } |
| + case kAppAOTBlobs: { |
| + if ((vm_snapshot_data_filename == NULL) || |
| + (vm_snapshot_instructions_filename == NULL) || |
| + (isolate_snapshot_data_filename == NULL) || |
| + (isolate_snapshot_instructions_filename == NULL)) { |
| + Log::PrintErr( |
| + "Building an AOT snapshot as blobs requires specifying " |
| + "output files for --vm_snapshot_data, --vm_snapshot_instructions, " |
| + "--isolate_snapshot_data and --isolate_snapshot_instructions.\n\n"); |
| + return -1; |
| + } |
| + break; |
| + } |
| + case kAppAOTAssembly: { |
| + if (assembly_filename == NULL) { |
| + Log::PrintErr( |
| + "Building an AOT snapshot as assembly requires specifying " |
| + "an output file for --assembly.\n\n"); |
| + return -1; |
| + } |
| + break; |
| + } |
| } |
| - bool precompiled_as_assembly = assembly_filename != NULL; |
| - bool precompiled_as_blobs = (vm_snapshot_instructions_filename != NULL) || |
| - (isolate_snapshot_instructions_filename != NULL); |
| - if (precompiled_as_assembly && precompiled_as_blobs) { |
| - Log::PrintErr( |
| - "Cannot request a precompiled snapshot simultaneously as " |
| - "assembly (--assembly=<output.file>) and as blobs " |
| - "(--instructions-blob=<output.file> and " |
| - "--rodata-blob=<output.file>)\n\n"); |
| - return -1; |
| - } |
| - if ((vm_snapshot_instructions_filename != NULL) != |
| - (isolate_snapshot_instructions_filename != NULL)) { |
| - Log::PrintErr( |
| - "Requesting a precompiled snapshot as blobs requires both " |
| - "(--vm_snapshot_instructions=<output.file> and " |
| - "--isolate_snapshot_instructions=<output.file>)\n\n"); |
| - return -1; |
| - } |
| if (IsSnapshottingForPrecompilation() && (entry_points_files->count() == 0)) { |
| Log::PrintErr( |
| - "Specifying an instructions snapshot filename indicates precompilation" |
| - ". But no embedder entry points manifest was specified.\n\n"); |
| + "Building an AOT snapshot requires at least one embedder " |
| + "entry points manifest.\n\n"); |
| return -1; |
| } |
| @@ -379,7 +452,8 @@ static int ParseArguments(int argc, |
| static void WriteSnapshotFile(const char* filename, |
| const uint8_t* buffer, |
| - const intptr_t size) { |
| + const intptr_t size, |
| + bool write_magic_number = false) { |
| File* file = File::Open(filename, File::kWriteTruncate); |
| if (file == NULL) { |
| Log::PrintErr("Error: Unable to write snapshot file: %s\n\n", filename); |
| @@ -388,6 +462,10 @@ static void WriteSnapshotFile(const char* filename, |
| Dart_Cleanup(); |
| exit(kErrorExitCode); |
| } |
| + if (write_magic_number) { |
| + // Write the magic number to indicate file is a script snapshot. |
| + DartUtils::WriteMagicNumber(file); |
| + } |
| if (!file->WriteFully(buffer, size)) { |
| Log::PrintErr("Error: Failed to write snapshot file.\n\n"); |
| } |
| @@ -495,10 +573,10 @@ static Dart_Handle LoadSnapshotCreationScript(const char* script_name) { |
| if (Dart_IsError(source)) { |
| return source; |
| } |
| - if (IsSnapshottingForPrecompilation()) { |
| - return Dart_LoadScript(resolved_uri, Dart_Null(), source, 0, 0); |
| - } else { |
| + if (snapshot_kind == kCore) { |
| return Dart_LoadLibrary(resolved_uri, Dart_Null(), source, 0, 0); |
| + } else { |
| + return Dart_LoadScript(resolved_uri, Dart_Null(), source, 0, 0); |
| } |
| } |
| @@ -614,61 +692,65 @@ static void PrintUsage() { |
| "Usage: \n" |
| " gen_snapshot [<vm-flags>] [<options>] [<dart-script-file>] \n" |
| " \n" |
| -" Writes a snapshot of <dart-script-file> to the specified snapshot files. \n" |
| -" If no <dart-script-file> is passed, a generic snapshot of all the corelibs\n" |
| -" is created. It is required to specify the VM isolate snapshot and the \n" |
| -" isolate snapshot. The other flags are related to precompilation and are \n" |
| -" optional. \n" |
| +" Global options: \n" |
| +" --package_root=<path> Where to find packages, that is, \n" |
| +" package:... imports. \n" |
| " \n" |
| -" Precompilation: \n" |
| -" In order to configure the snapshotter for precompilation, either \n" |
| -" --assembly=outputfile or --instructions_blob=outputfile1 and \n" |
| -" --rodata_blob=outputfile2 must be specified. If the former is choosen, \n" |
| -" assembly for the target architecture will be output into the given file, \n" |
| -" which must be compiled separately and either statically linked or \n" |
| -" dynamically loaded in the target executable. The symbols \n" |
| -" kInstructionsSnapshot and kDataSnapshot must be passed to Dart_Initialize.\n" |
| -" If the latter is choosen, binary data is output into the given files, \n" |
| -" which should be mmapped and passed to Dart_Initialize, with the \n" |
| -" instruction blob being mapped as executable. \n" |
| -" In both cases, a entry points manifest must be given to list the places \n" |
| -" in the Dart program the embedder calls from the C API (Dart_Invoke, etc). \n" |
| -" Not specifying these may cause the tree shaker to remove them from the \n" |
| -" program. The format of this manifest is as follows. Each line in the \n" |
| -" manifest is a comma separated list of three elements. The first entry is \n" |
| -" the library URI, the second entry is the class name and the final entry \n" |
| -" the function name. The file must be terminated with a newline charater. \n" |
| +" --packages=<packages_file> Where to find a package spec file \n" |
| " \n" |
| -" Example: \n" |
| -" dart:something,SomeClass,doSomething \n" |
| +" --url_mapping=<mapping> Uses the URL mapping(s) specified on \n" |
| +" the command line to load the \n" |
| +" libraries. \n" |
| " \n" |
| -" Supported options: \n" |
| -" --vm_snapshot_data=<file> A full snapshot is a compact \n" |
| -" --isolate_snapshot_data=<file> representation of the dart vm isolate \n" |
| -" heap and dart isolate heap states. \n" |
| -" Both these options are required \n" |
| +" To create a core snapshot: \n" |
| +" --snapshot-kind=core \n" |
| +" --vm_snapshot_data=<output-file> \n" |
| +" --isolate_snapshot_data=<output-file> \n" |
| +" [<dart-script-file>] \n" |
| " \n" |
| -" --package_root=<path> Where to find packages, that is, \n" |
| -" package:... imports. \n" |
| +" Writes a snapshot of <dart-script-file> to the specified snapshot files. \n" |
| +" If no <dart-script-file> is passed, a generic snapshot of all the corelibs \n" |
| +" is created. \n" |
| " \n" |
| -" --packages=<packages_file> Where to find a package spec file \n" |
| +" To create a script snapshot with respect to a given core snapshot: \n" |
| +" --snapshot-kind=script \n" |
| +" --vm_snapshot_data=<intput-file> \n" |
| +" --isolate_snapshot_data=<intput-file> \n" |
| +" --script_snapshot=<output-file> \n" |
| +" <dart-script-file> \n" |
| " \n" |
| -" --url_mapping=<mapping> Uses the URL mapping(s) specified on \n" |
| -" the command line to load the \n" |
| -" libraries. \n" |
| +" Writes a snapshot of <dart-script-file> to the specified snapshot files. \n" |
| +" If no <dart-script-file> is passed, a generic snapshot of all the corelibs\n" |
| +" is created. \n" |
| +" \n" |
| +" To create an AOT application snapshot as blobs suitable for loading with \n" |
| +" mmap: \n" |
| +" --snapshot-kind=app-aot-blobs \n" |
| +" --vm_snapshot_data=<output-file> \n" |
| +" --vm_snapshot_instructions=<output-file> \n" |
| +" --isolate_snapshot_data=<output-file> \n" |
| +" --isolate_snapshot_instructions=<output-file> \n" |
| +" {--embedder_entry_points_manifest=<input-file>} \n" |
| +" <dart-script-file> \n" |
| " \n" |
| -" --assembly=<file> (Precompilation only) Contains the \n" |
| -" assembly that must be linked into \n" |
| -" the target binary \n" |
| +" To create an AOT application snapshot as assembly suitable for compilation \n" |
| +" as a static or dynamic library: \n" |
| +" mmap: \n" |
| +" --snapshot-kind=app-aot-blobs \n" |
| +" --assembly=<output-file> \n" |
| +" {--embedder_entry_points_manifest=<input-file>} \n" |
| +" <dart-script-file> \n" |
| " \n" |
| -" --vm_snapshot_instructions=<file> (Precompilation only) Contains the \n" |
| -" --isolate_snapshot_instructions=<file> instructions and read-only data \n" |
| -" that must be mapped into the target \n" |
| -" binary \n" |
| +" AOT snapshots require entry points manifest files, which list the places \n" |
| +" in the Dart program the embedder calls from the C API (Dart_Invoke, etc). \n" |
| +" Not specifying these may cause the tree shaker to remove them from the \n" |
| +" program. The format of this manifest is as follows. Each line in the \n" |
| +" manifest is a comma separated list of three elements. The first entry is \n" |
| +" the library URI, the second entry is the class name and the final entry \n" |
| +" the function name. The file must be terminated with a newline charater. \n" |
| " \n" |
| -" --embedder_entry_points_manifest=<file> (Precompilation or app \n" |
| -" snapshots) Contains embedder's entry \n" |
| -" points into Dart code from the C API. \n" |
| +" Example: \n" |
| +" dart:something,SomeClass,doSomething \n" |
| "\n"); |
| } |
| // clang-format on |
| @@ -1028,8 +1110,11 @@ static Dart_QualifiedFunctionName* ParseEntryPointsManifestIfPresent() { |
| } |
| -static void CreateAndWriteSnapshot() { |
| - ASSERT(!IsSnapshottingForPrecompilation()); |
| +static void CreateAndWriteCoreSnapshot() { |
| + ASSERT(snapshot_kind == kCore); |
| + ASSERT(vm_snapshot_data_filename != NULL); |
| + ASSERT(isolate_snapshot_data_filename != NULL); |
| + |
| Dart_Handle result; |
| uint8_t* vm_snapshot_data_buffer = NULL; |
| intptr_t vm_snapshot_data_size = 0; |
| @@ -1048,10 +1133,21 @@ static void CreateAndWriteSnapshot() { |
| vm_snapshot_data_size); |
| WriteSnapshotFile(isolate_snapshot_data_filename, |
| isolate_snapshot_data_buffer, isolate_snapshot_data_size); |
| - Dart_ExitScope(); |
| +} |
| + |
| + |
| +static void CreateAndWriteScriptSnapshot() { |
| + ASSERT(snapshot_kind == kScript); |
| + ASSERT(script_snapshot_filename != NULL); |
| + |
| + // First create a snapshot. |
| + uint8_t* buffer = NULL; |
| + intptr_t size = 0; |
| + Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size); |
| + CHECK_RESULT(result); |
| - // Shutdown the isolate. |
| - Dart_ShutdownIsolate(); |
| + // Now write it out to the specified file. |
| + WriteSnapshotFile(script_snapshot_filename, buffer, size, true); |
| } |
| @@ -1067,13 +1163,18 @@ static void CreateAndWritePrecompiledSnapshot( |
| // Create a precompiled snapshot. |
| bool as_assembly = assembly_filename != NULL; |
| if (as_assembly) { |
| + ASSERT(snapshot_kind == kAppAOTAssembly); |
| + |
| uint8_t* assembly_buffer = NULL; |
| intptr_t assembly_size = 0; |
| result = |
| Dart_CreateAppAOTSnapshotAsAssembly(&assembly_buffer, &assembly_size); |
| CHECK_RESULT(result); |
| + |
| WriteSnapshotFile(assembly_filename, assembly_buffer, assembly_size); |
| } else { |
| + ASSERT(snapshot_kind == kAppAOTBlobs); |
| + |
| uint8_t* vm_snapshot_data_buffer = NULL; |
| intptr_t vm_snapshot_data_size = 0; |
| uint8_t* vm_snapshot_instructions_buffer = NULL; |
| @@ -1089,6 +1190,7 @@ static void CreateAndWritePrecompiledSnapshot( |
| &isolate_snapshot_instructions_buffer, |
| &isolate_snapshot_instructions_size); |
| CHECK_RESULT(result); |
| + |
| WriteSnapshotFile(vm_snapshot_data_filename, vm_snapshot_data_buffer, |
| vm_snapshot_data_size); |
| WriteSnapshotFile(vm_snapshot_instructions_filename, |
| @@ -1100,11 +1202,6 @@ static void CreateAndWritePrecompiledSnapshot( |
| isolate_snapshot_instructions_buffer, |
| isolate_snapshot_instructions_size); |
| } |
| - |
| - Dart_ExitScope(); |
| - |
| - // Shutdown the isolate. |
| - Dart_ShutdownIsolate(); |
| } |
| @@ -1112,7 +1209,7 @@ static void SetupForUriResolution() { |
| // Set up the library tag handler for this isolate. |
| Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler); |
| if (Dart_IsError(result)) { |
| - Log::PrintErr("%s", Dart_GetError(result)); |
| + Log::PrintErr("%s\n", Dart_GetError(result)); |
| Dart_ExitScope(); |
| Dart_ShutdownIsolate(); |
| exit(kErrorExitCode); |
| @@ -1150,28 +1247,28 @@ static Dart_Isolate CreateServiceIsolate(const char* script_uri, |
| IsolateData* isolate_data = |
| new IsolateData(script_uri, package_root, package_config); |
| Dart_Isolate isolate = NULL; |
| - isolate = Dart_CreateIsolate(script_uri, main, NULL, NULL, NULL, isolate_data, |
| - error); |
| + isolate = Dart_CreateIsolate(script_uri, main, isolate_snapshot_data, NULL, |
| + NULL, isolate_data, error); |
| if (isolate == NULL) { |
| - Log::PrintErr("Error: Could not create service isolate"); |
| + Log::PrintErr("Error: Could not create service isolate\n"); |
| return NULL; |
| } |
| Dart_EnterScope(); |
| if (!Dart_IsServiceIsolate(isolate)) { |
| - Log::PrintErr("Error: We only expect to create the service isolate"); |
| + Log::PrintErr("Error: We only expect to create the service isolate\n"); |
| return NULL; |
| } |
| Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler); |
| - // Setup the native resolver. |
| - Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary); |
| - Builtin::LoadAndCheckLibrary(Builtin::kIOLibrary); |
| if (Dart_IsError(result)) { |
| - Log::PrintErr("Error: Could not set tag handler for service isolate"); |
| + Log::PrintErr("Error: Could not set tag handler for service isolate\n"); |
| return NULL; |
| } |
| - CHECK_RESULT(result); |
| + // Setup the native resolver. |
| + Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary); |
| + Builtin::LoadAndCheckLibrary(Builtin::kIOLibrary); |
| + |
| ASSERT(Dart_IsServiceIsolate(isolate)); |
| // Load embedder specific bits and return. Will not start http server. |
| if (!VmService::Setup("127.0.0.1", -1, false /* running_precompiled */, |
| @@ -1244,6 +1341,34 @@ int main(int argc, char** argv) { |
| init_params.file_close = DartUtils::CloseFile; |
| init_params.entropy_source = DartUtils::EntropySource; |
| + if (snapshot_kind == kScript) { |
| + File* file = File::Open(vm_snapshot_data_filename, File::kRead); |
| + if (file == NULL) { |
| + Log::PrintErr("Failed to open: %s\n", vm_snapshot_data_filename); |
| + return kErrorExitCode; |
| + } |
| + void* buffer = file->Map(File::kReadOnly, 0, file->Length()); |
| + if (buffer == NULL) { |
| + Log::PrintErr("Failed to read: %s\n", vm_snapshot_data_filename); |
| + return kErrorExitCode; |
| + } |
| + file->Close(); |
| + init_params.vm_snapshot_data = reinterpret_cast<const uint8_t*>(buffer); |
| + |
| + file = File::Open(isolate_snapshot_data_filename, File::kRead); |
| + if (file == NULL) { |
| + Log::PrintErr("Failed to open: %s\n", isolate_snapshot_data_filename); |
| + return kErrorExitCode; |
| + } |
| + buffer = file->Map(File::kReadOnly, 0, file->Length()); |
| + if (buffer == NULL) { |
| + Log::PrintErr("Failed to read: %s\n", isolate_snapshot_data_filename); |
| + return kErrorExitCode; |
| + } |
| + file->Close(); |
| + isolate_snapshot_data = reinterpret_cast<const uint8_t*>(buffer); |
| + } |
| + |
| char* error = Dart_Initialize(&init_params); |
| if (error != NULL) { |
| Log::PrintErr("VM initialization failed: %s\n", error); |
| @@ -1253,10 +1378,10 @@ int main(int argc, char** argv) { |
| IsolateData* isolate_data = new IsolateData(NULL, commandline_package_root, |
| commandline_packages_file); |
| - Dart_Isolate isolate = |
| - Dart_CreateIsolate(NULL, NULL, NULL, NULL, NULL, isolate_data, &error); |
| + Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL, isolate_snapshot_data, |
| + NULL, NULL, isolate_data, &error); |
| if (isolate == NULL) { |
| - Log::PrintErr("Error: %s", error); |
| + Log::PrintErr("Error: %s\n", error); |
| free(error); |
| exit(kErrorExitCode); |
| } |
| @@ -1316,10 +1441,10 @@ int main(int argc, char** argv) { |
| is_kernel_file |
| ? Dart_CreateIsolateFromKernel(NULL, NULL, kernel_program, NULL, |
| isolate_data, &error) |
| - : Dart_CreateIsolate(NULL, NULL, NULL, NULL, NULL, isolate_data, |
| - &error); |
| + : Dart_CreateIsolate(NULL, NULL, isolate_snapshot_data, NULL, NULL, |
| + isolate_data, &error); |
| if (isolate == NULL) { |
| - Log::PrintErr("%s", error); |
| + Log::PrintErr("%s\n", error); |
| free(error); |
| exit(kErrorExitCode); |
| } |
| @@ -1361,19 +1486,34 @@ int main(int argc, char** argv) { |
| result = Dart_FinalizeLoading(false); |
| CHECK_RESULT(result); |
| - if (!IsSnapshottingForPrecompilation()) { |
| - CreateAndWriteSnapshot(); |
| - } else { |
| - CreateAndWritePrecompiledSnapshot(entry_points); |
| + switch (snapshot_kind) { |
| + case kCore: |
| + CreateAndWriteCoreSnapshot(); |
| + break; |
| + case kScript: |
| + CreateAndWriteScriptSnapshot(); |
| + break; |
| + case kAppAOTBlobs: |
| + case kAppAOTAssembly: |
| + CreateAndWritePrecompiledSnapshot(entry_points); |
| + break; |
| + default: |
| + UNREACHABLE(); |
| } |
| + Dart_ExitScope(); |
| + Dart_ShutdownIsolate(); |
| + |
| CleanupEntryPointsCollection(entry_points); |
| Dart_EnterIsolate(UriResolverIsolateScope::isolate); |
| Dart_ShutdownIsolate(); |
| } else { |
| SetupForGenericSnapshotCreation(); |
| - CreateAndWriteSnapshot(); |
| + CreateAndWriteCoreSnapshot(); |
| + |
| + Dart_ExitScope(); |
| + Dart_ShutdownIsolate(); |
| } |
| error = Dart_Cleanup(); |
| if (error != NULL) { |