OLD | NEW |
---|---|
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 // Generate a snapshot file after loading all the scripts specified on the | 5 // Generate a snapshot file after loading all the scripts specified on the |
6 // command line. | 6 // command line. |
7 | 7 |
8 #include <stdio.h> | 8 #include <stdio.h> |
9 #include <stdlib.h> | 9 #include <stdlib.h> |
10 #include <string.h> | 10 #include <string.h> |
(...skipping 23 matching lines...) Expand all Loading... | |
34 Dart_ShutdownIsolate(); \ | 34 Dart_ShutdownIsolate(); \ |
35 exit(255); \ | 35 exit(255); \ |
36 } \ | 36 } \ |
37 | 37 |
38 | 38 |
39 // Global state that indicates whether a snapshot is to be created and | 39 // Global state that indicates whether a snapshot is to be created and |
40 // if so which file to write the snapshot into. | 40 // if so which file to write the snapshot into. |
41 static const char* vm_isolate_snapshot_filename = NULL; | 41 static const char* vm_isolate_snapshot_filename = NULL; |
42 static const char* isolate_snapshot_filename = NULL; | 42 static const char* isolate_snapshot_filename = NULL; |
43 static const char* instructions_snapshot_filename = NULL; | 43 static const char* instructions_snapshot_filename = NULL; |
44 static const char* embedder_entry_points_manifest = NULL; | |
45 static const char* package_root = NULL; | 44 static const char* package_root = NULL; |
46 | 45 |
47 | 46 |
48 // Global state which contains a pointer to the script name for which | 47 // Global state which contains a pointer to the script name for which |
49 // a snapshot needs to be created (NULL would result in the creation | 48 // a snapshot needs to be created (NULL would result in the creation |
50 // of a generic snapshot that contains only the corelibs). | 49 // of a generic snapshot that contains only the corelibs). |
51 static char* app_script_name = NULL; | 50 static char* app_script_name = NULL; |
52 | 51 |
53 | 52 |
54 // Global state that captures the URL mappings specified on the command line. | 53 // Global state that captures the URL mappings specified on the command line. |
55 static CommandLineOptions* url_mapping = NULL; | 54 static CommandLineOptions* url_mapping = NULL; |
56 | 55 |
56 // Global state that captures the entry point manifest files specified on the | |
57 // command line. | |
58 static CommandLineOptions* entry_points_files = NULL; | |
59 | |
57 static bool IsValidFlag(const char* name, | 60 static bool IsValidFlag(const char* name, |
58 const char* prefix, | 61 const char* prefix, |
59 intptr_t prefix_length) { | 62 intptr_t prefix_length) { |
60 intptr_t name_length = strlen(name); | 63 intptr_t name_length = strlen(name); |
61 return ((name_length > prefix_length) && | 64 return ((name_length > prefix_length) && |
62 (strncmp(name, prefix, prefix_length) == 0)); | 65 (strncmp(name, prefix, prefix_length) == 0)); |
63 } | 66 } |
64 | 67 |
65 | 68 |
66 static const char* ProcessOption(const char* option, const char* name) { | 69 static const char* ProcessOption(const char* option, const char* name) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
98 instructions_snapshot_filename = name; | 101 instructions_snapshot_filename = name; |
99 return true; | 102 return true; |
100 } | 103 } |
101 return false; | 104 return false; |
102 } | 105 } |
103 | 106 |
104 | 107 |
105 static bool ProcessEmbedderEntryPointsManifestOption(const char* option) { | 108 static bool ProcessEmbedderEntryPointsManifestOption(const char* option) { |
106 const char* name = ProcessOption(option, "--embedder_entry_points_manifest="); | 109 const char* name = ProcessOption(option, "--embedder_entry_points_manifest="); |
107 if (name != NULL) { | 110 if (name != NULL) { |
108 embedder_entry_points_manifest = name; | 111 entry_points_files->AddArgument(name); |
109 return true; | 112 return true; |
110 } | 113 } |
111 return false; | 114 return false; |
112 } | 115 } |
113 | 116 |
114 | 117 |
115 static bool ProcessPackageRootOption(const char* option) { | 118 static bool ProcessPackageRootOption(const char* option) { |
116 const char* name = ProcessOption(option, "--package_root="); | 119 const char* name = ProcessOption(option, "--package_root="); |
117 if (name != NULL) { | 120 if (name != NULL) { |
118 package_root = name; | 121 package_root = name; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
174 Log::PrintErr("No vm isolate snapshot output file specified.\n\n"); | 177 Log::PrintErr("No vm isolate snapshot output file specified.\n\n"); |
175 return -1; | 178 return -1; |
176 } | 179 } |
177 | 180 |
178 if (isolate_snapshot_filename == NULL) { | 181 if (isolate_snapshot_filename == NULL) { |
179 Log::PrintErr("No isolate snapshot output file specified.\n\n"); | 182 Log::PrintErr("No isolate snapshot output file specified.\n\n"); |
180 return -1; | 183 return -1; |
181 } | 184 } |
182 | 185 |
183 if ((instructions_snapshot_filename != NULL) && | 186 if ((instructions_snapshot_filename != NULL) && |
184 (embedder_entry_points_manifest == NULL)) { | 187 (entry_points_files->count() == 0)) { |
185 Log::PrintErr( | 188 Log::PrintErr( |
186 "Specifying an instructions snapshot filename indicates precompilation" | 189 "Specifying an instructions snapshot filename indicates precompilation" |
187 ". But no embedder entry points manifest was specified.\n\n"); | 190 ". But no embedder entry points manifest was specified.\n\n"); |
188 return -1; | 191 return -1; |
189 } | 192 } |
190 | 193 |
191 if ((embedder_entry_points_manifest != NULL) && | 194 if ((entry_points_files->count() > 0) && |
192 (instructions_snapshot_filename == NULL)) { | 195 (instructions_snapshot_filename == NULL)) { |
193 Log::PrintErr( | 196 Log::PrintErr( |
194 "Specifying the embedder entry points manifest indicates " | 197 "Specifying the embedder entry points manifest indicates " |
195 "precompilation. But no instuctions snapshot was specified.\n\n"); | 198 "precompilation. But no instuctions snapshot was specified.\n\n"); |
196 return -1; | 199 return -1; |
197 } | 200 } |
198 | 201 |
199 return 0; | 202 return 0; |
200 } | 203 } |
201 | 204 |
202 | 205 |
203 static bool IsSnapshottingForPrecompilation(void) { | 206 static bool IsSnapshottingForPrecompilation(void) { |
204 return embedder_entry_points_manifest != NULL && | 207 return (entry_points_files->count() > 0) && |
205 instructions_snapshot_filename != NULL; | 208 (instructions_snapshot_filename != NULL); |
206 } | 209 } |
207 | 210 |
208 | 211 |
209 static void WriteSnapshotFile(const char* filename, | 212 static void WriteSnapshotFile(const char* filename, |
210 const uint8_t* buffer, | 213 const uint8_t* buffer, |
211 const intptr_t size) { | 214 const intptr_t size) { |
212 File* file = File::Open(filename, File::kWriteTruncate); | 215 File* file = File::Open(filename, File::kWriteTruncate); |
213 ASSERT(file != NULL); | 216 ASSERT(file != NULL); |
214 if (!file->WriteFully(buffer, size)) { | 217 if (!file->WriteFully(buffer, size)) { |
215 Log::PrintErr("Error: Failed to write snapshot file.\n\n"); | 218 Log::PrintErr("Error: Failed to write snapshot file.\n\n"); |
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
774 | 777 |
775 entries++; | 778 entries++; |
776 } | 779 } |
777 | 780 |
778 free(line); | 781 free(line); |
779 | 782 |
780 return entries; | 783 return entries; |
781 } | 784 } |
782 | 785 |
783 | 786 |
784 static Dart_QualifiedFunctionName* ParseEntryPointsManifestFile( | 787 static Dart_QualifiedFunctionName* ParseEntryPointsManifestFiles() { |
785 const char* path) { | 788 // Total number of entries across all manifest files. |
786 if (path == NULL) { | 789 int64_t entry_count = 0; |
Florian Schneider
2016/04/19 22:05:23
intptr_t
| |
787 return NULL; | 790 |
791 // Parse the files once but don't store the results. This is done to first | |
792 // determine the number of entries in the manifest | |
793 for (intptr_t i = 0; i < entry_points_files->count(); i++) { | |
794 const char* path = entry_points_files->GetArgument(i); | |
795 | |
796 FILE* file = fopen(path, "r"); | |
797 | |
798 if (file == NULL) { | |
799 Log::PrintErr("Could not open entry points manifest file `%s`\n", path); | |
800 return NULL; | |
801 } | |
802 | |
803 int64_t entries = ParseEntryPointsManifestLines(file, NULL); | |
Florian Schneider
2016/04/19 22:05:23
intptr_t
| |
804 fclose(file); | |
805 | |
806 if (entries <= 0) { | |
807 Log::PrintErr( | |
808 "Manifest file `%s` specified is invalid or contained no entries\n", | |
809 path); | |
810 return NULL; | |
811 } | |
812 | |
813 entry_count += entries; | |
788 } | 814 } |
789 | 815 |
790 FILE* file = fopen(path, "r"); | |
791 | |
792 if (file == NULL) { | |
793 Log::PrintErr("Could not open entry points manifest file\n"); | |
794 return NULL; | |
795 } | |
796 | |
797 // Parse the file once but don't store the results. This is done to first | |
798 // determine the number of entries in the manifest | |
799 int64_t entry_count = ParseEntryPointsManifestLines(file, NULL); | |
800 | |
801 if (entry_count <= 0) { | |
802 Log::PrintErr( | |
803 "Manifest file specified is invalid or contained no entries\n"); | |
804 fclose(file); | |
805 return NULL; | |
806 } | |
807 | |
808 rewind(file); | |
809 | |
810 // Allocate enough storage for the entries in the file plus a termination | 816 // Allocate enough storage for the entries in the file plus a termination |
811 // sentinel and parse it again to populate the allocation | 817 // sentinel and parse it again to populate the allocation |
812 Dart_QualifiedFunctionName* entries = | 818 Dart_QualifiedFunctionName* entries = |
813 reinterpret_cast<Dart_QualifiedFunctionName*>( | 819 reinterpret_cast<Dart_QualifiedFunctionName*>( |
814 calloc(entry_count + 1, sizeof(Dart_QualifiedFunctionName))); | 820 calloc(entry_count + 1, sizeof(Dart_QualifiedFunctionName))); |
815 | 821 |
816 int64_t parsed_entry_count = ParseEntryPointsManifestLines(file, entries); | 822 int64_t parsed_entry_count = 0; |
Florian Schneider
2016/04/19 22:05:23
intptr_t
| |
823 for (intptr_t i = 0; i < entry_points_files->count(); i++) { | |
824 const char* path = entry_points_files->GetArgument(i); | |
825 FILE* file = fopen(path, "r"); | |
Florian Schneider
2016/04/19 22:05:23
Check return value of fopen.
| |
826 parsed_entry_count += | |
827 ParseEntryPointsManifestLines(file, &entries[parsed_entry_count]); | |
828 fclose(file); | |
829 } | |
830 | |
817 ASSERT(parsed_entry_count == entry_count); | 831 ASSERT(parsed_entry_count == entry_count); |
818 | 832 |
819 fclose(file); | |
820 | |
821 // The entries allocation must be explicitly cleaned up via | 833 // The entries allocation must be explicitly cleaned up via |
822 // |CleanupEntryPointsCollection| | 834 // |CleanupEntryPointsCollection| |
823 return entries; | 835 return entries; |
824 } | 836 } |
825 | 837 |
826 | 838 |
827 static Dart_QualifiedFunctionName* ParseEntryPointsManifestIfPresent() { | 839 static Dart_QualifiedFunctionName* ParseEntryPointsManifestIfPresent() { |
828 Dart_QualifiedFunctionName* entries = | 840 Dart_QualifiedFunctionName* entries = ParseEntryPointsManifestFiles(); |
829 ParseEntryPointsManifestFile(embedder_entry_points_manifest); | |
830 if ((entries == NULL) && IsSnapshottingForPrecompilation()) { | 841 if ((entries == NULL) && IsSnapshottingForPrecompilation()) { |
831 Log::PrintErr( | 842 Log::PrintErr( |
832 "Could not find native embedder entry points during precompilation\n"); | 843 "Could not find native embedder entry points during precompilation\n"); |
833 exit(255); | 844 exit(255); |
834 } | 845 } |
835 return entries; | 846 return entries; |
836 } | 847 } |
837 | 848 |
838 | 849 |
839 static void CreateAndWriteSnapshot() { | 850 static void CreateAndWriteSnapshot() { |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
991 | 1002 |
992 | 1003 |
993 int main(int argc, char** argv) { | 1004 int main(int argc, char** argv) { |
994 const int EXTRA_VM_ARGUMENTS = 2; | 1005 const int EXTRA_VM_ARGUMENTS = 2; |
995 CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS); | 1006 CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS); |
996 | 1007 |
997 // Initialize the URL mapping array. | 1008 // Initialize the URL mapping array. |
998 CommandLineOptions url_mapping_array(argc); | 1009 CommandLineOptions url_mapping_array(argc); |
999 url_mapping = &url_mapping_array; | 1010 url_mapping = &url_mapping_array; |
1000 | 1011 |
1012 // Initialize the entrypoints array. | |
1013 CommandLineOptions entry_points_files_array(argc); | |
1014 entry_points_files = &entry_points_files_array; | |
1015 | |
1001 // Parse command line arguments. | 1016 // Parse command line arguments. |
1002 if (ParseArguments(argc, | 1017 if (ParseArguments(argc, |
1003 argv, | 1018 argv, |
1004 &vm_options, | 1019 &vm_options, |
1005 &app_script_name) < 0) { | 1020 &app_script_name) < 0) { |
1006 PrintUsage(); | 1021 PrintUsage(); |
1007 return 255; | 1022 return 255; |
1008 } | 1023 } |
1009 | 1024 |
1010 Thread::InitOnce(); | 1025 Thread::InitOnce(); |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1152 EventHandler::Stop(); | 1167 EventHandler::Stop(); |
1153 return 0; | 1168 return 0; |
1154 } | 1169 } |
1155 | 1170 |
1156 } // namespace bin | 1171 } // namespace bin |
1157 } // namespace dart | 1172 } // namespace dart |
1158 | 1173 |
1159 int main(int argc, char** argv) { | 1174 int main(int argc, char** argv) { |
1160 return dart::bin::main(argc, argv); | 1175 return dart::bin::main(argc, argv); |
1161 } | 1176 } |
OLD | NEW |