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 791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
802 } \ | 802 } \ |
803 Dart_ExitScope(); \ | 803 Dart_ExitScope(); \ |
804 Dart_ShutdownIsolate(); \ | 804 Dart_ShutdownIsolate(); \ |
805 return NULL; \ | 805 return NULL; \ |
806 } | 806 } |
807 | 807 |
808 | 808 |
809 static void SnapshotOnExitHook(int64_t exit_code); | 809 static void SnapshotOnExitHook(int64_t exit_code); |
810 | 810 |
811 | 811 |
812 static const int64_t kAppSnapshotHeaderSize = 5 * sizeof(int64_t); // NOLINT | |
zra
2017/01/26 20:55:00
is sizeof(int64_t) not already a constant in platf
rmacnak
2017/01/26 23:48:45
Didn't know about these. Added and used kInt64Size
| |
813 static const int64_t kAppSnapshotMagicNumber = 0xf6f6dcdc; | |
814 static const int64_t kAppSnapshotPageSize = 4 * KB; | |
815 | |
816 | |
817 static bool ReadAppSnapshotBlobs(const char* script_name, | |
zra
2017/01/26 20:55:00
Should these snapshot reading functions be pulled
rmacnak
2017/01/26 23:48:45
Good point, I'll factor this out in a future CL.
| |
818 const uint8_t** vm_data_buffer, | |
819 const uint8_t** vm_instructions_buffer, | |
820 const uint8_t** isolate_data_buffer, | |
821 const uint8_t** isolate_instructions_buffer) { | |
822 File* file = File::Open(script_name, File::kRead); | |
823 if (file == NULL) { | |
824 return false; | |
825 } | |
826 if (file->Length() < kAppSnapshotHeaderSize) { | |
827 file->Release(); | |
828 return false; | |
829 } | |
830 int64_t header[5]; | |
831 ASSERT(sizeof(header) == kAppSnapshotHeaderSize); | |
832 if (!file->ReadFully(&header, kAppSnapshotHeaderSize)) { | |
833 file->Release(); | |
834 return false; | |
835 } | |
836 if (header[0] != kAppSnapshotMagicNumber) { | |
837 file->Release(); | |
838 return false; | |
839 } | |
840 | |
841 int64_t vm_data_size = header[1]; | |
842 int64_t vm_data_position = | |
843 Utils::RoundUp(file->Position(), kAppSnapshotPageSize); | |
844 int64_t vm_instructions_size = header[2]; | |
845 int64_t vm_instructions_position = vm_data_position + vm_data_size; | |
846 if (vm_instructions_size != 0) { | |
847 vm_instructions_position = | |
848 Utils::RoundUp(vm_instructions_position, kAppSnapshotPageSize); | |
849 } | |
850 int64_t isolate_data_size = header[3]; | |
851 int64_t isolate_data_position = Utils::RoundUp( | |
852 vm_instructions_position + vm_instructions_size, kAppSnapshotPageSize); | |
853 int64_t isolate_instructions_size = header[4]; | |
854 int64_t isolate_instructions_position = | |
855 isolate_data_position + isolate_data_size; | |
856 if (isolate_instructions_size != 0) { | |
857 isolate_instructions_position = | |
858 Utils::RoundUp(isolate_instructions_position, kAppSnapshotPageSize); | |
859 } | |
860 | |
861 if (vm_data_size != 0) { | |
862 *vm_data_buffer = reinterpret_cast<const uint8_t*>( | |
863 file->Map(File::kReadOnly, vm_data_position, vm_data_size)); | |
864 if (vm_data_buffer == NULL) { | |
865 Log::PrintErr("Failed to memory map snapshot\n"); | |
866 Platform::Exit(kErrorExitCode); | |
867 } | |
868 } | |
869 | |
870 if (vm_instructions_size != 0) { | |
871 *vm_instructions_buffer = reinterpret_cast<const uint8_t*>(file->Map( | |
872 File::kReadExecute, vm_instructions_position, vm_instructions_size)); | |
873 if (*vm_instructions_buffer == NULL) { | |
874 Log::PrintErr("Failed to memory map snapshot\n"); | |
875 Platform::Exit(kErrorExitCode); | |
876 } | |
877 } | |
878 | |
879 *isolate_data_buffer = reinterpret_cast<const uint8_t*>( | |
880 file->Map(File::kReadOnly, isolate_data_position, isolate_data_size)); | |
881 if (isolate_data_buffer == NULL) { | |
882 Log::PrintErr("Failed to memory map snapshot\n"); | |
883 Platform::Exit(kErrorExitCode); | |
884 } | |
885 | |
886 if (isolate_instructions_size == 0) { | |
887 *isolate_instructions_buffer = NULL; | |
888 } else { | |
889 *isolate_instructions_buffer = reinterpret_cast<const uint8_t*>( | |
890 file->Map(File::kReadExecute, isolate_instructions_position, | |
891 isolate_instructions_size)); | |
892 if (*isolate_instructions_buffer == NULL) { | |
893 Log::PrintErr("Failed to memory map snapshot\n"); | |
894 Platform::Exit(kErrorExitCode); | |
895 } | |
896 } | |
897 | |
898 file->Release(); | |
899 return true; | |
900 } | |
901 | |
902 | |
903 #if defined(DART_PRECOMPILED_RUNTIME) | |
904 static bool ReadAppSnapshotDynamicLibrary( | |
905 const char* script_name, | |
906 const uint8_t** vm_data_buffer, | |
907 const uint8_t** vm_instructions_buffer, | |
908 const uint8_t** isolate_data_buffer, | |
909 const uint8_t** isolate_instructions_buffer) { | |
910 void* library = Extensions::LoadExtensionLibrary(script_name); | |
911 if (library == NULL) { | |
912 return false; | |
913 } | |
914 | |
915 *vm_data_buffer = reinterpret_cast<const uint8_t*>( | |
916 Extensions::ResolveSymbol(library, kVmSnapshotDataSymbolName)); | |
917 if (*vm_data_buffer == NULL) { | |
918 Log::PrintErr("Failed to resolve symbol '%s'\n", kVmSnapshotDataSymbolName); | |
919 Platform::Exit(kErrorExitCode); | |
920 } | |
921 | |
922 *vm_instructions_buffer = reinterpret_cast<const uint8_t*>( | |
923 Extensions::ResolveSymbol(library, kVmSnapshotInstructionsSymbolName)); | |
924 if (*vm_instructions_buffer == NULL) { | |
925 Log::PrintErr("Failed to resolve symbol '%s'\n", | |
926 kVmSnapshotInstructionsSymbolName); | |
927 Platform::Exit(kErrorExitCode); | |
928 } | |
929 | |
930 *isolate_data_buffer = reinterpret_cast<const uint8_t*>( | |
931 Extensions::ResolveSymbol(library, kIsolateSnapshotDataSymbolName)); | |
932 if (*isolate_data_buffer == NULL) { | |
933 Log::PrintErr("Failed to resolve symbol '%s'\n", | |
934 kIsolateSnapshotDataSymbolName); | |
935 Platform::Exit(kErrorExitCode); | |
936 } | |
937 | |
938 *isolate_instructions_buffer = | |
939 reinterpret_cast<const uint8_t*>(Extensions::ResolveSymbol( | |
940 library, kIsolateSnapshotInstructionsSymbolName)); | |
941 if (*isolate_instructions_buffer == NULL) { | |
942 Log::PrintErr("Failed to resolve symbol '%s'\n", | |
943 kIsolateSnapshotInstructionsSymbolName); | |
944 Platform::Exit(kErrorExitCode); | |
945 } | |
946 | |
947 return true; | |
948 } | |
949 #endif // defined(DART_PRECOMPILED_RUNTIME) | |
950 | |
951 | |
952 static bool ReadAppSnapshot(const char* script_name, | |
953 const uint8_t** vm_data_buffer, | |
954 const uint8_t** vm_instructions_buffer, | |
955 const uint8_t** isolate_data_buffer, | |
956 const uint8_t** isolate_instructions_buffer) { | |
957 if (File::GetType(script_name, true) != File::kIsFile) { | |
958 // If 'script_name' refers to a pipe, don't read to check for an app | |
959 // snapshot since we cannot rewind if it isn't (and couldn't mmap it in | |
960 // anyway if it was). | |
961 return false; | |
962 } | |
963 if (ReadAppSnapshotBlobs(script_name, vm_data_buffer, vm_instructions_buffer, | |
964 isolate_data_buffer, isolate_instructions_buffer)) { | |
965 return true; | |
966 } | |
967 #if defined(DART_PRECOMPILED_RUNTIME) | |
968 // For testing AOT with the standalone embedder, we also support loading | |
969 // from a dynamic library to simulate what happens on iOS. | |
970 return ReadAppSnapshotDynamicLibrary( | |
971 script_name, vm_data_buffer, vm_instructions_buffer, isolate_data_buffer, | |
972 isolate_instructions_buffer); | |
973 #else | |
974 return false; | |
975 #endif // defined(DART_PRECOMPILED_RUNTIME) | |
976 } | |
977 | |
978 | |
812 // Returns true on success, false on failure. | 979 // Returns true on success, false on failure. |
813 static Dart_Isolate CreateIsolateAndSetupHelper(bool is_main_isolate, | 980 static Dart_Isolate CreateIsolateAndSetupHelper(bool is_main_isolate, |
814 const char* script_uri, | 981 const char* script_uri, |
815 const char* main, | 982 const char* main, |
816 const char* package_root, | 983 const char* package_root, |
817 const char* packages_config, | 984 const char* packages_config, |
818 Dart_IsolateFlags* flags, | 985 Dart_IsolateFlags* flags, |
819 char** error, | 986 char** error, |
820 int* exit_code) { | 987 int* exit_code) { |
821 ASSERT(script_uri != NULL); | 988 ASSERT(script_uri != NULL); |
822 if (strcmp(script_uri, DART_KERNEL_ISOLATE_NAME) == 0) { | 989 if (strcmp(script_uri, DART_KERNEL_ISOLATE_NAME) == 0) { |
823 if (!use_dart_frontend) { | 990 if (!use_dart_frontend) { |
824 *error = strdup("Kernel isolate not supported."); | 991 *error = strdup("Kernel isolate not supported."); |
825 return NULL; | 992 return NULL; |
826 } else { | 993 } |
827 if (packages_config == NULL) { | 994 script_uri = frontend_filename; |
828 packages_config = commandline_packages_file; | 995 if (packages_config == NULL) { |
829 } | 996 packages_config = commandline_packages_file; |
830 } | 997 } |
831 } | 998 } |
832 | 999 |
833 #if defined(DART_PRECOMPILED_RUNTIME) | 1000 #if defined(DART_PRECOMPILED_RUNTIME) |
834 // AOT: All isolates start from the app snapshot. | 1001 // AOT: All isolates start from the app snapshot. |
835 bool isolate_run_app_snapshot = true; | 1002 bool isolate_run_app_snapshot = true; |
836 const uint8_t* isolate_snapshot_data = app_isolate_snapshot_data; | 1003 const uint8_t* isolate_snapshot_data = app_isolate_snapshot_data; |
837 const uint8_t* isolate_snapshot_instructions = | 1004 const uint8_t* isolate_snapshot_instructions = |
838 app_isolate_snapshot_instructions; | 1005 app_isolate_snapshot_instructions; |
839 #else | 1006 #else |
840 // JIT: Main isolate starts from the app snapshot, if any. Other isolates | 1007 // JIT: Main isolate starts from the app snapshot, if any. Other isolates |
841 // use the core libraries snapshot. | 1008 // use the core libraries snapshot. |
842 bool isolate_run_app_snapshot = false; | 1009 bool isolate_run_app_snapshot = false; |
843 const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data; | 1010 const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data; |
844 const uint8_t* isolate_snapshot_instructions = | 1011 const uint8_t* isolate_snapshot_instructions = |
845 core_isolate_snapshot_instructions; | 1012 core_isolate_snapshot_instructions; |
846 if ((app_isolate_snapshot_data != NULL) && | 1013 if ((app_isolate_snapshot_data != NULL) && |
847 (is_main_isolate || ((app_script_uri != NULL) && | 1014 (is_main_isolate || ((app_script_uri != NULL) && |
848 (strcmp(script_uri, app_script_uri) == 0)))) { | 1015 (strcmp(script_uri, app_script_uri) == 0)))) { |
849 isolate_run_app_snapshot = true; | 1016 isolate_run_app_snapshot = true; |
850 isolate_snapshot_data = app_isolate_snapshot_data; | 1017 isolate_snapshot_data = app_isolate_snapshot_data; |
851 isolate_snapshot_instructions = app_isolate_snapshot_instructions; | 1018 isolate_snapshot_instructions = app_isolate_snapshot_instructions; |
1019 } else if (!is_main_isolate) { | |
1020 const uint8_t* file_vm_snapshot_data = NULL; | |
1021 const uint8_t* file_vm_snapshot_instructions = NULL; | |
1022 const uint8_t* file_isolate_snapshot_data = NULL; | |
1023 const uint8_t* file_isolate_snapshot_instructions = NULL; | |
1024 if (ReadAppSnapshot( | |
1025 script_uri, &file_vm_snapshot_data, &file_vm_snapshot_instructions, | |
1026 &file_isolate_snapshot_data, &file_isolate_snapshot_instructions)) { | |
1027 // TODO(rmacnak): We are leaking the snapshot when the isolate shuts down. | |
siva
2017/01/26 17:07:08
When you say leaked do you mean it is not unmapped
rmacnak
2017/01/26 18:07:13
Right, it is not unmapped. If a second spawnURI is
| |
1028 isolate_run_app_snapshot = true; | |
1029 isolate_snapshot_data = file_isolate_snapshot_data; | |
1030 isolate_snapshot_instructions = file_isolate_snapshot_instructions; | |
1031 } | |
852 } | 1032 } |
853 #endif | 1033 #endif |
854 | 1034 |
855 // If the script is a Kernel binary, then we will try to bootstrap from the | 1035 // If the script is a Kernel binary, then we will try to bootstrap from the |
856 // script. | 1036 // script. |
857 const uint8_t* kernel_file = NULL; | 1037 const uint8_t* kernel_file = NULL; |
858 intptr_t kernel_length = -1; | 1038 intptr_t kernel_length = -1; |
859 const bool is_kernel = | 1039 const bool is_kernel = |
860 !isolate_run_app_snapshot && | 1040 !isolate_run_app_snapshot && |
861 TryReadKernel(script_uri, &kernel_file, &kernel_length); | 1041 TryReadKernel(script_uri, &kernel_file, &kernel_length); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
922 // Set up various closures, e.g: printing, timers etc. | 1102 // Set up various closures, e.g: printing, timers etc. |
923 // Set up 'package root' for URI resolution. | 1103 // Set up 'package root' for URI resolution. |
924 result = DartUtils::PrepareForScriptLoading(false, trace_loading); | 1104 result = DartUtils::PrepareForScriptLoading(false, trace_loading); |
925 CHECK_RESULT(result); | 1105 CHECK_RESULT(result); |
926 | 1106 |
927 // Set up the load port provided by the service isolate so that we can | 1107 // Set up the load port provided by the service isolate so that we can |
928 // load scripts. | 1108 // load scripts. |
929 result = DartUtils::SetupServiceLoadPort(); | 1109 result = DartUtils::SetupServiceLoadPort(); |
930 CHECK_RESULT(result); | 1110 CHECK_RESULT(result); |
931 | 1111 |
932 if (Dart_IsKernelIsolate(isolate)) { | |
933 script_uri = frontend_filename; | |
934 } | |
935 | |
936 // Setup package root if specified. | 1112 // Setup package root if specified. |
937 result = DartUtils::SetupPackageRoot(package_root, packages_config); | 1113 result = DartUtils::SetupPackageRoot(package_root, packages_config); |
938 CHECK_RESULT(result); | 1114 CHECK_RESULT(result); |
939 | 1115 |
940 result = Dart_SetEnvironmentCallback(EnvironmentCallback); | 1116 result = Dart_SetEnvironmentCallback(EnvironmentCallback); |
941 CHECK_RESULT(result); | 1117 CHECK_RESULT(result); |
942 | 1118 |
943 if (!Dart_IsKernelIsolate(isolate) && use_dart_frontend) { | 1119 if (!Dart_IsKernelIsolate(isolate) && use_dart_frontend) { |
944 // This must be the main script to be loaded. Wait for Kernel isolate | 1120 // This must be the main script to be loaded. Wait for Kernel isolate |
945 // to finish initialization. | 1121 // to finish initialization. |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1281 ErrorExit(kErrorExitCode, "Unable to write file %s for writing snapshot\n", | 1457 ErrorExit(kErrorExitCode, "Unable to write file %s for writing snapshot\n", |
1282 filename); | 1458 filename); |
1283 } | 1459 } |
1284 file->Release(); | 1460 file->Release(); |
1285 if (concat != NULL) { | 1461 if (concat != NULL) { |
1286 delete concat; | 1462 delete concat; |
1287 } | 1463 } |
1288 } | 1464 } |
1289 | 1465 |
1290 | 1466 |
1291 static const int64_t kAppSnapshotHeaderSize = 5 * sizeof(int64_t); // NOLINT | |
1292 static const int64_t kAppSnapshotMagicNumber = 0xf6f6dcdc; | |
1293 static const int64_t kAppSnapshotPageSize = 4 * KB; | |
1294 | |
1295 | |
1296 static bool ReadAppSnapshotBlobs(const char* script_name, | |
1297 const uint8_t** vm_data_buffer, | |
1298 const uint8_t** vm_instructions_buffer, | |
1299 const uint8_t** isolate_data_buffer, | |
1300 const uint8_t** isolate_instructions_buffer) { | |
1301 File* file = File::Open(script_name, File::kRead); | |
1302 if (file == NULL) { | |
1303 return false; | |
1304 } | |
1305 if (file->Length() < kAppSnapshotHeaderSize) { | |
1306 file->Release(); | |
1307 return false; | |
1308 } | |
1309 int64_t header[5]; | |
1310 ASSERT(sizeof(header) == kAppSnapshotHeaderSize); | |
1311 if (!file->ReadFully(&header, kAppSnapshotHeaderSize)) { | |
1312 file->Release(); | |
1313 return false; | |
1314 } | |
1315 if (header[0] != kAppSnapshotMagicNumber) { | |
1316 file->Release(); | |
1317 return false; | |
1318 } | |
1319 | |
1320 int64_t vm_data_size = header[1]; | |
1321 int64_t vm_data_position = | |
1322 Utils::RoundUp(file->Position(), kAppSnapshotPageSize); | |
1323 int64_t vm_instructions_size = header[2]; | |
1324 int64_t vm_instructions_position = vm_data_position + vm_data_size; | |
1325 if (vm_instructions_size != 0) { | |
1326 vm_instructions_position = | |
1327 Utils::RoundUp(vm_instructions_position, kAppSnapshotPageSize); | |
1328 } | |
1329 int64_t isolate_data_size = header[3]; | |
1330 int64_t isolate_data_position = Utils::RoundUp( | |
1331 vm_instructions_position + vm_instructions_size, kAppSnapshotPageSize); | |
1332 int64_t isolate_instructions_size = header[4]; | |
1333 int64_t isolate_instructions_position = | |
1334 isolate_data_position + isolate_data_size; | |
1335 if (isolate_instructions_size != 0) { | |
1336 isolate_instructions_position = | |
1337 Utils::RoundUp(isolate_instructions_position, kAppSnapshotPageSize); | |
1338 } | |
1339 | |
1340 if (vm_data_size != 0) { | |
1341 *vm_data_buffer = reinterpret_cast<const uint8_t*>( | |
1342 file->Map(File::kReadOnly, vm_data_position, vm_data_size)); | |
1343 if (vm_data_buffer == NULL) { | |
1344 Log::PrintErr("Failed to memory map snapshot\n"); | |
1345 Platform::Exit(kErrorExitCode); | |
1346 } | |
1347 } | |
1348 | |
1349 if (vm_instructions_size != 0) { | |
1350 *vm_instructions_buffer = reinterpret_cast<const uint8_t*>(file->Map( | |
1351 File::kReadExecute, vm_instructions_position, vm_instructions_size)); | |
1352 if (*vm_instructions_buffer == NULL) { | |
1353 Log::PrintErr("Failed to memory map snapshot\n"); | |
1354 Platform::Exit(kErrorExitCode); | |
1355 } | |
1356 } | |
1357 | |
1358 *isolate_data_buffer = reinterpret_cast<const uint8_t*>( | |
1359 file->Map(File::kReadOnly, isolate_data_position, isolate_data_size)); | |
1360 if (isolate_data_buffer == NULL) { | |
1361 Log::PrintErr("Failed to memory map snapshot\n"); | |
1362 Platform::Exit(kErrorExitCode); | |
1363 } | |
1364 | |
1365 if (isolate_instructions_size == 0) { | |
1366 *isolate_instructions_buffer = NULL; | |
1367 } else { | |
1368 *isolate_instructions_buffer = reinterpret_cast<const uint8_t*>( | |
1369 file->Map(File::kReadExecute, isolate_instructions_position, | |
1370 isolate_instructions_size)); | |
1371 if (*isolate_instructions_buffer == NULL) { | |
1372 Log::PrintErr("Failed to memory map snapshot\n"); | |
1373 Platform::Exit(kErrorExitCode); | |
1374 } | |
1375 } | |
1376 | |
1377 file->Release(); | |
1378 return true; | |
1379 } | |
1380 | |
1381 | |
1382 #if defined(DART_PRECOMPILED_RUNTIME) | |
1383 static bool ReadAppSnapshotDynamicLibrary( | |
1384 const char* script_name, | |
1385 const uint8_t** vm_data_buffer, | |
1386 const uint8_t** vm_instructions_buffer, | |
1387 const uint8_t** isolate_data_buffer, | |
1388 const uint8_t** isolate_instructions_buffer) { | |
1389 void* library = Extensions::LoadExtensionLibrary(script_name); | |
1390 if (library == NULL) { | |
1391 return false; | |
1392 } | |
1393 | |
1394 *vm_data_buffer = reinterpret_cast<const uint8_t*>( | |
1395 Extensions::ResolveSymbol(library, kVmSnapshotDataSymbolName)); | |
1396 if (*vm_data_buffer == NULL) { | |
1397 Log::PrintErr("Failed to resolve symbol '%s'\n", kVmSnapshotDataSymbolName); | |
1398 Platform::Exit(kErrorExitCode); | |
1399 } | |
1400 | |
1401 *vm_instructions_buffer = reinterpret_cast<const uint8_t*>( | |
1402 Extensions::ResolveSymbol(library, kVmSnapshotInstructionsSymbolName)); | |
1403 if (*vm_instructions_buffer == NULL) { | |
1404 Log::PrintErr("Failed to resolve symbol '%s'\n", | |
1405 kVmSnapshotInstructionsSymbolName); | |
1406 Platform::Exit(kErrorExitCode); | |
1407 } | |
1408 | |
1409 *isolate_data_buffer = reinterpret_cast<const uint8_t*>( | |
1410 Extensions::ResolveSymbol(library, kIsolateSnapshotDataSymbolName)); | |
1411 if (*isolate_data_buffer == NULL) { | |
1412 Log::PrintErr("Failed to resolve symbol '%s'\n", | |
1413 kIsolateSnapshotDataSymbolName); | |
1414 Platform::Exit(kErrorExitCode); | |
1415 } | |
1416 | |
1417 *isolate_instructions_buffer = | |
1418 reinterpret_cast<const uint8_t*>(Extensions::ResolveSymbol( | |
1419 library, kIsolateSnapshotInstructionsSymbolName)); | |
1420 if (*isolate_instructions_buffer == NULL) { | |
1421 Log::PrintErr("Failed to resolve symbol '%s'\n", | |
1422 kIsolateSnapshotInstructionsSymbolName); | |
1423 Platform::Exit(kErrorExitCode); | |
1424 } | |
1425 | |
1426 return true; | |
1427 } | |
1428 #endif // defined(DART_PRECOMPILED_RUNTIME) | |
1429 | |
1430 | |
1431 static bool ReadAppSnapshot(const char* script_name, | |
1432 const uint8_t** vm_data_buffer, | |
1433 const uint8_t** vm_instructions_buffer, | |
1434 const uint8_t** isolate_data_buffer, | |
1435 const uint8_t** isolate_instructions_buffer) { | |
1436 if (File::GetType(script_name, true) != File::kIsFile) { | |
1437 // If 'script_name' refers to a pipe, don't read to check for an app | |
1438 // snapshot since we cannot rewind if it isn't (and couldn't mmap it in | |
1439 // anyway if it was). | |
1440 return false; | |
1441 } | |
1442 if (ReadAppSnapshotBlobs(script_name, vm_data_buffer, vm_instructions_buffer, | |
1443 isolate_data_buffer, isolate_instructions_buffer)) { | |
1444 return true; | |
1445 } | |
1446 #if defined(DART_PRECOMPILED_RUNTIME) | |
1447 // For testing AOT with the standalone embedder, we also support loading | |
1448 // from a dynamic library to simulate what happens on iOS. | |
1449 return ReadAppSnapshotDynamicLibrary( | |
1450 script_name, vm_data_buffer, vm_instructions_buffer, isolate_data_buffer, | |
1451 isolate_instructions_buffer); | |
1452 #else | |
1453 return false; | |
1454 #endif // defined(DART_PRECOMPILED_RUNTIME) | |
1455 } | |
1456 | |
1457 | |
1458 static bool WriteInt64(File* file, int64_t size) { | 1467 static bool WriteInt64(File* file, int64_t size) { |
1459 return file->WriteFully(&size, sizeof(size)); | 1468 return file->WriteFully(&size, sizeof(size)); |
1460 } | 1469 } |
1461 | 1470 |
1462 | 1471 |
1463 static void WriteAppSnapshot(const char* filename, | 1472 static void WriteAppSnapshot(const char* filename, |
1464 uint8_t* vm_data_buffer, | 1473 uint8_t* vm_data_buffer, |
1465 intptr_t vm_data_size, | 1474 intptr_t vm_data_size, |
1466 uint8_t* vm_instructions_buffer, | 1475 uint8_t* vm_instructions_buffer, |
1467 intptr_t vm_instructions_size, | 1476 intptr_t vm_instructions_size, |
(...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2062 Platform::Exit(Process::GlobalExitCode()); | 2071 Platform::Exit(Process::GlobalExitCode()); |
2063 } | 2072 } |
2064 | 2073 |
2065 } // namespace bin | 2074 } // namespace bin |
2066 } // namespace dart | 2075 } // namespace dart |
2067 | 2076 |
2068 int main(int argc, char** argv) { | 2077 int main(int argc, char** argv) { |
2069 dart::bin::main(argc, argv); | 2078 dart::bin::main(argc, argv); |
2070 UNREACHABLE(); | 2079 UNREACHABLE(); |
2071 } | 2080 } |
OLD | NEW |