| 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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 // dart functions and not run anything. | 90 // dart functions and not run anything. |
| 91 static bool compile_all = false; | 91 static bool compile_all = false; |
| 92 static bool parse_all = false; | 92 static bool parse_all = false; |
| 93 | 93 |
| 94 | 94 |
| 95 // Global flag that is used to indicate that we want to use blobs/mmap instead | 95 // Global flag that is used to indicate that we want to use blobs/mmap instead |
| 96 // of assembly/shared libraries for precompilation. | 96 // of assembly/shared libraries for precompilation. |
| 97 static bool use_blobs = false; | 97 static bool use_blobs = false; |
| 98 | 98 |
| 99 | 99 |
| 100 // Global flag that is used to indicate that we want to compile everything in | |
| 101 // the same way as precompilation before main, then continue running in the | |
| 102 // same process. | |
| 103 // Always set this with dart_noopt. | |
| 104 #if defined(DART_PRECOMPILER) && !defined(DART_NO_SNAPSHOT) | |
| 105 static const bool is_noopt = true; | |
| 106 #else | |
| 107 static const bool is_noopt = false; | |
| 108 #endif | |
| 109 | |
| 110 | |
| 111 extern const char* kPrecompiledVMIsolateSymbolName; | 100 extern const char* kPrecompiledVMIsolateSymbolName; |
| 112 extern const char* kPrecompiledIsolateSymbolName; | 101 extern const char* kPrecompiledIsolateSymbolName; |
| 113 extern const char* kPrecompiledInstructionsSymbolName; | 102 extern const char* kPrecompiledInstructionsSymbolName; |
| 114 extern const char* kPrecompiledDataSymbolName; | 103 extern const char* kPrecompiledDataSymbolName; |
| 115 | 104 |
| 116 | 105 |
| 117 // Global flag that is used to indicate that we want to trace resolution of | 106 // Global flag that is used to indicate that we want to trace resolution of |
| 118 // URIs and the loading of libraries, parts and scripts. | 107 // URIs and the loading of libraries, parts and scripts. |
| 119 static bool trace_loading = false; | 108 static bool trace_loading = false; |
| 120 | 109 |
| (...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 if ((commandline_package_root != NULL) && | 712 if ((commandline_package_root != NULL) && |
| 724 (strlen(commandline_package_root) == 0)) { | 713 (strlen(commandline_package_root) == 0)) { |
| 725 Log::PrintErr("Empty package root specified.\n"); | 714 Log::PrintErr("Empty package root specified.\n"); |
| 726 return -1; | 715 return -1; |
| 727 } | 716 } |
| 728 if ((commandline_packages_file != NULL) && | 717 if ((commandline_packages_file != NULL) && |
| 729 (strlen(commandline_packages_file) == 0)) { | 718 (strlen(commandline_packages_file) == 0)) { |
| 730 Log::PrintErr("Empty package file name specified.\n"); | 719 Log::PrintErr("Empty package file name specified.\n"); |
| 731 return -1; | 720 return -1; |
| 732 } | 721 } |
| 733 if (is_noopt && gen_snapshot_kind != kNone) { | |
| 734 Log::PrintErr("Generating a snapshot with dart_noopt is invalid.\n"); | |
| 735 return -1; | |
| 736 } | |
| 737 if ((gen_snapshot_kind != kNone) && (snapshot_filename == NULL)) { | 722 if ((gen_snapshot_kind != kNone) && (snapshot_filename == NULL)) { |
| 738 Log::PrintErr("Generating a snapshot requires a filename (--snapshot).\n"); | 723 Log::PrintErr("Generating a snapshot requires a filename (--snapshot).\n"); |
| 739 return -1; | 724 return -1; |
| 740 } | 725 } |
| 741 if ((gen_snapshot_kind != kNone) && run_app_snapshot) { | 726 if ((gen_snapshot_kind != kNone) && run_app_snapshot) { |
| 742 Log::PrintErr( | 727 Log::PrintErr( |
| 743 "Specifying an option to generate a snapshot and" | 728 "Specifying an option to generate a snapshot and" |
| 744 " run using a snapshot is invalid.\n"); | 729 " run using a snapshot is invalid.\n"); |
| 745 return -1; | 730 return -1; |
| 746 } | 731 } |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 823 | 808 |
| 824 // Returns true on success, false on failure. | 809 // Returns true on success, false on failure. |
| 825 static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri, | 810 static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri, |
| 826 const char* main, | 811 const char* main, |
| 827 const char* package_root, | 812 const char* package_root, |
| 828 const char* packages_config, | 813 const char* packages_config, |
| 829 Dart_IsolateFlags* flags, | 814 Dart_IsolateFlags* flags, |
| 830 char** error, | 815 char** error, |
| 831 int* exit_code) { | 816 int* exit_code) { |
| 832 ASSERT(script_uri != NULL); | 817 ASSERT(script_uri != NULL); |
| 833 | |
| 834 const bool needs_load_port = true; | |
| 835 #if defined(PRODUCT) | |
| 836 const bool run_service_isolate = needs_load_port; | |
| 837 #else | |
| 838 // Always create the service isolate in DEBUG and RELEASE modes for profiling, | |
| 839 // even if we don't need it for loading. | |
| 840 const bool run_service_isolate = true; | |
| 841 #endif // PRODUCT | |
| 842 if (!run_service_isolate && | |
| 843 (strcmp(script_uri, DART_VM_SERVICE_ISOLATE_NAME) == 0)) { | |
| 844 return NULL; | |
| 845 } | |
| 846 if (strcmp(script_uri, DART_KERNEL_ISOLATE_NAME) == 0) { | 818 if (strcmp(script_uri, DART_KERNEL_ISOLATE_NAME) == 0) { |
| 847 if (!use_dart_frontend) { | 819 if (!use_dart_frontend) { |
| 848 *error = strdup("Kernel isolate not supported."); | 820 *error = strdup("Kernel isolate not supported."); |
| 849 return NULL; | 821 return NULL; |
| 850 } else { | 822 } else { |
| 851 if (packages_config == NULL) { | 823 if (packages_config == NULL) { |
| 852 packages_config = commandline_packages_file; | 824 packages_config = commandline_packages_file; |
| 853 } | 825 } |
| 854 } | 826 } |
| 855 } | 827 } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 Dart_ExitIsolate(); | 890 Dart_ExitIsolate(); |
| 919 return isolate; | 891 return isolate; |
| 920 } | 892 } |
| 921 | 893 |
| 922 // Prepare builtin and other core libraries for use to resolve URIs. | 894 // Prepare builtin and other core libraries for use to resolve URIs. |
| 923 // Set up various closures, e.g: printing, timers etc. | 895 // Set up various closures, e.g: printing, timers etc. |
| 924 // Set up 'package root' for URI resolution. | 896 // Set up 'package root' for URI resolution. |
| 925 result = DartUtils::PrepareForScriptLoading(false, trace_loading); | 897 result = DartUtils::PrepareForScriptLoading(false, trace_loading); |
| 926 CHECK_RESULT(result); | 898 CHECK_RESULT(result); |
| 927 | 899 |
| 928 if (needs_load_port) { | 900 // Set up the load port provided by the service isolate so that we can |
| 929 // Set up the load port provided by the service isolate so that we can | 901 // load scripts. |
| 930 // load scripts. | 902 result = DartUtils::SetupServiceLoadPort(); |
| 931 result = DartUtils::SetupServiceLoadPort(); | 903 CHECK_RESULT(result); |
| 932 CHECK_RESULT(result); | |
| 933 } | |
| 934 | 904 |
| 935 if (Dart_IsKernelIsolate(isolate)) { | 905 if (Dart_IsKernelIsolate(isolate)) { |
| 936 script_uri = frontend_filename; | 906 script_uri = frontend_filename; |
| 937 } | 907 } |
| 938 | 908 |
| 939 // Setup package root if specified. | 909 // Setup package root if specified. |
| 940 result = DartUtils::SetupPackageRoot(package_root, packages_config); | 910 result = DartUtils::SetupPackageRoot(package_root, packages_config); |
| 941 CHECK_RESULT(result); | 911 CHECK_RESULT(result); |
| 942 | 912 |
| 943 result = Dart_SetEnvironmentCallback(EnvironmentCallback); | 913 result = Dart_SetEnvironmentCallback(EnvironmentCallback); |
| (...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1652 GenerateScriptSnapshot(); | 1622 GenerateScriptSnapshot(); |
| 1653 } else { | 1623 } else { |
| 1654 // Lookup the library of the root script. | 1624 // Lookup the library of the root script. |
| 1655 Dart_Handle root_lib = Dart_RootLibrary(); | 1625 Dart_Handle root_lib = Dart_RootLibrary(); |
| 1656 // Import the root library into the builtin library so that we can easily | 1626 // Import the root library into the builtin library so that we can easily |
| 1657 // lookup the main entry point exported from the root library. | 1627 // lookup the main entry point exported from the root library. |
| 1658 IsolateData* isolate_data = | 1628 IsolateData* isolate_data = |
| 1659 reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate)); | 1629 reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate)); |
| 1660 result = Dart_LibraryImportLibrary(isolate_data->builtin_lib(), root_lib, | 1630 result = Dart_LibraryImportLibrary(isolate_data->builtin_lib(), root_lib, |
| 1661 Dart_Null()); | 1631 Dart_Null()); |
| 1662 if (is_noopt || (gen_snapshot_kind == kAppAOT) || | 1632 if ((gen_snapshot_kind == kAppAOT) || (gen_snapshot_kind == kAppJIT)) { |
| 1663 (gen_snapshot_kind == kAppJIT)) { | |
| 1664 // Load the embedder's portion of the VM service's Dart code so it will | 1633 // Load the embedder's portion of the VM service's Dart code so it will |
| 1665 // be included in the app snapshot. | 1634 // be included in the app snapshot. |
| 1666 if (!VmService::LoadForGenPrecompiled()) { | 1635 if (!VmService::LoadForGenPrecompiled()) { |
| 1667 Log::PrintErr("VM service loading failed: %s\n", | 1636 Log::PrintErr("VM service loading failed: %s\n", |
| 1668 VmService::GetErrorMessage()); | 1637 VmService::GetErrorMessage()); |
| 1669 exit(kErrorExitCode); | 1638 exit(kErrorExitCode); |
| 1670 } | 1639 } |
| 1671 } | 1640 } |
| 1672 | 1641 |
| 1673 if (compile_all) { | 1642 if (compile_all) { |
| 1674 result = Dart_CompileAll(); | 1643 result = Dart_CompileAll(); |
| 1675 CHECK_RESULT(result); | 1644 CHECK_RESULT(result); |
| 1676 } | 1645 } |
| 1677 | 1646 |
| 1678 if (parse_all) { | 1647 if (parse_all) { |
| 1679 result = Dart_ParseAll(); | 1648 result = Dart_ParseAll(); |
| 1680 CHECK_RESULT(result); | 1649 CHECK_RESULT(result); |
| 1681 Dart_ExitScope(); | 1650 Dart_ExitScope(); |
| 1682 // Shutdown the isolate. | 1651 // Shutdown the isolate. |
| 1683 Dart_ShutdownIsolate(); | 1652 Dart_ShutdownIsolate(); |
| 1684 return false; | 1653 return false; |
| 1685 } | 1654 } |
| 1686 | 1655 |
| 1687 if (is_noopt || (gen_snapshot_kind == kAppAOT)) { | 1656 if (gen_snapshot_kind == kAppAOT) { |
| 1688 Dart_QualifiedFunctionName standalone_entry_points[] = { | 1657 Dart_QualifiedFunctionName standalone_entry_points[] = { |
| 1689 {"dart:_builtin", "::", "_getMainClosure"}, | 1658 {"dart:_builtin", "::", "_getMainClosure"}, |
| 1690 {"dart:_builtin", "::", "_getPrintClosure"}, | 1659 {"dart:_builtin", "::", "_getPrintClosure"}, |
| 1691 {"dart:_builtin", "::", "_getUriBaseClosure"}, | 1660 {"dart:_builtin", "::", "_getUriBaseClosure"}, |
| 1692 {"dart:_builtin", "::", "_resolveInWorkingDirectory"}, | 1661 {"dart:_builtin", "::", "_resolveInWorkingDirectory"}, |
| 1693 {"dart:_builtin", "::", "_setWorkingDirectory"}, | 1662 {"dart:_builtin", "::", "_setWorkingDirectory"}, |
| 1694 {"dart:_builtin", "::", "_setPackageRoot"}, | 1663 {"dart:_builtin", "::", "_setPackageRoot"}, |
| 1695 {"dart:_builtin", "::", "_setPackagesMap"}, | 1664 {"dart:_builtin", "::", "_setPackagesMap"}, |
| 1696 {"dart:_builtin", "::", "_libraryFilePath"}, | 1665 {"dart:_builtin", "::", "_libraryFilePath"}, |
| 1697 {"dart:io", "::", "_makeUint8ListView"}, | 1666 {"dart:io", "::", "_makeUint8ListView"}, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1730 ErrorExit(kErrorExitCode, "Failed to read JIT feedback.\n"); | 1699 ErrorExit(kErrorExitCode, "Failed to read JIT feedback.\n"); |
| 1731 } | 1700 } |
| 1732 feedback_length = file->Length(); | 1701 feedback_length = file->Length(); |
| 1733 feedback_buffer = reinterpret_cast<uint8_t*>(malloc(feedback_length)); | 1702 feedback_buffer = reinterpret_cast<uint8_t*>(malloc(feedback_length)); |
| 1734 if (!file->ReadFully(feedback_buffer, feedback_length)) { | 1703 if (!file->ReadFully(feedback_buffer, feedback_length)) { |
| 1735 ErrorExit(kErrorExitCode, "Failed to read JIT feedback.\n"); | 1704 ErrorExit(kErrorExitCode, "Failed to read JIT feedback.\n"); |
| 1736 } | 1705 } |
| 1737 file->Release(); | 1706 file->Release(); |
| 1738 } | 1707 } |
| 1739 | 1708 |
| 1740 const bool reset_fields = gen_snapshot_kind == kAppAOT; | 1709 result = Dart_Precompile(standalone_entry_points, feedback_buffer, |
| 1741 result = Dart_Precompile(standalone_entry_points, reset_fields, | 1710 feedback_length); |
| 1742 feedback_buffer, feedback_length); | |
| 1743 if (feedback_buffer != NULL) { | 1711 if (feedback_buffer != NULL) { |
| 1744 free(feedback_buffer); | 1712 free(feedback_buffer); |
| 1745 } | 1713 } |
| 1746 CHECK_RESULT(result); | 1714 CHECK_RESULT(result); |
| 1747 } | 1715 } |
| 1748 | 1716 |
| 1749 if (gen_snapshot_kind == kAppAOT) { | 1717 if (gen_snapshot_kind == kAppAOT) { |
| 1750 GeneratePrecompiledSnapshot(); | 1718 GeneratePrecompiledSnapshot(); |
| 1751 } else { | 1719 } else { |
| 1752 if (Dart_IsNull(root_lib)) { | 1720 if (Dart_IsNull(root_lib)) { |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1960 vm_options.AddArgument("--load_deferred_eagerly"); | 1928 vm_options.AddArgument("--load_deferred_eagerly"); |
| 1961 } | 1929 } |
| 1962 #endif | 1930 #endif |
| 1963 | 1931 |
| 1964 if (gen_snapshot_kind == kAppJIT) { | 1932 if (gen_snapshot_kind == kAppJIT) { |
| 1965 vm_options.AddArgument("--fields_may_be_reset"); | 1933 vm_options.AddArgument("--fields_may_be_reset"); |
| 1966 #if !defined(PRODUCT) | 1934 #if !defined(PRODUCT) |
| 1967 vm_options.AddArgument("--collect_code=false"); | 1935 vm_options.AddArgument("--collect_code=false"); |
| 1968 #endif | 1936 #endif |
| 1969 } | 1937 } |
| 1970 if ((gen_snapshot_kind == kAppAOT) || is_noopt) { | 1938 if (gen_snapshot_kind == kAppAOT) { |
| 1971 vm_options.AddArgument("--precompilation"); | 1939 vm_options.AddArgument("--precompilation"); |
| 1972 } | 1940 } |
| 1973 #if defined(DART_PRECOMPILED_RUNTIME) | 1941 #if defined(DART_PRECOMPILED_RUNTIME) |
| 1974 vm_options.AddArgument("--precompilation"); | 1942 vm_options.AddArgument("--precompilation"); |
| 1975 #endif | 1943 #endif |
| 1976 if (gen_snapshot_kind == kAppJIT) { | 1944 if (gen_snapshot_kind == kAppJIT) { |
| 1977 Process::SetExitHook(SnapshotOnExitHook); | 1945 Process::SetExitHook(SnapshotOnExitHook); |
| 1978 } | 1946 } |
| 1979 | 1947 |
| 1980 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); | 1948 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2048 Platform::Exit(Process::GlobalExitCode()); | 2016 Platform::Exit(Process::GlobalExitCode()); |
| 2049 } | 2017 } |
| 2050 | 2018 |
| 2051 } // namespace bin | 2019 } // namespace bin |
| 2052 } // namespace dart | 2020 } // namespace dart |
| 2053 | 2021 |
| 2054 int main(int argc, char** argv) { | 2022 int main(int argc, char** argv) { |
| 2055 dart::bin::main(argc, argv); | 2023 dart::bin::main(argc, argv); |
| 2056 UNREACHABLE(); | 2024 UNREACHABLE(); |
| 2057 } | 2025 } |
| OLD | NEW |