Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(389)

Side by Side Diff: runtime/bin/main.cc

Issue 2651633002: VM: [Kernel] Fix bootstraping when Kernel isolate is used. (Closed)
Patch Set: Landing issue Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/bin/loader.cc ('k') | runtime/include/dart_api.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181; 118 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181;
119 // VM Service options. 119 // VM Service options.
120 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP; 120 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP;
121 // The 0 port is a magic value which results in the first available port 121 // The 0 port is a magic value which results in the first available port
122 // being allocated. 122 // being allocated.
123 static int vm_service_server_port = -1; 123 static int vm_service_server_port = -1;
124 // True when we are running in development mode and cross origin security 124 // True when we are running in development mode and cross origin security
125 // checks are disabled. 125 // checks are disabled.
126 static bool vm_service_dev_mode = false; 126 static bool vm_service_dev_mode = false;
127 127
128 // Exit code indicating an internal Dart Frontend error.
129 static const int kDartFrontendErrorExitCode = 252;
128 // Exit code indicating an API error. 130 // Exit code indicating an API error.
129 static const int kApiErrorExitCode = 253; 131 static const int kApiErrorExitCode = 253;
130 // Exit code indicating a compilation error. 132 // Exit code indicating a compilation error.
131 static const int kCompilationErrorExitCode = 254; 133 static const int kCompilationErrorExitCode = 254;
132 // Exit code indicating an unhandled error that is not a compilation error. 134 // Exit code indicating an unhandled error that is not a compilation error.
133 static const int kErrorExitCode = 255; 135 static const int kErrorExitCode = 255;
134 // Exit code indicating a vm restart request. Never returned to the user. 136 // Exit code indicating a vm restart request. Never returned to the user.
135 static const int kRestartRequestExitCode = 1000; 137 static const int kRestartRequestExitCode = 1000;
136 138
137 static void ErrorExit(int exit_code, const char* format, ...) { 139 static void ErrorExit(int exit_code, const char* format, ...) {
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
802 } \ 804 } \
803 Dart_ExitScope(); \ 805 Dart_ExitScope(); \
804 Dart_ShutdownIsolate(); \ 806 Dart_ShutdownIsolate(); \
805 return NULL; \ 807 return NULL; \
806 } 808 }
807 809
808 810
809 static void SnapshotOnExitHook(int64_t exit_code); 811 static void SnapshotOnExitHook(int64_t exit_code);
810 812
811 813
812 // Returns true on success, false on failure. 814 // Returns newly created Isolate on success, NULL on failure.
813 static Dart_Isolate CreateIsolateAndSetupHelper(bool is_main_isolate, 815 static Dart_Isolate CreateIsolateAndSetupHelper(bool is_main_isolate,
814 const char* script_uri, 816 const char* script_uri,
815 const char* main, 817 const char* main,
816 const char* package_root, 818 const char* package_root,
817 const char* packages_config, 819 const char* packages_config,
818 Dart_IsolateFlags* flags, 820 Dart_IsolateFlags* flags,
819 char** error, 821 char** error,
820 int* exit_code) { 822 int* exit_code) {
821 ASSERT(script_uri != NULL); 823 ASSERT(script_uri != NULL);
822 if (strcmp(script_uri, DART_KERNEL_ISOLATE_NAME) == 0) { 824 const bool is_service_isolate =
825 strcmp(script_uri, DART_VM_SERVICE_ISOLATE_NAME) == 0;
826 const bool is_kernel_isolate =
827 strcmp(script_uri, DART_KERNEL_ISOLATE_NAME) == 0;
828 if (is_kernel_isolate) {
823 if (!use_dart_frontend) { 829 if (!use_dart_frontend) {
824 *error = strdup("Kernel isolate not supported."); 830 *error = strdup("Kernel isolate not supported.");
825 return NULL; 831 return NULL;
826 } else { 832 } else {
827 if (packages_config == NULL) { 833 if (packages_config == NULL) {
828 packages_config = commandline_packages_file; 834 packages_config = commandline_packages_file;
829 } 835 }
830 } 836 }
831 } 837 }
832 838
(...skipping 12 matching lines...) Expand all
845 core_isolate_snapshot_instructions; 851 core_isolate_snapshot_instructions;
846 if ((app_isolate_snapshot_data != NULL) && 852 if ((app_isolate_snapshot_data != NULL) &&
847 (is_main_isolate || ((app_script_uri != NULL) && 853 (is_main_isolate || ((app_script_uri != NULL) &&
848 (strcmp(script_uri, app_script_uri) == 0)))) { 854 (strcmp(script_uri, app_script_uri) == 0)))) {
849 isolate_run_app_snapshot = true; 855 isolate_run_app_snapshot = true;
850 isolate_snapshot_data = app_isolate_snapshot_data; 856 isolate_snapshot_data = app_isolate_snapshot_data;
851 isolate_snapshot_instructions = app_isolate_snapshot_instructions; 857 isolate_snapshot_instructions = app_isolate_snapshot_instructions;
852 } 858 }
853 #endif 859 #endif
854 860
861 const uint8_t* kernel_file = NULL;
862 intptr_t kernel_length = -1;
863 bool is_kernel = false;
864
865 if (use_dart_frontend && !is_kernel_isolate && !is_service_isolate) {
866 Dart_KernelCompilationResult result = Dart_CompileToKernel(script_uri);
867 *error = result.error; // Copy error message (if any).
868 switch (result.status) {
869 case Dart_KernelCompilationStatus_Ok:
870 is_kernel = true;
871 kernel_file = result.kernel;
872 kernel_length = result.kernel_size;
873 break;
874 case Dart_KernelCompilationStatus_Error:
875 *exit_code = kCompilationErrorExitCode;
876 return NULL;
877 case Dart_KernelCompilationStatus_Crash:
878 *exit_code = kDartFrontendErrorExitCode;
879 return NULL;
880 case Dart_KernelCompilationStatus_Unknown:
881 *exit_code = kErrorExitCode;
882 return NULL;
883 }
884 }
885
855 // If the script is a Kernel binary, then we will try to bootstrap from the 886 // If the script is a Kernel binary, then we will try to bootstrap from the
856 // script. 887 // script.
857 const uint8_t* kernel_file = NULL; 888 if (!is_kernel && !isolate_run_app_snapshot) {
858 intptr_t kernel_length = -1; 889 is_kernel = TryReadKernel(script_uri, &kernel_file, &kernel_length);
859 const bool is_kernel = 890 }
860 !isolate_run_app_snapshot &&
861 TryReadKernel(script_uri, &kernel_file, &kernel_length);
862 891
863 void* kernel_program = NULL; 892 void* kernel_program = NULL;
864 if (is_kernel) { 893 if (is_kernel) {
865 kernel_program = Dart_ReadKernelBinary(kernel_file, kernel_length); 894 kernel_program = Dart_ReadKernelBinary(kernel_file, kernel_length);
866 free(const_cast<uint8_t*>(kernel_file)); 895 free(const_cast<uint8_t*>(kernel_file));
867 } 896 }
868 897
869 IsolateData* isolate_data = 898 IsolateData* isolate_data =
870 new IsolateData(script_uri, package_root, packages_config); 899 new IsolateData(script_uri, package_root, packages_config);
871 Dart_Isolate isolate = 900 Dart_Isolate isolate =
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
933 script_uri = frontend_filename; 962 script_uri = frontend_filename;
934 } 963 }
935 964
936 // Setup package root if specified. 965 // Setup package root if specified.
937 result = DartUtils::SetupPackageRoot(package_root, packages_config); 966 result = DartUtils::SetupPackageRoot(package_root, packages_config);
938 CHECK_RESULT(result); 967 CHECK_RESULT(result);
939 968
940 result = Dart_SetEnvironmentCallback(EnvironmentCallback); 969 result = Dart_SetEnvironmentCallback(EnvironmentCallback);
941 CHECK_RESULT(result); 970 CHECK_RESULT(result);
942 971
943 if (!Dart_IsKernelIsolate(isolate) && use_dart_frontend) {
944 // This must be the main script to be loaded. Wait for Kernel isolate
945 // to finish initialization.
946 Dart_Port port = Dart_ServiceWaitForKernelPort();
947 if (port == ILLEGAL_PORT) {
948 *error = strdup("Error while initializing Kernel isolate");
949 return NULL;
950 }
951 }
952
953 if (isolate_run_app_snapshot) { 972 if (isolate_run_app_snapshot) {
954 result = DartUtils::SetupIOLibrary(script_uri); 973 result = DartUtils::SetupIOLibrary(script_uri);
955 CHECK_RESULT(result); 974 CHECK_RESULT(result);
956 Loader::InitForSnapshot(script_uri); 975 Loader::InitForSnapshot(script_uri);
957 #if !defined(DART_PRECOMPILED_RUNTIME) 976 #if !defined(DART_PRECOMPILED_RUNTIME)
958 if (is_main_isolate) { 977 if (is_main_isolate) {
959 // Find the canonical uri of the app snapshot. We'll use this to decide if 978 // Find the canonical uri of the app snapshot. We'll use this to decide if
960 // other isolates should use the app snapshot or the core snapshot. 979 // other isolates should use the app snapshot or the core snapshot.
961 const char* resolved_script_uri = NULL; 980 const char* resolved_script_uri = NULL;
962 result = Dart_StringToCString( 981 result = Dart_StringToCString(
963 DartUtils::ResolveScript(Dart_NewStringFromCString(script_uri)), 982 DartUtils::ResolveScript(Dart_NewStringFromCString(script_uri)),
964 &resolved_script_uri); 983 &resolved_script_uri);
965 CHECK_RESULT(result); 984 CHECK_RESULT(result);
966 ASSERT(app_script_uri == NULL); 985 ASSERT(app_script_uri == NULL);
967 app_script_uri = strdup(resolved_script_uri); 986 app_script_uri = strdup(resolved_script_uri);
968 } 987 }
969 #endif // !defined(DART_PRECOMPILED_RUNTIME) 988 #endif // !defined(DART_PRECOMPILED_RUNTIME)
970 } else { 989 } else {
971 // Load the specified application script into the newly created isolate. 990 // Load the specified application script into the newly created isolate.
972 Dart_Handle uri = 991 Dart_Handle uri =
973 DartUtils::ResolveScript(Dart_NewStringFromCString(script_uri)); 992 DartUtils::ResolveScript(Dart_NewStringFromCString(script_uri));
974 CHECK_RESULT(uri); 993 CHECK_RESULT(uri);
975 if (!is_kernel) { 994 if (!is_kernel) {
976 result = Loader::LibraryTagHandler(Dart_kScriptTag, Dart_Null(), uri); 995 result = Loader::LibraryTagHandler(Dart_kScriptTag, Dart_Null(), uri);
977 CHECK_RESULT(result); 996 CHECK_RESULT(result);
997 } else {
998 // Various core-library parts will send requests to the Loader to resolve
999 // relative URIs and perform other related tasks. We need Loader to be
1000 // initialized for this to work because loading from Kernel binary
1001 // bypasses normal source code loading paths that initialize it.
1002 Loader::InitForSnapshot(script_uri);
978 } 1003 }
979 1004
980 Dart_TimelineEvent("LoadScript", Dart_TimelineGetMicros(), 1005 Dart_TimelineEvent("LoadScript", Dart_TimelineGetMicros(),
981 Dart_GetMainPortId(), Dart_Timeline_Event_Async_End, 0, 1006 Dart_GetMainPortId(), Dart_Timeline_Event_Async_End, 0,
982 NULL, NULL); 1007 NULL, NULL);
983 1008
984 result = DartUtils::SetupIOLibrary(script_uri); 1009 result = DartUtils::SetupIOLibrary(script_uri);
985 CHECK_RESULT(result); 1010 CHECK_RESULT(result);
986 } 1011 }
987 1012
(...skipping 1074 matching lines...) Expand 10 before | Expand all | Expand 10 after
2062 Platform::Exit(Process::GlobalExitCode()); 2087 Platform::Exit(Process::GlobalExitCode());
2063 } 2088 }
2064 2089
2065 } // namespace bin 2090 } // namespace bin
2066 } // namespace dart 2091 } // namespace dart
2067 2092
2068 int main(int argc, char** argv) { 2093 int main(int argc, char** argv) {
2069 dart::bin::main(argc, argv); 2094 dart::bin::main(argc, argv);
2070 UNREACHABLE(); 2095 UNREACHABLE();
2071 } 2096 }
OLDNEW
« no previous file with comments | « runtime/bin/loader.cc ('k') | runtime/include/dart_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698