| Index: runtime/bin/gen_snapshot.cc
|
| diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
|
| index 258b9a72850901574b3a6519cbec3c488849dc25..8dd0515fb7d275c5418613eef199c3acd9f92485 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;
|
| @@ -114,6 +117,9 @@ static bool ProcessEmbedderEntryPointsManifestOption(const char* option) {
|
|
|
| static bool ProcessPackageRootOption(const char* option) {
|
| const char* name = ProcessOption(option, "--package_root=");
|
| + if (name == NULL) {
|
| + name = ProcessOption(option, "--package-root=");
|
| + }
|
| if (name != NULL) {
|
| package_root = name;
|
| return true;
|
| @@ -181,14 +187,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 +207,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 +787,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;
|
|
|
| - 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);
|
| 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 +822,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;
|
| + for (intptr_t i = 0; i < entry_points_files->count(); i++) {
|
| + const char* path = entry_points_files->GetArgument(i);
|
| + FILE* file = fopen(path, "r");
|
| + 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 +840,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 +1012,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,
|
|
|