OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 #include <stdlib.h> | 5 #include <stdlib.h> |
6 #include <string.h> | 6 #include <string.h> |
7 #include <stdio.h> | 7 #include <stdio.h> |
8 | 8 |
9 #include "include/dart_api.h" | 9 #include "include/dart_api.h" |
10 #include "include/dart_tools_api.h" | 10 #include "include/dart_tools_api.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
63 // Global flag that is used to indicate that we want to compile all the | 63 // Global flag that is used to indicate that we want to compile all the |
64 // dart functions before running main and not compile anything thereafter. | 64 // dart functions before running main and not compile anything thereafter. |
65 static bool has_gen_precompiled_snapshot = false; | 65 static bool has_gen_precompiled_snapshot = false; |
66 | 66 |
67 | 67 |
68 // Global flag that is used to indicate that we want to run from a precompiled | 68 // Global flag that is used to indicate that we want to run from a precompiled |
69 // snapshot. | 69 // snapshot. |
70 static bool has_run_precompiled_snapshot = false; | 70 static bool has_run_precompiled_snapshot = false; |
71 | 71 |
72 | 72 |
73 // Value of the --gen/run_precompiled_snapshot flag. | |
74 // (This pointer points into an argv buffer and does not need to be | |
75 // free'd.) | |
76 static const char* precompiled_snapshot_directory = NULL; | |
77 | |
78 | |
73 // Global flag that is used to indicate that we want to compile everything in | 79 // Global flag that is used to indicate that we want to compile everything in |
74 // the same way as precompilation before main, then continue running in the | 80 // the same way as precompilation before main, then continue running in the |
75 // same process. | 81 // same process. |
76 static bool has_noopt = false; | 82 static bool has_noopt = false; |
77 | 83 |
78 | 84 |
79 extern const char* kPrecompiledLibraryName; | 85 extern const char* kPrecompiledLibraryName; |
80 extern const char* kPrecompiledSymbolName; | 86 extern const char* kPrecompiledSymbolName; |
81 static const char* kPrecompiledVmIsolateName = "precompiled.vmisolate"; | 87 static const char* kPrecompiledVmIsolateName = "precompiled.vmisolate"; |
82 static const char* kPrecompiledIsolateName = "precompiled.isolate"; | 88 static const char* kPrecompiledIsolateName = "precompiled.isolate"; |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
296 return false; | 302 return false; |
297 } | 303 } |
298 has_compile_all = true; | 304 has_compile_all = true; |
299 return true; | 305 return true; |
300 } | 306 } |
301 | 307 |
302 | 308 |
303 static bool ProcessGenPrecompiledSnapshotOption( | 309 static bool ProcessGenPrecompiledSnapshotOption( |
304 const char* arg, | 310 const char* arg, |
305 CommandLineOptions* vm_options) { | 311 CommandLineOptions* vm_options) { |
306 ASSERT(arg != NULL); | |
307 if (*arg != '\0') { | |
308 return false; | |
309 } | |
310 // Ensure that we are not already running using a full snapshot. | 312 // Ensure that we are not already running using a full snapshot. |
311 if (isolate_snapshot_buffer != NULL) { | 313 if (isolate_snapshot_buffer != NULL) { |
312 Log::PrintErr("Precompiled snapshots must be generated with" | 314 Log::PrintErr("Precompiled snapshots must be generated with" |
313 " dart_no_snapshot.\n"); | 315 " dart_no_snapshot.\n"); |
314 return false; | 316 return false; |
315 } | 317 } |
318 ASSERT(arg != NULL); | |
319 precompiled_snapshot_directory = arg; | |
320 if ((precompiled_snapshot_directory[0] == '=') || | |
321 (precompiled_snapshot_directory[0] == ':')) { | |
322 precompiled_snapshot_directory = &precompiled_snapshot_directory[1]; | |
323 } | |
316 has_gen_precompiled_snapshot = true; | 324 has_gen_precompiled_snapshot = true; |
317 vm_options->AddArgument("--precompilation"); | 325 vm_options->AddArgument("--precompilation"); |
318 return true; | 326 return true; |
319 } | 327 } |
320 | 328 |
321 | 329 |
322 static bool ProcessRunPrecompiledSnapshotOption( | 330 static bool ProcessRunPrecompiledSnapshotOption( |
323 const char* arg, | 331 const char* arg, |
324 CommandLineOptions* vm_options) { | 332 CommandLineOptions* vm_options) { |
325 ASSERT(arg != NULL); | 333 ASSERT(arg != NULL); |
326 if (*arg != '\0') { | 334 precompiled_snapshot_directory = arg; |
327 return false; | 335 if ((precompiled_snapshot_directory[0] == '=') || |
336 (precompiled_snapshot_directory[0] == ':')) { | |
337 precompiled_snapshot_directory = &precompiled_snapshot_directory[1]; | |
328 } | 338 } |
329 has_run_precompiled_snapshot = true; | 339 has_run_precompiled_snapshot = true; |
330 vm_options->AddArgument("--precompilation"); | 340 vm_options->AddArgument("--precompilation"); |
331 return true; | 341 return true; |
332 } | 342 } |
333 | 343 |
334 | 344 |
335 static bool ProcessNooptOption( | 345 static bool ProcessNooptOption( |
336 const char* arg, | 346 const char* arg, |
337 CommandLineOptions* vm_options) { | 347 CommandLineOptions* vm_options) { |
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1003 | 1013 |
1004 static void ServiceStreamCancelCallback(const char* stream_id) { | 1014 static void ServiceStreamCancelCallback(const char* stream_id) { |
1005 if (strcmp(stream_id, kStdoutStreamId) == 0) { | 1015 if (strcmp(stream_id, kStdoutStreamId) == 0) { |
1006 SetCaptureStdout(false); | 1016 SetCaptureStdout(false); |
1007 } else if (strcmp(stream_id, kStderrStreamId) == 0) { | 1017 } else if (strcmp(stream_id, kStderrStreamId) == 0) { |
1008 SetCaptureStderr(false); | 1018 SetCaptureStderr(false); |
1009 } | 1019 } |
1010 } | 1020 } |
1011 | 1021 |
1012 | 1022 |
1013 static void WriteSnapshotFile(const char* filename, | 1023 static void WritePrecompiledSnapshotFile(const char* filename, |
1014 const uint8_t* buffer, | 1024 const uint8_t* buffer, |
1015 const intptr_t size) { | 1025 const intptr_t size) { |
1016 File* file = File::Open(filename, File::kWriteTruncate); | 1026 const char* qualified_filename; |
1027 if (strlen(precompiled_snapshot_directory) > 0) { | |
1028 intptr_t len = snprintf(NULL, 0, "%s/%s", | |
1029 precompiled_snapshot_directory, filename); | |
1030 char* concat = reinterpret_cast<char*>(alloca(len + 1)); | |
Florian Schneider
2015/12/17 12:53:25
I would avoid alloca - it is not standard C++, and
rmacnak
2015/12/17 19:20:51
Done.
| |
1031 snprintf(concat, len + 1, "%s/%s", | |
1032 precompiled_snapshot_directory, filename); | |
1033 qualified_filename = concat; | |
1034 } else { | |
1035 qualified_filename = filename; | |
1036 } | |
1037 | |
1038 File* file = File::Open(qualified_filename, File::kWriteTruncate); | |
1017 ASSERT(file != NULL); | 1039 ASSERT(file != NULL); |
1018 if (!file->WriteFully(buffer, size)) { | 1040 if (!file->WriteFully(buffer, size)) { |
1019 ErrorExit(kErrorExitCode, | 1041 ErrorExit(kErrorExitCode, |
1020 "Unable to open file %s for writing snapshot\n", | 1042 "Unable to open file %s for writing snapshot\n", |
1021 filename); | 1043 qualified_filename); |
1022 } | 1044 } |
1023 delete file; | 1045 delete file; |
1024 } | 1046 } |
1025 | 1047 |
1026 | 1048 |
1027 static void ReadSnapshotFile(const char* filename, | 1049 static void ReadPrecompiledSnapshotFile(const char* filename, |
1028 const uint8_t** buffer) { | 1050 const uint8_t** buffer) { |
1029 void* file = DartUtils::OpenFile(filename, false); | 1051 const char* qualified_filename; |
1052 if (strlen(precompiled_snapshot_directory) > 0) { | |
1053 intptr_t len = snprintf(NULL, 0, "%s/%s", | |
1054 precompiled_snapshot_directory, filename); | |
1055 char* concat = reinterpret_cast<char*>(alloca(len + 1)); | |
Florian Schneider
2015/12/17 12:53:25
Same here. Maybe something like this:
char* conca
rmacnak
2015/12/17 19:20:51
Done.
| |
1056 snprintf(concat, len + 1, "%s/%s", | |
1057 precompiled_snapshot_directory, filename); | |
1058 qualified_filename = concat; | |
1059 } else { | |
1060 qualified_filename = filename; | |
1061 } | |
1062 | |
1063 void* file = DartUtils::OpenFile(qualified_filename, false); | |
1030 if (file == NULL) { | 1064 if (file == NULL) { |
1031 ErrorExit(kErrorExitCode, | 1065 ErrorExit(kErrorExitCode, |
1032 "Error: Unable to open file %s for reading snapshot\n", filename); | 1066 "Error: Unable to open file %s for reading snapshot\n", |
1067 qualified_filename); | |
1033 } | 1068 } |
1034 intptr_t len = -1; | 1069 intptr_t len = -1; |
1035 DartUtils::ReadFile(buffer, &len, file); | 1070 DartUtils::ReadFile(buffer, &len, file); |
1036 if (*buffer == NULL || len == -1) { | 1071 if (*buffer == NULL || len == -1) { |
1037 ErrorExit(kErrorExitCode, | 1072 ErrorExit(kErrorExitCode, |
1038 "Error: Unable to read snapshot file %s\n", filename); | 1073 "Error: Unable to read snapshot file %s\n", qualified_filename); |
1039 } | 1074 } |
1040 DartUtils::CloseFile(file); | 1075 DartUtils::CloseFile(file); |
1041 } | 1076 } |
1042 | 1077 |
1043 | 1078 |
1044 static void* LoadLibrarySymbol(const char* libname, const char* symname) { | 1079 static void* LoadLibrarySymbol(const char* libname, const char* symname) { |
1045 void* library = Extensions::LoadExtensionLibrary(libname); | 1080 void* library = Extensions::LoadExtensionLibrary(libname); |
1046 if (library == NULL) { | 1081 if (library == NULL) { |
1047 Log::PrintErr("Error: Failed to load library '%s'\n", libname); | 1082 Log::PrintErr("Error: Failed to load library '%s'\n", libname); |
1048 Platform::Exit(kErrorExitCode); | 1083 Platform::Exit(kErrorExitCode); |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1209 intptr_t isolate_size = 0; | 1244 intptr_t isolate_size = 0; |
1210 uint8_t* instructions_buffer = NULL; | 1245 uint8_t* instructions_buffer = NULL; |
1211 intptr_t instructions_size = 0; | 1246 intptr_t instructions_size = 0; |
1212 result = Dart_CreatePrecompiledSnapshot(&vm_isolate_buffer, | 1247 result = Dart_CreatePrecompiledSnapshot(&vm_isolate_buffer, |
1213 &vm_isolate_size, | 1248 &vm_isolate_size, |
1214 &isolate_buffer, | 1249 &isolate_buffer, |
1215 &isolate_size, | 1250 &isolate_size, |
1216 &instructions_buffer, | 1251 &instructions_buffer, |
1217 &instructions_size); | 1252 &instructions_size); |
1218 CHECK_RESULT(result); | 1253 CHECK_RESULT(result); |
1219 WriteSnapshotFile(kPrecompiledVmIsolateName, | 1254 WritePrecompiledSnapshotFile(kPrecompiledVmIsolateName, |
1220 vm_isolate_buffer, | 1255 vm_isolate_buffer, |
1221 vm_isolate_size); | 1256 vm_isolate_size); |
1222 WriteSnapshotFile(kPrecompiledIsolateName, | 1257 WritePrecompiledSnapshotFile(kPrecompiledIsolateName, |
1223 isolate_buffer, | 1258 isolate_buffer, |
1224 isolate_size); | 1259 isolate_size); |
1225 WriteSnapshotFile(kPrecompiledInstructionsName, | 1260 WritePrecompiledSnapshotFile(kPrecompiledInstructionsName, |
1226 instructions_buffer, | 1261 instructions_buffer, |
1227 instructions_size); | 1262 instructions_size); |
1228 } else { | 1263 } else { |
1229 if (has_compile_all) { | 1264 if (has_compile_all) { |
1230 result = Dart_CompileAll(); | 1265 result = Dart_CompileAll(); |
1231 CHECK_RESULT(result); | 1266 CHECK_RESULT(result); |
1232 } | 1267 } |
1233 | 1268 |
1234 if (Dart_IsNull(root_lib)) { | 1269 if (Dart_IsNull(root_lib)) { |
1235 ErrorExit(kErrorExitCode, | 1270 ErrorExit(kErrorExitCode, |
1236 "Unable to find root library for '%s'\n", | 1271 "Unable to find root library for '%s'\n", |
1237 script_name); | 1272 script_name); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1347 | 1382 |
1348 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); | 1383 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); |
1349 | 1384 |
1350 // Start event handler. | 1385 // Start event handler. |
1351 EventHandler::Start(); | 1386 EventHandler::Start(); |
1352 | 1387 |
1353 const uint8_t* instructions_snapshot = NULL; | 1388 const uint8_t* instructions_snapshot = NULL; |
1354 if (has_run_precompiled_snapshot) { | 1389 if (has_run_precompiled_snapshot) { |
1355 instructions_snapshot = reinterpret_cast<const uint8_t*>( | 1390 instructions_snapshot = reinterpret_cast<const uint8_t*>( |
1356 LoadLibrarySymbol(kPrecompiledLibraryName, kPrecompiledSymbolName)); | 1391 LoadLibrarySymbol(kPrecompiledLibraryName, kPrecompiledSymbolName)); |
1357 ReadSnapshotFile(kPrecompiledVmIsolateName, &vm_isolate_snapshot_buffer); | 1392 ReadPrecompiledSnapshotFile(kPrecompiledVmIsolateName, |
1358 ReadSnapshotFile(kPrecompiledIsolateName, &isolate_snapshot_buffer); | 1393 &vm_isolate_snapshot_buffer); |
1394 ReadPrecompiledSnapshotFile(kPrecompiledIsolateName, | |
1395 &isolate_snapshot_buffer); | |
1359 } | 1396 } |
1360 | 1397 |
1361 // Initialize the Dart VM. | 1398 // Initialize the Dart VM. |
1362 char* error = Dart_Initialize( | 1399 char* error = Dart_Initialize( |
1363 vm_isolate_snapshot_buffer, instructions_snapshot, | 1400 vm_isolate_snapshot_buffer, instructions_snapshot, |
1364 CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate, | 1401 CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate, |
1365 DartUtils::OpenFile, | 1402 DartUtils::OpenFile, |
1366 DartUtils::ReadFile, | 1403 DartUtils::ReadFile, |
1367 DartUtils::WriteFile, | 1404 DartUtils::WriteFile, |
1368 DartUtils::CloseFile, | 1405 DartUtils::CloseFile, |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1419 Platform::Exit(Process::GlobalExitCode()); | 1456 Platform::Exit(Process::GlobalExitCode()); |
1420 } | 1457 } |
1421 | 1458 |
1422 } // namespace bin | 1459 } // namespace bin |
1423 } // namespace dart | 1460 } // namespace dart |
1424 | 1461 |
1425 int main(int argc, char** argv) { | 1462 int main(int argc, char** argv) { |
1426 dart::bin::main(argc, argv); | 1463 dart::bin::main(argc, argv); |
1427 UNREACHABLE(); | 1464 UNREACHABLE(); |
1428 } | 1465 } |
OLD | NEW |