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_debugger_api.h" | 10 #include "include/dart_debugger_api.h" |
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
582 // available here in the case of script snapshot loading. | 582 // available here in the case of script snapshot loading. |
583 Dart_Handle builtin_lib = | 583 Dart_Handle builtin_lib = |
584 Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary); | 584 Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary); |
585 CHECK_RESULT(builtin_lib); | 585 CHECK_RESULT(builtin_lib); |
586 | 586 |
587 // Prepare for script loading by setting up the 'print' and 'timer' | 587 // Prepare for script loading by setting up the 'print' and 'timer' |
588 // closures and setting up 'package root' for URI resolution. | 588 // closures and setting up 'package root' for URI resolution. |
589 result = DartUtils::PrepareForScriptLoading(package_root, builtin_lib); | 589 result = DartUtils::PrepareForScriptLoading(package_root, builtin_lib); |
590 CHECK_RESULT(result); | 590 CHECK_RESULT(result); |
591 | 591 |
| 592 |
| 593 if (Dart_IsServiceIsolate(isolate)) { |
| 594 // If this is the service isolate, load embedder specific bits and return. |
| 595 if (!VmService::Setup(vm_service_server_ip, vm_service_server_port)) { |
| 596 *error = strdup(VmService::GetErrorMessage()); |
| 597 return NULL; |
| 598 } |
| 599 Dart_ExitScope(); |
| 600 Dart_ExitIsolate(); |
| 601 return isolate; |
| 602 } |
| 603 |
| 604 // Load the script. |
592 result = DartUtils::LoadScript(script_uri, builtin_lib); | 605 result = DartUtils::LoadScript(script_uri, builtin_lib); |
593 CHECK_RESULT(result); | 606 CHECK_RESULT(result); |
594 | 607 |
595 // Run event-loop and wait for script loading to complete. | 608 // Run event-loop and wait for script loading to complete. |
596 result = Dart_RunLoop(); | 609 result = Dart_RunLoop(); |
597 CHECK_RESULT(result); | 610 CHECK_RESULT(result); |
598 | 611 |
599 Platform::SetPackageRoot(package_root); | 612 Platform::SetPackageRoot(package_root); |
600 Dart_Handle io_lib_url = DartUtils::NewString(DartUtils::kIOLibURL); | 613 |
601 CHECK_RESULT(io_lib_url); | 614 DartUtils::SetupIOLibrary(script_uri); |
602 Dart_Handle io_lib = Dart_LookupLibrary(io_lib_url); | |
603 CHECK_RESULT(io_lib); | |
604 Dart_Handle platform_type = DartUtils::GetDartType(DartUtils::kIOLibURL, | |
605 "_Platform"); | |
606 CHECK_RESULT(platform_type); | |
607 Dart_Handle script_name = DartUtils::NewString("_nativeScript"); | |
608 CHECK_RESULT(script_name); | |
609 Dart_Handle dart_script = DartUtils::NewString(script_uri); | |
610 CHECK_RESULT(dart_script); | |
611 Dart_Handle set_script_name = | |
612 Dart_SetField(platform_type, script_name, dart_script); | |
613 CHECK_RESULT(set_script_name); | |
614 | 615 |
615 // Make the isolate runnable so that it is ready to handle messages. | 616 // Make the isolate runnable so that it is ready to handle messages. |
616 Dart_ExitScope(); | 617 Dart_ExitScope(); |
617 Dart_ExitIsolate(); | 618 Dart_ExitIsolate(); |
618 bool retval = Dart_IsolateMakeRunnable(isolate); | 619 bool retval = Dart_IsolateMakeRunnable(isolate); |
619 if (!retval) { | 620 if (!retval) { |
620 *error = strdup("Invalid isolate state - Unable to make it runnable"); | 621 *error = strdup("Invalid isolate state - Unable to make it runnable"); |
621 Dart_EnterIsolate(isolate); | 622 Dart_EnterIsolate(isolate); |
622 Dart_ShutdownIsolate(); | 623 Dart_ShutdownIsolate(); |
623 return NULL; | 624 return NULL; |
(...skipping 15 matching lines...) Expand all Loading... |
639 *error = strdup("Invalid 'callback_data' - Unable to spawn new isolate"); | 640 *error = strdup("Invalid 'callback_data' - Unable to spawn new isolate"); |
640 return NULL; | 641 return NULL; |
641 } | 642 } |
642 script_uri = parent_isolate_data->script_url; | 643 script_uri = parent_isolate_data->script_url; |
643 if (script_uri == NULL) { | 644 if (script_uri == NULL) { |
644 *error = strdup("Invalid 'callback_data' - Unable to spawn new isolate"); | 645 *error = strdup("Invalid 'callback_data' - Unable to spawn new isolate"); |
645 return NULL; | 646 return NULL; |
646 } | 647 } |
647 } | 648 } |
648 if (package_root == NULL) { | 649 if (package_root == NULL) { |
649 package_root = parent_isolate_data->package_root; | 650 if (parent_isolate_data != NULL) { |
| 651 package_root = parent_isolate_data->package_root; |
| 652 } else { |
| 653 package_root = "."; |
| 654 } |
650 } | 655 } |
651 return CreateIsolateAndSetupHelper(script_uri, | 656 return CreateIsolateAndSetupHelper(script_uri, |
652 main, | 657 main, |
653 package_root, | 658 package_root, |
654 error, | 659 error, |
655 &is_compile_error); | 660 &is_compile_error); |
656 } | 661 } |
657 | 662 |
658 | 663 |
659 #define CHECK_RESULT(result) \ | |
660 if (Dart_IsError(result)) { \ | |
661 *error = strdup(Dart_GetError(result)); \ | |
662 Dart_ExitScope(); \ | |
663 Dart_ShutdownIsolate(); \ | |
664 return NULL; \ | |
665 } \ | |
666 | |
667 static Dart_Isolate CreateServiceIsolate(void* data, char** error) { | |
668 const char* script_uri = DartUtils::kVMServiceLibURL; | |
669 IsolateData* isolate_data = new IsolateData(script_uri, NULL); | |
670 Dart_Isolate isolate = | |
671 Dart_CreateIsolate(script_uri, "main", snapshot_buffer, isolate_data, | |
672 error); | |
673 if (isolate == NULL) { | |
674 return NULL; | |
675 } | |
676 Dart_EnterScope(); | |
677 if (snapshot_buffer != NULL) { | |
678 // Setup the native resolver as the snapshot does not carry it. | |
679 Builtin::SetNativeResolver(Builtin::kBuiltinLibrary); | |
680 Builtin::SetNativeResolver(Builtin::kIOLibrary); | |
681 } | |
682 // Set up the library tag handler for this isolate. | |
683 Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler); | |
684 CHECK_RESULT(result); | |
685 result = Dart_SetEnvironmentCallback(EnvironmentCallback); | |
686 CHECK_RESULT(result); | |
687 // Prepare builtin and its dependent libraries for use to resolve URIs. | |
688 Dart_Handle builtin_lib = | |
689 Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary); | |
690 CHECK_RESULT(builtin_lib); | |
691 // Prepare for script loading by setting up the 'print' and 'timer' | |
692 // closures and setting up 'package root' for URI resolution. | |
693 result = DartUtils::PrepareForScriptLoading(NULL, builtin_lib); | |
694 CHECK_RESULT(result); | |
695 | |
696 Dart_ExitScope(); | |
697 Dart_ExitIsolate(); | |
698 return isolate; | |
699 } | |
700 | |
701 #undef CHECK_RESULT | |
702 | |
703 static void PrintVersion() { | 664 static void PrintVersion() { |
704 Log::PrintErr("Dart VM version: %s\n", Dart_VersionString()); | 665 Log::PrintErr("Dart VM version: %s\n", Dart_VersionString()); |
705 } | 666 } |
706 | 667 |
707 | 668 |
708 static void PrintUsage() { | 669 static void PrintUsage() { |
709 Log::PrintErr( | 670 Log::PrintErr( |
710 "Usage: dart [<vm-flags>] <dart-script-file> [<dart-options>]\n" | 671 "Usage: dart [<vm-flags>] <dart-script-file> [<dart-options>]\n" |
711 "\n" | 672 "\n" |
712 "Executes the Dart script passed as <dart-script-file>.\n" | 673 "Executes the Dart script passed as <dart-script-file>.\n" |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
973 | 934 |
974 if (!DartUtils::SetOriginalWorkingDirectory()) { | 935 if (!DartUtils::SetOriginalWorkingDirectory()) { |
975 OSError err; | 936 OSError err; |
976 fprintf(stderr, "Error determining current directory: %s\n", err.message()); | 937 fprintf(stderr, "Error determining current directory: %s\n", err.message()); |
977 fflush(stderr); | 938 fflush(stderr); |
978 exit(kErrorExitCode); | 939 exit(kErrorExitCode); |
979 } | 940 } |
980 | 941 |
981 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); | 942 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); |
982 | 943 |
| 944 // Start event handler. |
| 945 EventHandler::Start(); |
| 946 |
983 // Initialize the Dart VM. | 947 // Initialize the Dart VM. |
984 if (!Dart_Initialize(CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate, | 948 if (!Dart_Initialize(CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate, |
985 DartUtils::OpenFile, | 949 DartUtils::OpenFile, |
986 DartUtils::ReadFile, | 950 DartUtils::ReadFile, |
987 DartUtils::WriteFile, | 951 DartUtils::WriteFile, |
988 DartUtils::CloseFile, | 952 DartUtils::CloseFile, |
989 DartUtils::EntropySource, | 953 DartUtils::EntropySource)) { |
990 CreateServiceIsolate)) { | |
991 fprintf(stderr, "%s", "VM initialization failed\n"); | 954 fprintf(stderr, "%s", "VM initialization failed\n"); |
992 fflush(stderr); | 955 fflush(stderr); |
993 exit(kErrorExitCode); | 956 exit(kErrorExitCode); |
994 } | 957 } |
995 | 958 |
996 // Start event handler. | 959 |
997 EventHandler::Start(); | |
998 | 960 |
999 // Start the debugger wire protocol handler if necessary. | 961 // Start the debugger wire protocol handler if necessary. |
1000 if (start_debugger) { | 962 if (start_debugger) { |
1001 ASSERT(debug_port >= 0); | 963 ASSERT(debug_port >= 0); |
1002 bool print_msg = verbose_debug_seen || (debug_port == 0); | 964 bool print_msg = verbose_debug_seen || (debug_port == 0); |
1003 debug_port = DebuggerConnectionHandler::StartHandler(debug_ip, debug_port); | 965 debug_port = DebuggerConnectionHandler::StartHandler(debug_ip, debug_port); |
1004 if (print_msg) { | 966 if (print_msg) { |
1005 Log::Print("Debugger listening on port %d\n", debug_port); | 967 Log::Print("Debugger listening on port %d\n", debug_port); |
1006 } | 968 } |
| 969 } else { |
| 970 DebuggerConnectionHandler::InitForVmService(); |
1007 } | 971 } |
1008 | 972 |
1009 ASSERT(Dart_CurrentIsolate() == NULL); | 973 Dart_RegisterIsolateServiceRequestCallback( |
1010 // Start the VM service isolate, if necessary. | |
1011 if (start_vm_service) { | |
1012 if (!start_debugger) { | |
1013 DebuggerConnectionHandler::InitForVmService(); | |
1014 } | |
1015 bool r = VmService::Start(vm_service_server_ip, vm_service_server_port); | |
1016 if (!r) { | |
1017 Log::PrintErr("Could not start VM Service isolate %s\n", | |
1018 VmService::GetErrorMessage()); | |
1019 } | |
1020 Dart_RegisterIsolateServiceRequestCallback( | |
1021 "io", &ServiceRequestHandler, NULL); | 974 "io", &ServiceRequestHandler, NULL); |
1022 } | |
1023 ASSERT(Dart_CurrentIsolate() == NULL); | |
1024 | 975 |
1025 // Call CreateIsolateAndSetup which creates an isolate and loads up | 976 // Call CreateIsolateAndSetup which creates an isolate and loads up |
1026 // the specified application script. | 977 // the specified application script. |
1027 char* error = NULL; | 978 char* error = NULL; |
1028 bool is_compile_error = false; | 979 bool is_compile_error = false; |
1029 char* isolate_name = BuildIsolateName(script_name, "main"); | 980 char* isolate_name = BuildIsolateName(script_name, "main"); |
1030 Dart_Isolate isolate = CreateIsolateAndSetupHelper(script_name, | 981 Dart_Isolate isolate = CreateIsolateAndSetupHelper(script_name, |
1031 "main", | 982 "main", |
1032 commandline_package_root, | 983 commandline_package_root, |
1033 &error, | 984 &error, |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1160 exit(Process::GlobalExitCode()); | 1111 exit(Process::GlobalExitCode()); |
1161 } | 1112 } |
1162 | 1113 |
1163 } // namespace bin | 1114 } // namespace bin |
1164 } // namespace dart | 1115 } // namespace dart |
1165 | 1116 |
1166 int main(int argc, char** argv) { | 1117 int main(int argc, char** argv) { |
1167 dart::bin::main(argc, argv); | 1118 dart::bin::main(argc, argv); |
1168 UNREACHABLE(); | 1119 UNREACHABLE(); |
1169 } | 1120 } |
OLD | NEW |