Chromium Code Reviews| Index: runtime/bin/gen_snapshot.cc |
| diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc |
| index 258b9a72850901574b3a6519cbec3c488849dc25..e4e4ce56b0b0117c00db7b6613ab0c756ada411d 100644 |
| --- a/runtime/bin/gen_snapshot.cc |
| +++ b/runtime/bin/gen_snapshot.cc |
| @@ -41,7 +41,6 @@ namespace bin { |
| static const char* vm_isolate_snapshot_filename = NULL; |
| static const char* isolate_snapshot_filename = NULL; |
| static const char* instructions_snapshot_filename = NULL; |
| -static const char* embedder_entry_points_manifest = NULL; |
| static const char* package_root = NULL; |
| @@ -54,6 +53,10 @@ static char* app_script_name = NULL; |
| // Global state that captures the URL mappings specified on the command line. |
| static CommandLineOptions* url_mapping = NULL; |
| +// Global state that captures the entry point manifest files specified on the |
| +// command line. |
| +static CommandLineOptions* entry_points_files = NULL; |
| + |
| static bool IsValidFlag(const char* name, |
| const char* prefix, |
| intptr_t prefix_length) { |
| @@ -105,7 +108,7 @@ static bool ProcessInstructionsSnapshotOption(const char* option) { |
| static bool ProcessEmbedderEntryPointsManifestOption(const char* option) { |
| const char* name = ProcessOption(option, "--embedder_entry_points_manifest="); |
| if (name != NULL) { |
| - embedder_entry_points_manifest = name; |
| + entry_points_files->AddArgument(name); |
| return true; |
| } |
| return false; |
| @@ -181,14 +184,14 @@ static int ParseArguments(int argc, |
| } |
| if ((instructions_snapshot_filename != NULL) && |
| - (embedder_entry_points_manifest == NULL)) { |
| + (entry_points_files->count() == 0)) { |
| Log::PrintErr( |
| "Specifying an instructions snapshot filename indicates precompilation" |
| ". But no embedder entry points manifest was specified.\n\n"); |
| return -1; |
| } |
| - if ((embedder_entry_points_manifest != NULL) && |
| + if ((entry_points_files->count() > 0) && |
| (instructions_snapshot_filename == NULL)) { |
| Log::PrintErr( |
| "Specifying the embedder entry points manifest indicates " |
| @@ -201,8 +204,8 @@ static int ParseArguments(int argc, |
| static bool IsSnapshottingForPrecompilation(void) { |
| - return embedder_entry_points_manifest != NULL && |
| - instructions_snapshot_filename != NULL; |
| + return (entry_points_files->count() > 0) && |
| + (instructions_snapshot_filename != NULL); |
| } |
| @@ -781,31 +784,34 @@ int64_t ParseEntryPointsManifestLines(FILE* file, |
| } |
| -static Dart_QualifiedFunctionName* ParseEntryPointsManifestFile( |
| - const char* path) { |
| - if (path == NULL) { |
| - return NULL; |
| - } |
| +static Dart_QualifiedFunctionName* ParseEntryPointsManifestFiles() { |
| + // Total number of entries across all manifest files. |
| + int64_t entry_count = 0; |
|
Florian Schneider
2016/04/19 22:05:23
intptr_t
|
| - FILE* file = fopen(path, "r"); |
| + // Parse the files once but don't store the results. This is done to first |
| + // determine the number of entries in the manifest |
| + for (intptr_t i = 0; i < entry_points_files->count(); i++) { |
| + const char* path = entry_points_files->GetArgument(i); |
| - if (file == NULL) { |
| - Log::PrintErr("Could not open entry points manifest file\n"); |
| - return NULL; |
| - } |
| + FILE* file = fopen(path, "r"); |
| - // Parse the file once but don't store the results. This is done to first |
| - // determine the number of entries in the manifest |
| - int64_t entry_count = ParseEntryPointsManifestLines(file, NULL); |
| + if (file == NULL) { |
| + Log::PrintErr("Could not open entry points manifest file `%s`\n", path); |
| + return NULL; |
| + } |
| - if (entry_count <= 0) { |
| - Log::PrintErr( |
| - "Manifest file specified is invalid or contained no entries\n"); |
| + int64_t entries = ParseEntryPointsManifestLines(file, NULL); |
|
Florian Schneider
2016/04/19 22:05:23
intptr_t
|
| fclose(file); |
| - return NULL; |
| - } |
| - rewind(file); |
| + if (entries <= 0) { |
| + Log::PrintErr( |
| + "Manifest file `%s` specified is invalid or contained no entries\n", |
| + path); |
| + return NULL; |
| + } |
| + |
| + entry_count += entries; |
| + } |
| // Allocate enough storage for the entries in the file plus a termination |
| // sentinel and parse it again to populate the allocation |
| @@ -813,10 +819,16 @@ static Dart_QualifiedFunctionName* ParseEntryPointsManifestFile( |
| reinterpret_cast<Dart_QualifiedFunctionName*>( |
| calloc(entry_count + 1, sizeof(Dart_QualifiedFunctionName))); |
| - int64_t parsed_entry_count = ParseEntryPointsManifestLines(file, entries); |
| - ASSERT(parsed_entry_count == entry_count); |
| + int64_t parsed_entry_count = 0; |
|
Florian Schneider
2016/04/19 22:05:23
intptr_t
|
| + for (intptr_t i = 0; i < entry_points_files->count(); i++) { |
| + const char* path = entry_points_files->GetArgument(i); |
| + FILE* file = fopen(path, "r"); |
|
Florian Schneider
2016/04/19 22:05:23
Check return value of fopen.
|
| + parsed_entry_count += |
| + ParseEntryPointsManifestLines(file, &entries[parsed_entry_count]); |
| + fclose(file); |
| + } |
| - fclose(file); |
| + ASSERT(parsed_entry_count == entry_count); |
| // The entries allocation must be explicitly cleaned up via |
| // |CleanupEntryPointsCollection| |
| @@ -825,8 +837,7 @@ static Dart_QualifiedFunctionName* ParseEntryPointsManifestFile( |
| static Dart_QualifiedFunctionName* ParseEntryPointsManifestIfPresent() { |
| - Dart_QualifiedFunctionName* entries = |
| - ParseEntryPointsManifestFile(embedder_entry_points_manifest); |
| + Dart_QualifiedFunctionName* entries = ParseEntryPointsManifestFiles(); |
| if ((entries == NULL) && IsSnapshottingForPrecompilation()) { |
| Log::PrintErr( |
| "Could not find native embedder entry points during precompilation\n"); |
| @@ -998,6 +1009,10 @@ int main(int argc, char** argv) { |
| CommandLineOptions url_mapping_array(argc); |
| url_mapping = &url_mapping_array; |
| + // Initialize the entrypoints array. |
| + CommandLineOptions entry_points_files_array(argc); |
| + entry_points_files = &entry_points_files_array; |
| + |
| // Parse command line arguments. |
| if (ParseArguments(argc, |
| argv, |