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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 // being allocated. | 107 // being allocated. |
108 static int vm_service_server_port = -1; | 108 static int vm_service_server_port = -1; |
109 | 109 |
110 | 110 |
111 // Exit code indicating an API error. | 111 // Exit code indicating an API error. |
112 static const int kApiErrorExitCode = 253; | 112 static const int kApiErrorExitCode = 253; |
113 // Exit code indicating a compilation error. | 113 // Exit code indicating a compilation error. |
114 static const int kCompilationErrorExitCode = 254; | 114 static const int kCompilationErrorExitCode = 254; |
115 // Exit code indicating an unhandled error that is not a compilation error. | 115 // Exit code indicating an unhandled error that is not a compilation error. |
116 static const int kErrorExitCode = 255; | 116 static const int kErrorExitCode = 255; |
| 117 // Exit code indicating a vm restart request. Never returned to the user. |
| 118 static const int kRestartRequestExitCode = 1000; |
117 | 119 |
118 extern bool do_vm_shutdown; // Defined in bin/process.cc | 120 extern bool do_vm_shutdown; // Defined in bin/process.cc |
119 static void ErrorExit(int exit_code, const char* format, ...) { | 121 static void ErrorExit(int exit_code, const char* format, ...) { |
120 va_list arguments; | 122 va_list arguments; |
121 va_start(arguments, format); | 123 va_start(arguments, format); |
122 Log::VPrintErr(format, arguments); | 124 Log::VPrintErr(format, arguments); |
123 va_end(arguments); | 125 va_end(arguments); |
124 fflush(stderr); | 126 fflush(stderr); |
125 | 127 |
126 Dart_ExitScope(); | 128 Dart_ExitScope(); |
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
678 } | 680 } |
679 free(name_chars); | 681 free(name_chars); |
680 } | 682 } |
681 return result; | 683 return result; |
682 } | 684 } |
683 | 685 |
684 | 686 |
685 #define CHECK_RESULT(result) \ | 687 #define CHECK_RESULT(result) \ |
686 if (Dart_IsError(result)) { \ | 688 if (Dart_IsError(result)) { \ |
687 *error = strdup(Dart_GetError(result)); \ | 689 *error = strdup(Dart_GetError(result)); \ |
688 *exit_code = Dart_IsCompilationError(result) ? kCompilationErrorExitCode : \ | 690 if (Dart_IsCompilationError(result)) { \ |
689 (Dart_IsApiError(result) ? kApiErrorExitCode : kErrorExitCode); \ | 691 *exit_code = kCompilationErrorExitCode; \ |
| 692 } else if (Dart_IsApiError(result)) { \ |
| 693 *exit_code = kApiErrorExitCode; \ |
| 694 } else if (Dart_IsVMRestartRequest(result)) { \ |
| 695 *exit_code = kRestartRequestExitCode; \ |
| 696 } else { \ |
| 697 *exit_code = kErrorExitCode; \ |
| 698 } \ |
690 Dart_ExitScope(); \ | 699 Dart_ExitScope(); \ |
691 Dart_ShutdownIsolate(); \ | 700 Dart_ShutdownIsolate(); \ |
692 return NULL; \ | 701 return NULL; \ |
693 } \ | 702 } \ |
694 | 703 |
695 | 704 |
696 // Returns true on success, false on failure. | 705 // Returns true on success, false on failure. |
697 static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri, | 706 static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri, |
698 const char* main, | 707 const char* main, |
699 const char* package_root, | 708 const char* package_root, |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
795 Dart_EnterIsolate(isolate); | 804 Dart_EnterIsolate(isolate); |
796 Dart_ShutdownIsolate(); | 805 Dart_ShutdownIsolate(); |
797 return NULL; | 806 return NULL; |
798 } | 807 } |
799 | 808 |
800 return isolate; | 809 return isolate; |
801 } | 810 } |
802 | 811 |
803 #undef CHECK_RESULT | 812 #undef CHECK_RESULT |
804 | 813 |
| 814 |
805 static Dart_Isolate CreateIsolateAndSetup(const char* script_uri, | 815 static Dart_Isolate CreateIsolateAndSetup(const char* script_uri, |
806 const char* main, | 816 const char* main, |
807 const char* package_root, | 817 const char* package_root, |
808 Dart_IsolateFlags* flags, | 818 Dart_IsolateFlags* flags, |
809 void* data, char** error) { | 819 void* data, char** error) { |
810 // The VM should never call the isolate helper with a NULL flags. | 820 // The VM should never call the isolate helper with a NULL flags. |
811 ASSERT(flags != NULL); | 821 ASSERT(flags != NULL); |
812 ASSERT(flags->version == DART_FLAGS_CURRENT_VERSION); | 822 ASSERT(flags->version == DART_FLAGS_CURRENT_VERSION); |
813 IsolateData* parent_isolate_data = reinterpret_cast<IsolateData*>(data); | 823 IsolateData* parent_isolate_data = reinterpret_cast<IsolateData*>(data); |
814 int exit_code = 0; | 824 int exit_code = 0; |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
943 } | 953 } |
944 | 954 |
945 const char* kFormat = "%s/%s"; | 955 const char* kFormat = "%s/%s"; |
946 intptr_t len = strlen(script_name) + strlen(func_name) + 2; | 956 intptr_t len = strlen(script_name) + strlen(func_name) + 2; |
947 char* buffer = new char[len]; | 957 char* buffer = new char[len]; |
948 ASSERT(buffer != NULL); | 958 ASSERT(buffer != NULL); |
949 snprintf(buffer, len, kFormat, script_name, func_name); | 959 snprintf(buffer, len, kFormat, script_name, func_name); |
950 return buffer; | 960 return buffer; |
951 } | 961 } |
952 | 962 |
953 static void DartExitOnError(Dart_Handle error) { | |
954 if (!Dart_IsError(error)) { | |
955 return; | |
956 } | |
957 const int exit_code = Dart_IsCompilationError(error) ? | |
958 kCompilationErrorExitCode : kErrorExitCode; | |
959 ErrorExit(exit_code, "%s\n", Dart_GetError(error)); | |
960 } | |
961 | |
962 | |
963 static void ShutdownIsolate(void* callback_data) { | 963 static void ShutdownIsolate(void* callback_data) { |
964 IsolateData* isolate_data = reinterpret_cast<IsolateData*>(callback_data); | 964 IsolateData* isolate_data = reinterpret_cast<IsolateData*>(callback_data); |
965 delete isolate_data; | 965 delete isolate_data; |
966 } | 966 } |
967 | 967 |
968 | 968 |
969 static const char* ServiceRequestError(Dart_Handle error) { | 969 static const char* ServiceRequestError(Dart_Handle error) { |
970 TextBuffer buffer(128); | 970 TextBuffer buffer(128); |
971 buffer.Printf("{\"type\":\"Error\",\"text\":\"Internal error %s\"}", | 971 buffer.Printf("{\"type\":\"Error\",\"text\":\"Internal error %s\"}", |
972 Dart_GetError(error)); | 972 Dart_GetError(error)); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1087 } | 1087 } |
1088 void* symbol = Extensions::ResolveSymbol(library, symname); | 1088 void* symbol = Extensions::ResolveSymbol(library, symname); |
1089 if (symbol == NULL) { | 1089 if (symbol == NULL) { |
1090 Log::PrintErr("Error: Failed to load symbol '%s'\n", symname); | 1090 Log::PrintErr("Error: Failed to load symbol '%s'\n", symname); |
1091 exit(kErrorExitCode); | 1091 exit(kErrorExitCode); |
1092 } | 1092 } |
1093 return symbol; | 1093 return symbol; |
1094 } | 1094 } |
1095 | 1095 |
1096 | 1096 |
1097 void main(int argc, char** argv) { | 1097 #define CHECK_RESULT(result) \ |
1098 char* script_name; | 1098 if (Dart_IsError(result)) { \ |
1099 const int EXTRA_VM_ARGUMENTS = 2; | 1099 if (Dart_IsVMRestartRequest(result)) { \ |
1100 CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS); | 1100 Dart_ExitScope(); \ |
1101 CommandLineOptions dart_options(argc); | 1101 Dart_ShutdownIsolate(); \ |
1102 bool print_flags_seen = false; | 1102 return true; \ |
1103 bool verbose_debug_seen = false; | 1103 } \ |
1104 | 1104 const int exit_code = Dart_IsCompilationError(result) ? \ |
1105 vm_options.AddArgument("--no_write_protect_code"); | 1105 kCompilationErrorExitCode : kErrorExitCode; \ |
1106 // Perform platform specific initialization. | 1106 ErrorExit(exit_code, "%s\n", Dart_GetError(result)); \ |
1107 if (!Platform::Initialize()) { | |
1108 Log::PrintErr("Initialization failed\n"); | |
1109 } | 1107 } |
1110 | 1108 |
1111 // On Windows, the argv strings are code page encoded and not | 1109 bool RunMainIsolate(const char* script_name, |
1112 // utf8. We need to convert them to utf8. | 1110 CommandLineOptions* dart_options) { |
1113 bool argv_converted = ShellUtils::GetUtf8Argv(argc, argv); | |
1114 | |
1115 // Parse command line arguments. | |
1116 if (ParseArguments(argc, | |
1117 argv, | |
1118 &vm_options, | |
1119 &script_name, | |
1120 &dart_options, | |
1121 &print_flags_seen, | |
1122 &verbose_debug_seen) < 0) { | |
1123 if (has_help_option) { | |
1124 PrintUsage(); | |
1125 exit(0); | |
1126 } else if (has_version_option) { | |
1127 PrintVersion(); | |
1128 exit(0); | |
1129 } else if (print_flags_seen) { | |
1130 // Will set the VM flags, print them out and then we exit as no | |
1131 // script was specified on the command line. | |
1132 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); | |
1133 exit(0); | |
1134 } else { | |
1135 PrintUsage(); | |
1136 exit(kErrorExitCode); | |
1137 } | |
1138 } | |
1139 | |
1140 Thread::InitOnce(); | |
1141 | |
1142 if (!DartUtils::SetOriginalWorkingDirectory()) { | |
1143 OSError err; | |
1144 fprintf(stderr, "Error determining current directory: %s\n", err.message()); | |
1145 fflush(stderr); | |
1146 exit(kErrorExitCode); | |
1147 } | |
1148 | |
1149 if (generate_script_snapshot) { | |
1150 vm_options.AddArgument("--load_deferred_eagerly"); | |
1151 } | |
1152 | |
1153 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); | |
1154 | |
1155 // Start event handler. | |
1156 EventHandler::Start(); | |
1157 | |
1158 // Start the debugger wire protocol handler if necessary. | |
1159 if (start_debugger) { | |
1160 ASSERT(debug_port >= 0); | |
1161 bool print_msg = verbose_debug_seen || (debug_port == 0); | |
1162 debug_port = DebuggerConnectionHandler::StartHandler(debug_ip, debug_port); | |
1163 if (print_msg) { | |
1164 Log::Print("Debugger listening on port %d\n", debug_port); | |
1165 } | |
1166 } else { | |
1167 DebuggerConnectionHandler::InitForVmService(); | |
1168 } | |
1169 | |
1170 const uint8_t* instructions_snapshot = NULL; | |
1171 if (has_run_precompiled_snapshot) { | |
1172 instructions_snapshot = reinterpret_cast<const uint8_t*>( | |
1173 LoadLibrarySymbol(kPrecompiledLibraryName, kPrecompiledSymbolName)); | |
1174 ReadSnapshotFile(kPrecompiledVmIsolateName, &vm_isolate_snapshot_buffer); | |
1175 ReadSnapshotFile(kPrecompiledIsolateName, &isolate_snapshot_buffer); | |
1176 } | |
1177 | |
1178 // Initialize the Dart VM. | |
1179 char* error = Dart_Initialize( | |
1180 vm_isolate_snapshot_buffer, instructions_snapshot, | |
1181 CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate, | |
1182 DartUtils::OpenFile, | |
1183 DartUtils::ReadFile, | |
1184 DartUtils::WriteFile, | |
1185 DartUtils::CloseFile, | |
1186 DartUtils::EntropySource); | |
1187 if (error != NULL) { | |
1188 if (do_vm_shutdown) { | |
1189 DebuggerConnectionHandler::StopHandler(); | |
1190 EventHandler::Stop(); | |
1191 } | |
1192 fprintf(stderr, "VM initialization failed: %s\n", error); | |
1193 fflush(stderr); | |
1194 free(error); | |
1195 exit(kErrorExitCode); | |
1196 } | |
1197 | |
1198 Dart_RegisterIsolateServiceRequestCallback( | |
1199 "getIO", &ServiceGetIOHandler, NULL); | |
1200 Dart_SetServiceStreamCallbacks(&ServiceStreamListenCallback, | |
1201 &ServiceStreamCancelCallback); | |
1202 | |
1203 // Call CreateIsolateAndSetup which creates an isolate and loads up | 1111 // Call CreateIsolateAndSetup which creates an isolate and loads up |
1204 // the specified application script. | 1112 // the specified application script. |
| 1113 char* error = NULL; |
1205 int exit_code = 0; | 1114 int exit_code = 0; |
1206 char* isolate_name = BuildIsolateName(script_name, "main"); | 1115 char* isolate_name = BuildIsolateName(script_name, "main"); |
1207 Dart_Isolate isolate = CreateIsolateAndSetupHelper(script_name, | 1116 Dart_Isolate isolate = CreateIsolateAndSetupHelper(script_name, |
1208 "main", | 1117 "main", |
1209 commandline_package_root, | 1118 commandline_package_root, |
1210 commandline_packages_file, | 1119 commandline_packages_file, |
1211 NULL, | 1120 NULL, |
1212 &error, | 1121 &error, |
1213 &exit_code); | 1122 &exit_code); |
1214 if (isolate == NULL) { | 1123 if (isolate == NULL) { |
| 1124 delete [] isolate_name; |
| 1125 if (exit_code == kRestartRequestExitCode) { |
| 1126 free(error); |
| 1127 return true; |
| 1128 } |
1215 Log::PrintErr("%s\n", error); | 1129 Log::PrintErr("%s\n", error); |
1216 free(error); | 1130 free(error); |
1217 error = NULL; | 1131 error = NULL; |
1218 delete [] isolate_name; | |
1219 Process::TerminateExitCodeHandler(); | 1132 Process::TerminateExitCodeHandler(); |
1220 error = Dart_Cleanup(); | 1133 error = Dart_Cleanup(); |
1221 if (error != NULL) { | 1134 if (error != NULL) { |
1222 Log::PrintErr("VM cleanup failed: %s\n", error); | 1135 Log::PrintErr("VM cleanup failed: %s\n", error); |
1223 free(error); | 1136 free(error); |
1224 } | 1137 } |
1225 if (do_vm_shutdown) { | 1138 if (do_vm_shutdown) { |
1226 DebuggerConnectionHandler::StopHandler(); | 1139 DebuggerConnectionHandler::StopHandler(); |
1227 EventHandler::Stop(); | 1140 EventHandler::Stop(); |
1228 } | 1141 } |
1229 exit((exit_code != 0) ? exit_code : kErrorExitCode); | 1142 exit((exit_code != 0) ? exit_code : kErrorExitCode); |
1230 } | 1143 } |
1231 delete [] isolate_name; | 1144 delete [] isolate_name; |
1232 | 1145 |
1233 Dart_EnterIsolate(isolate); | 1146 Dart_EnterIsolate(isolate); |
1234 ASSERT(isolate == Dart_CurrentIsolate()); | 1147 ASSERT(isolate == Dart_CurrentIsolate()); |
1235 ASSERT(isolate != NULL); | 1148 ASSERT(isolate != NULL); |
1236 Dart_Handle result; | 1149 Dart_Handle result; |
1237 | 1150 |
1238 Dart_EnterScope(); | 1151 Dart_EnterScope(); |
1239 | 1152 |
1240 if (generate_script_snapshot) { | 1153 if (generate_script_snapshot) { |
1241 // First create a snapshot. | 1154 // First create a snapshot. |
1242 Dart_Handle result; | 1155 Dart_Handle result; |
1243 uint8_t* buffer = NULL; | 1156 uint8_t* buffer = NULL; |
1244 intptr_t size = 0; | 1157 intptr_t size = 0; |
1245 result = Dart_CreateScriptSnapshot(&buffer, &size); | 1158 result = Dart_CreateScriptSnapshot(&buffer, &size); |
1246 DartExitOnError(result); | 1159 CHECK_RESULT(result); |
1247 | 1160 |
1248 // Open the snapshot file. | 1161 // Open the snapshot file. |
1249 File* snapshot_file = File::Open(snapshot_filename, File::kWriteTruncate); | 1162 File* snapshot_file = File::Open(snapshot_filename, File::kWriteTruncate); |
1250 if (snapshot_file == NULL) { | 1163 if (snapshot_file == NULL) { |
1251 ErrorExit(kErrorExitCode, | 1164 ErrorExit(kErrorExitCode, |
1252 "Unable to open file %s for writing the snapshot\n", | 1165 "Unable to open file %s for writing the snapshot\n", |
1253 snapshot_filename); | 1166 snapshot_filename); |
1254 } | 1167 } |
1255 | 1168 |
1256 // Write the magic number to indicate file is a script snapshot. | 1169 // Write the magic number to indicate file is a script snapshot. |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1292 { "dart:io", "_ProcessStartStatus", "set:_errorMessage" }, | 1205 { "dart:io", "_ProcessStartStatus", "set:_errorMessage" }, |
1293 { "dart:io", "_SecureFilterImpl", "get:ENCRYPTED_SIZE" }, | 1206 { "dart:io", "_SecureFilterImpl", "get:ENCRYPTED_SIZE" }, |
1294 { "dart:io", "_SecureFilterImpl", "get:SIZE" }, | 1207 { "dart:io", "_SecureFilterImpl", "get:SIZE" }, |
1295 { "dart:vmservice_io", "::", "_addResource" }, | 1208 { "dart:vmservice_io", "::", "_addResource" }, |
1296 { "dart:vmservice_io", "::", "main" }, | 1209 { "dart:vmservice_io", "::", "main" }, |
1297 { NULL, NULL, NULL } // Must be terminated with NULL entries. | 1210 { NULL, NULL, NULL } // Must be terminated with NULL entries. |
1298 }; | 1211 }; |
1299 | 1212 |
1300 const bool reset_fields = has_gen_precompiled_snapshot; | 1213 const bool reset_fields = has_gen_precompiled_snapshot; |
1301 result = Dart_Precompile(standalone_entry_points, reset_fields); | 1214 result = Dart_Precompile(standalone_entry_points, reset_fields); |
1302 DartExitOnError(result); | 1215 CHECK_RESULT(result); |
1303 } | 1216 } |
1304 | 1217 |
1305 if (has_gen_precompiled_snapshot) { | 1218 if (has_gen_precompiled_snapshot) { |
1306 uint8_t* vm_isolate_buffer = NULL; | 1219 uint8_t* vm_isolate_buffer = NULL; |
1307 intptr_t vm_isolate_size = 0; | 1220 intptr_t vm_isolate_size = 0; |
1308 uint8_t* isolate_buffer = NULL; | 1221 uint8_t* isolate_buffer = NULL; |
1309 intptr_t isolate_size = 0; | 1222 intptr_t isolate_size = 0; |
1310 uint8_t* instructions_buffer = NULL; | 1223 uint8_t* instructions_buffer = NULL; |
1311 intptr_t instructions_size = 0; | 1224 intptr_t instructions_size = 0; |
1312 result = Dart_CreatePrecompiledSnapshot(&vm_isolate_buffer, | 1225 result = Dart_CreatePrecompiledSnapshot(&vm_isolate_buffer, |
1313 &vm_isolate_size, | 1226 &vm_isolate_size, |
1314 &isolate_buffer, | 1227 &isolate_buffer, |
1315 &isolate_size, | 1228 &isolate_size, |
1316 &instructions_buffer, | 1229 &instructions_buffer, |
1317 &instructions_size); | 1230 &instructions_size); |
1318 DartExitOnError(result); | 1231 CHECK_RESULT(result); |
1319 WriteSnapshotFile(kPrecompiledVmIsolateName, | 1232 WriteSnapshotFile(kPrecompiledVmIsolateName, |
1320 vm_isolate_buffer, | 1233 vm_isolate_buffer, |
1321 vm_isolate_size); | 1234 vm_isolate_size); |
1322 WriteSnapshotFile(kPrecompiledIsolateName, | 1235 WriteSnapshotFile(kPrecompiledIsolateName, |
1323 isolate_buffer, | 1236 isolate_buffer, |
1324 isolate_size); | 1237 isolate_size); |
1325 WriteSnapshotFile(kPrecompiledInstructionsName, | 1238 WriteSnapshotFile(kPrecompiledInstructionsName, |
1326 instructions_buffer, | 1239 instructions_buffer, |
1327 instructions_size); | 1240 instructions_size); |
1328 } else { | 1241 } else { |
1329 if (has_compile_all) { | 1242 if (has_compile_all) { |
1330 result = Dart_CompileAll(); | 1243 result = Dart_CompileAll(); |
1331 DartExitOnError(result); | 1244 CHECK_RESULT(result); |
1332 } | 1245 } |
1333 | 1246 |
1334 if (Dart_IsNull(root_lib)) { | 1247 if (Dart_IsNull(root_lib)) { |
1335 ErrorExit(kErrorExitCode, | 1248 ErrorExit(kErrorExitCode, |
1336 "Unable to find root library for '%s'\n", | 1249 "Unable to find root library for '%s'\n", |
1337 script_name); | 1250 script_name); |
1338 } | 1251 } |
1339 | 1252 |
1340 // The helper function _getMainClosure creates a closure for the main | 1253 // The helper function _getMainClosure creates a closure for the main |
1341 // entry point which is either explicitly or implictly exported from the | 1254 // entry point which is either explicitly or implictly exported from the |
1342 // root library. | 1255 // root library. |
1343 Dart_Handle main_closure = Dart_Invoke(builtin_lib, | 1256 Dart_Handle main_closure = Dart_Invoke(builtin_lib, |
1344 Dart_NewStringFromCString("_getMainClosure"), 0, NULL); | 1257 Dart_NewStringFromCString("_getMainClosure"), 0, NULL); |
1345 DartExitOnError(main_closure); | 1258 CHECK_RESULT(main_closure); |
1346 | 1259 |
1347 // Set debug breakpoint if specified on the command line before calling | 1260 // Set debug breakpoint if specified on the command line before calling |
1348 // the main function. | 1261 // the main function. |
1349 if (breakpoint_at != NULL) { | 1262 if (breakpoint_at != NULL) { |
1350 result = SetBreakpoint(breakpoint_at, root_lib); | 1263 result = SetBreakpoint(breakpoint_at, root_lib); |
1351 if (Dart_IsError(result)) { | 1264 if (Dart_IsError(result)) { |
1352 ErrorExit(kErrorExitCode, | 1265 ErrorExit(kErrorExitCode, |
1353 "Error setting breakpoint at '%s': %s\n", | 1266 "Error setting breakpoint at '%s': %s\n", |
1354 breakpoint_at, | 1267 breakpoint_at, |
1355 Dart_GetError(result)); | 1268 Dart_GetError(result)); |
1356 } | 1269 } |
1357 } | 1270 } |
1358 | 1271 |
1359 // Call _startIsolate in the isolate library to enable dispatching the | 1272 // Call _startIsolate in the isolate library to enable dispatching the |
1360 // initial startup message. | 1273 // initial startup message. |
1361 const intptr_t kNumIsolateArgs = 2; | 1274 const intptr_t kNumIsolateArgs = 2; |
1362 Dart_Handle isolate_args[kNumIsolateArgs]; | 1275 Dart_Handle isolate_args[kNumIsolateArgs]; |
1363 isolate_args[0] = main_closure; // entryPoint | 1276 isolate_args[0] = main_closure; // entryPoint |
1364 isolate_args[1] = CreateRuntimeOptions(&dart_options); // args | 1277 isolate_args[1] = CreateRuntimeOptions(dart_options); // args |
1365 | 1278 |
1366 Dart_Handle isolate_lib = | 1279 Dart_Handle isolate_lib = |
1367 Dart_LookupLibrary(Dart_NewStringFromCString("dart:isolate")); | 1280 Dart_LookupLibrary(Dart_NewStringFromCString("dart:isolate")); |
1368 result = Dart_Invoke(isolate_lib, | 1281 result = Dart_Invoke(isolate_lib, |
1369 Dart_NewStringFromCString("_startMainIsolate"), | 1282 Dart_NewStringFromCString("_startMainIsolate"), |
1370 kNumIsolateArgs, isolate_args); | 1283 kNumIsolateArgs, isolate_args); |
1371 DartExitOnError(result); | 1284 CHECK_RESULT(result); |
1372 | 1285 |
1373 // Keep handling messages until the last active receive port is closed. | 1286 // Keep handling messages until the last active receive port is closed. |
1374 result = Dart_RunLoop(); | 1287 result = Dart_RunLoop(); |
1375 DartExitOnError(result); | 1288 CHECK_RESULT(result); |
1376 } | 1289 } |
1377 } | 1290 } |
1378 | 1291 |
1379 Dart_ExitScope(); | 1292 Dart_ExitScope(); |
1380 // Shutdown the isolate. | 1293 // Shutdown the isolate. |
1381 Dart_ShutdownIsolate(); | 1294 Dart_ShutdownIsolate(); |
| 1295 |
| 1296 // No restart. |
| 1297 return false; |
| 1298 } |
| 1299 |
| 1300 #undef CHECK_RESULT |
| 1301 |
| 1302 |
| 1303 void main(int argc, char** argv) { |
| 1304 char* script_name; |
| 1305 const int EXTRA_VM_ARGUMENTS = 2; |
| 1306 CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS); |
| 1307 CommandLineOptions dart_options(argc); |
| 1308 bool print_flags_seen = false; |
| 1309 bool verbose_debug_seen = false; |
| 1310 |
| 1311 vm_options.AddArgument("--no_write_protect_code"); |
| 1312 // Perform platform specific initialization. |
| 1313 if (!Platform::Initialize()) { |
| 1314 Log::PrintErr("Initialization failed\n"); |
| 1315 } |
| 1316 |
| 1317 // On Windows, the argv strings are code page encoded and not |
| 1318 // utf8. We need to convert them to utf8. |
| 1319 bool argv_converted = ShellUtils::GetUtf8Argv(argc, argv); |
| 1320 |
| 1321 // Parse command line arguments. |
| 1322 if (ParseArguments(argc, |
| 1323 argv, |
| 1324 &vm_options, |
| 1325 &script_name, |
| 1326 &dart_options, |
| 1327 &print_flags_seen, |
| 1328 &verbose_debug_seen) < 0) { |
| 1329 if (has_help_option) { |
| 1330 PrintUsage(); |
| 1331 exit(0); |
| 1332 } else if (has_version_option) { |
| 1333 PrintVersion(); |
| 1334 exit(0); |
| 1335 } else if (print_flags_seen) { |
| 1336 // Will set the VM flags, print them out and then we exit as no |
| 1337 // script was specified on the command line. |
| 1338 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); |
| 1339 exit(0); |
| 1340 } else { |
| 1341 PrintUsage(); |
| 1342 exit(kErrorExitCode); |
| 1343 } |
| 1344 } |
| 1345 |
| 1346 Thread::InitOnce(); |
| 1347 |
| 1348 if (!DartUtils::SetOriginalWorkingDirectory()) { |
| 1349 OSError err; |
| 1350 fprintf(stderr, "Error determining current directory: %s\n", err.message()); |
| 1351 fflush(stderr); |
| 1352 exit(kErrorExitCode); |
| 1353 } |
| 1354 |
| 1355 if (generate_script_snapshot) { |
| 1356 vm_options.AddArgument("--load_deferred_eagerly"); |
| 1357 } |
| 1358 |
| 1359 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); |
| 1360 |
| 1361 // Start event handler. |
| 1362 EventHandler::Start(); |
| 1363 |
| 1364 // Start the debugger wire protocol handler if necessary. |
| 1365 if (start_debugger) { |
| 1366 ASSERT(debug_port >= 0); |
| 1367 bool print_msg = verbose_debug_seen || (debug_port == 0); |
| 1368 debug_port = DebuggerConnectionHandler::StartHandler(debug_ip, debug_port); |
| 1369 if (print_msg) { |
| 1370 Log::Print("Debugger listening on port %d\n", debug_port); |
| 1371 } |
| 1372 } else { |
| 1373 DebuggerConnectionHandler::InitForVmService(); |
| 1374 } |
| 1375 |
| 1376 const uint8_t* instructions_snapshot = NULL; |
| 1377 if (has_run_precompiled_snapshot) { |
| 1378 instructions_snapshot = reinterpret_cast<const uint8_t*>( |
| 1379 LoadLibrarySymbol(kPrecompiledLibraryName, kPrecompiledSymbolName)); |
| 1380 ReadSnapshotFile(kPrecompiledVmIsolateName, &vm_isolate_snapshot_buffer); |
| 1381 ReadSnapshotFile(kPrecompiledIsolateName, &isolate_snapshot_buffer); |
| 1382 } |
| 1383 |
| 1384 // Initialize the Dart VM. |
| 1385 char* error = Dart_Initialize( |
| 1386 vm_isolate_snapshot_buffer, instructions_snapshot, |
| 1387 CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate, |
| 1388 DartUtils::OpenFile, |
| 1389 DartUtils::ReadFile, |
| 1390 DartUtils::WriteFile, |
| 1391 DartUtils::CloseFile, |
| 1392 DartUtils::EntropySource); |
| 1393 if (error != NULL) { |
| 1394 if (do_vm_shutdown) { |
| 1395 DebuggerConnectionHandler::StopHandler(); |
| 1396 EventHandler::Stop(); |
| 1397 } |
| 1398 fprintf(stderr, "VM initialization failed: %s\n", error); |
| 1399 fflush(stderr); |
| 1400 free(error); |
| 1401 exit(kErrorExitCode); |
| 1402 } |
| 1403 |
| 1404 Dart_RegisterIsolateServiceRequestCallback( |
| 1405 "getIO", &ServiceGetIOHandler, NULL); |
| 1406 Dart_SetServiceStreamCallbacks(&ServiceStreamListenCallback, |
| 1407 &ServiceStreamCancelCallback); |
| 1408 |
| 1409 // Run the main isolate until we aren't told to restart. |
| 1410 while (RunMainIsolate(script_name, &dart_options)) { |
| 1411 Log::PrintErr("Restarting VM\n"); |
| 1412 } |
| 1413 |
1382 // Terminate process exit-code handler. | 1414 // Terminate process exit-code handler. |
1383 Process::TerminateExitCodeHandler(); | 1415 Process::TerminateExitCodeHandler(); |
1384 | 1416 |
1385 error = Dart_Cleanup(); | 1417 error = Dart_Cleanup(); |
1386 if (error != NULL) { | 1418 if (error != NULL) { |
1387 Log::PrintErr("VM cleanup failed: %s\n", error); | 1419 Log::PrintErr("VM cleanup failed: %s\n", error); |
1388 free(error); | 1420 free(error); |
1389 } | 1421 } |
1390 if (do_vm_shutdown) { | 1422 if (do_vm_shutdown) { |
1391 DebuggerConnectionHandler::StopHandler(); | 1423 DebuggerConnectionHandler::StopHandler(); |
(...skipping 19 matching lines...) Expand all Loading... |
1411 exit(Process::GlobalExitCode()); | 1443 exit(Process::GlobalExitCode()); |
1412 } | 1444 } |
1413 | 1445 |
1414 } // namespace bin | 1446 } // namespace bin |
1415 } // namespace dart | 1447 } // namespace dart |
1416 | 1448 |
1417 int main(int argc, char** argv) { | 1449 int main(int argc, char** argv) { |
1418 dart::bin::main(argc, argv); | 1450 dart::bin::main(argc, argv); |
1419 UNREACHABLE(); | 1451 UNREACHABLE(); |
1420 } | 1452 } |
OLD | NEW |