| 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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 | 98 |
| 99 | 99 |
| 100 // Global flag that is used to indicate that we want to trace resolution of | 100 // Global flag that is used to indicate that we want to trace resolution of |
| 101 // URIs and the loading of libraries, parts and scripts. | 101 // URIs and the loading of libraries, parts and scripts. |
| 102 static bool trace_loading = false; | 102 static bool trace_loading = false; |
| 103 | 103 |
| 104 | 104 |
| 105 static char* app_script_uri = NULL; | 105 static char* app_script_uri = NULL; |
| 106 static const uint8_t* app_isolate_snapshot_data = NULL; | 106 static const uint8_t* app_isolate_snapshot_data = NULL; |
| 107 static const uint8_t* app_isolate_snapshot_instructions = NULL; | 107 static const uint8_t* app_isolate_snapshot_instructions = NULL; |
| 108 static AppSnapshot* app_snapshot = NULL; |
| 108 | 109 |
| 109 | 110 |
| 110 static Dart_Isolate main_isolate = NULL; | 111 static Dart_Isolate main_isolate = NULL; |
| 111 | 112 |
| 112 | 113 |
| 113 static const char* DEFAULT_VM_SERVICE_SERVER_IP = "localhost"; | 114 static const char* DEFAULT_VM_SERVICE_SERVER_IP = "localhost"; |
| 114 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181; | 115 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181; |
| 115 // VM Service options. | 116 // VM Service options. |
| 116 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP; | 117 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP; |
| 117 // The 0 port is a magic value which results in the first available port | 118 // The 0 port is a magic value which results in the first available port |
| (...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 packages_config = commandline_packages_file; | 810 packages_config = commandline_packages_file; |
| 810 } | 811 } |
| 811 } | 812 } |
| 812 | 813 |
| 813 #if defined(DART_PRECOMPILED_RUNTIME) | 814 #if defined(DART_PRECOMPILED_RUNTIME) |
| 814 // AOT: All isolates start from the app snapshot. | 815 // AOT: All isolates start from the app snapshot. |
| 815 bool isolate_run_app_snapshot = true; | 816 bool isolate_run_app_snapshot = true; |
| 816 const uint8_t* isolate_snapshot_data = app_isolate_snapshot_data; | 817 const uint8_t* isolate_snapshot_data = app_isolate_snapshot_data; |
| 817 const uint8_t* isolate_snapshot_instructions = | 818 const uint8_t* isolate_snapshot_instructions = |
| 818 app_isolate_snapshot_instructions; | 819 app_isolate_snapshot_instructions; |
| 820 AppSnapshot* app_snapshot = NULL; |
| 819 #else | 821 #else |
| 820 // JIT: Main isolate starts from the app snapshot, if any. Other isolates | 822 // JIT: Main isolate starts from the app snapshot, if any. Other isolates |
| 821 // use the core libraries snapshot. | 823 // use the core libraries snapshot. |
| 822 bool isolate_run_app_snapshot = false; | 824 bool isolate_run_app_snapshot = false; |
| 823 const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data; | 825 const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data; |
| 824 const uint8_t* isolate_snapshot_instructions = | 826 const uint8_t* isolate_snapshot_instructions = |
| 825 core_isolate_snapshot_instructions; | 827 core_isolate_snapshot_instructions; |
| 828 AppSnapshot* app_snapshot = NULL; |
| 826 if ((app_isolate_snapshot_data != NULL) && | 829 if ((app_isolate_snapshot_data != NULL) && |
| 827 (is_main_isolate || ((app_script_uri != NULL) && | 830 (is_main_isolate || ((app_script_uri != NULL) && |
| 828 (strcmp(script_uri, app_script_uri) == 0)))) { | 831 (strcmp(script_uri, app_script_uri) == 0)))) { |
| 829 isolate_run_app_snapshot = true; | 832 isolate_run_app_snapshot = true; |
| 830 isolate_snapshot_data = app_isolate_snapshot_data; | 833 isolate_snapshot_data = app_isolate_snapshot_data; |
| 831 isolate_snapshot_instructions = app_isolate_snapshot_instructions; | 834 isolate_snapshot_instructions = app_isolate_snapshot_instructions; |
| 832 } else if (!is_main_isolate) { | 835 } else if (!is_main_isolate) { |
| 833 const uint8_t* file_vm_snapshot_data = NULL; | 836 app_snapshot = Snapshot::TryReadAppSnapshot(script_uri); |
| 834 const uint8_t* file_vm_snapshot_instructions = NULL; | 837 if (app_snapshot != NULL) { |
| 835 const uint8_t* file_isolate_snapshot_data = NULL; | |
| 836 const uint8_t* file_isolate_snapshot_instructions = NULL; | |
| 837 if (Snapshot::ReadAppSnapshot( | |
| 838 script_uri, &file_vm_snapshot_data, &file_vm_snapshot_instructions, | |
| 839 &file_isolate_snapshot_data, &file_isolate_snapshot_instructions)) { | |
| 840 // TODO(rmacnak): We are leaking the snapshot when the isolate shuts down. | |
| 841 isolate_run_app_snapshot = true; | 838 isolate_run_app_snapshot = true; |
| 842 isolate_snapshot_data = file_isolate_snapshot_data; | 839 const uint8_t* ignore_vm_snapshot_data; |
| 843 isolate_snapshot_instructions = file_isolate_snapshot_instructions; | 840 const uint8_t* ignore_vm_snapshot_instructions; |
| 841 app_snapshot->SetBuffers( |
| 842 &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions, |
| 843 &isolate_snapshot_data, &isolate_snapshot_instructions); |
| 844 } | 844 } |
| 845 } | 845 } |
| 846 #endif | 846 #endif |
| 847 | 847 |
| 848 const uint8_t* kernel_file = NULL; | 848 const uint8_t* kernel_file = NULL; |
| 849 intptr_t kernel_length = -1; | 849 intptr_t kernel_length = -1; |
| 850 bool is_kernel = false; | 850 bool is_kernel = false; |
| 851 | 851 |
| 852 if (!is_kernel_isolate && !is_service_isolate) { | 852 if (!is_kernel_isolate && !is_service_isolate) { |
| 853 if (use_dart_frontend) { | 853 if (use_dart_frontend) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 874 } | 874 } |
| 875 } | 875 } |
| 876 | 876 |
| 877 void* kernel_program = NULL; | 877 void* kernel_program = NULL; |
| 878 if (is_kernel) { | 878 if (is_kernel) { |
| 879 kernel_program = Dart_ReadKernelBinary(kernel_file, kernel_length); | 879 kernel_program = Dart_ReadKernelBinary(kernel_file, kernel_length); |
| 880 free(const_cast<uint8_t*>(kernel_file)); | 880 free(const_cast<uint8_t*>(kernel_file)); |
| 881 } | 881 } |
| 882 | 882 |
| 883 IsolateData* isolate_data = | 883 IsolateData* isolate_data = |
| 884 new IsolateData(script_uri, package_root, packages_config); | 884 new IsolateData(script_uri, package_root, packages_config, app_snapshot); |
| 885 // If the script is a Kernel binary, then we will try to bootstrap from the | 885 // If the script is a Kernel binary, then we will try to bootstrap from the |
| 886 // script. | 886 // script. |
| 887 Dart_Isolate isolate = | 887 Dart_Isolate isolate = |
| 888 is_kernel ? Dart_CreateIsolateFromKernel(script_uri, main, kernel_program, | 888 is_kernel ? Dart_CreateIsolateFromKernel(script_uri, main, kernel_program, |
| 889 flags, isolate_data, error) | 889 flags, isolate_data, error) |
| 890 : Dart_CreateIsolate(script_uri, main, isolate_snapshot_data, | 890 : Dart_CreateIsolate(script_uri, main, isolate_snapshot_data, |
| 891 isolate_snapshot_instructions, flags, | 891 isolate_snapshot_instructions, flags, |
| 892 isolate_data, error); | 892 isolate_data, error); |
| 893 if (isolate == NULL) { | 893 if (isolate == NULL) { |
| 894 delete isolate_data; | 894 delete isolate_data; |
| (...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1632 Thread::InitOnce(); | 1632 Thread::InitOnce(); |
| 1633 | 1633 |
| 1634 Loader::InitOnce(); | 1634 Loader::InitOnce(); |
| 1635 | 1635 |
| 1636 if (!DartUtils::SetOriginalWorkingDirectory()) { | 1636 if (!DartUtils::SetOriginalWorkingDirectory()) { |
| 1637 OSError err; | 1637 OSError err; |
| 1638 Log::PrintErr("Error determining current directory: %s\n", err.message()); | 1638 Log::PrintErr("Error determining current directory: %s\n", err.message()); |
| 1639 Platform::Exit(kErrorExitCode); | 1639 Platform::Exit(kErrorExitCode); |
| 1640 } | 1640 } |
| 1641 | 1641 |
| 1642 if (Snapshot::ReadAppSnapshot( | 1642 app_snapshot = Snapshot::TryReadAppSnapshot(script_name); |
| 1643 script_name, &vm_snapshot_data, &vm_snapshot_instructions, | 1643 if (app_snapshot != NULL) { |
| 1644 &app_isolate_snapshot_data, &app_isolate_snapshot_instructions)) { | |
| 1645 vm_run_app_snapshot = true; | 1644 vm_run_app_snapshot = true; |
| 1645 app_snapshot->SetBuffers(&vm_snapshot_data, &vm_snapshot_instructions, |
| 1646 &app_isolate_snapshot_data, |
| 1647 &app_isolate_snapshot_instructions); |
| 1646 } | 1648 } |
| 1647 | 1649 |
| 1648 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME) | 1650 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME) |
| 1649 // Constant true if PRODUCT or DART_PRECOMPILED_RUNTIME. | 1651 // Constant true if PRODUCT or DART_PRECOMPILED_RUNTIME. |
| 1650 if ((gen_snapshot_kind != kNone) || vm_run_app_snapshot) { | 1652 if ((gen_snapshot_kind != kNone) || vm_run_app_snapshot) { |
| 1651 vm_options.AddArgument("--load_deferred_eagerly"); | 1653 vm_options.AddArgument("--load_deferred_eagerly"); |
| 1652 } | 1654 } |
| 1653 #endif | 1655 #endif |
| 1654 | 1656 |
| 1655 if (gen_snapshot_kind == kAppJIT) { | 1657 if (gen_snapshot_kind == kAppJIT) { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1711 // Terminate process exit-code handler. | 1713 // Terminate process exit-code handler. |
| 1712 Process::TerminateExitCodeHandler(); | 1714 Process::TerminateExitCodeHandler(); |
| 1713 | 1715 |
| 1714 error = Dart_Cleanup(); | 1716 error = Dart_Cleanup(); |
| 1715 if (error != NULL) { | 1717 if (error != NULL) { |
| 1716 Log::PrintErr("VM cleanup failed: %s\n", error); | 1718 Log::PrintErr("VM cleanup failed: %s\n", error); |
| 1717 free(error); | 1719 free(error); |
| 1718 } | 1720 } |
| 1719 EventHandler::Stop(); | 1721 EventHandler::Stop(); |
| 1720 | 1722 |
| 1723 delete app_snapshot; |
| 1721 free(app_script_uri); | 1724 free(app_script_uri); |
| 1722 | 1725 |
| 1723 // Free copied argument strings if converted. | 1726 // Free copied argument strings if converted. |
| 1724 if (argv_converted) { | 1727 if (argv_converted) { |
| 1725 for (int i = 0; i < argc; i++) { | 1728 for (int i = 0; i < argc; i++) { |
| 1726 free(argv[i]); | 1729 free(argv[i]); |
| 1727 } | 1730 } |
| 1728 } | 1731 } |
| 1729 | 1732 |
| 1730 // Free environment if any. | 1733 // Free environment if any. |
| 1731 if (environment != NULL) { | 1734 if (environment != NULL) { |
| 1732 for (HashMap::Entry* p = environment->Start(); p != NULL; | 1735 for (HashMap::Entry* p = environment->Start(); p != NULL; |
| 1733 p = environment->Next(p)) { | 1736 p = environment->Next(p)) { |
| 1734 free(p->key); | 1737 free(p->key); |
| 1735 free(p->value); | 1738 free(p->value); |
| 1736 } | 1739 } |
| 1737 delete environment; | 1740 delete environment; |
| 1738 } | 1741 } |
| 1739 | 1742 |
| 1740 Platform::Exit(Process::GlobalExitCode()); | 1743 Platform::Exit(Process::GlobalExitCode()); |
| 1741 } | 1744 } |
| 1742 | 1745 |
| 1743 } // namespace bin | 1746 } // namespace bin |
| 1744 } // namespace dart | 1747 } // namespace dart |
| 1745 | 1748 |
| 1746 int main(int argc, char** argv) { | 1749 int main(int argc, char** argv) { |
| 1747 dart::bin::main(argc, argv); | 1750 dart::bin::main(argc, argv); |
| 1748 UNREACHABLE(); | 1751 UNREACHABLE(); |
| 1749 } | 1752 } |
| OLD | NEW |