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 * 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, |
| 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. |
| 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 |