| Index: runtime/bin/main.cc
|
| diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
|
| index 586491488dd298e1c3da2f80c625b7e8e92f7d69..ed4726300561835410a8fc9a814a0b11b6516024 100644
|
| --- a/runtime/bin/main.cc
|
| +++ b/runtime/bin/main.cc
|
| @@ -589,19 +589,6 @@ static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
|
| result = DartUtils::PrepareForScriptLoading(package_root, builtin_lib);
|
| CHECK_RESULT(result);
|
|
|
| -
|
| - if (Dart_IsServiceIsolate(isolate)) {
|
| - // If this is the service isolate, load embedder specific bits and return.
|
| - if (!VmService::Setup(vm_service_server_ip, vm_service_server_port)) {
|
| - *error = strdup(VmService::GetErrorMessage());
|
| - return NULL;
|
| - }
|
| - Dart_ExitScope();
|
| - Dart_ExitIsolate();
|
| - return isolate;
|
| - }
|
| -
|
| - // Load the script.
|
| result = DartUtils::LoadScript(script_uri, builtin_lib);
|
| CHECK_RESULT(result);
|
|
|
| @@ -610,8 +597,20 @@ static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
|
| CHECK_RESULT(result);
|
|
|
| Platform::SetPackageRoot(package_root);
|
| -
|
| - DartUtils::SetupIOLibrary(script_uri);
|
| + Dart_Handle io_lib_url = DartUtils::NewString(DartUtils::kIOLibURL);
|
| + CHECK_RESULT(io_lib_url);
|
| + Dart_Handle io_lib = Dart_LookupLibrary(io_lib_url);
|
| + CHECK_RESULT(io_lib);
|
| + Dart_Handle platform_type = DartUtils::GetDartType(DartUtils::kIOLibURL,
|
| + "_Platform");
|
| + CHECK_RESULT(platform_type);
|
| + Dart_Handle script_name = DartUtils::NewString("_nativeScript");
|
| + CHECK_RESULT(script_name);
|
| + Dart_Handle dart_script = DartUtils::NewString(script_uri);
|
| + CHECK_RESULT(dart_script);
|
| + Dart_Handle set_script_name =
|
| + Dart_SetField(platform_type, script_name, dart_script);
|
| + CHECK_RESULT(set_script_name);
|
|
|
| // Make the isolate runnable so that it is ready to handle messages.
|
| Dart_ExitScope();
|
| @@ -647,11 +646,7 @@ static Dart_Isolate CreateIsolateAndSetup(const char* script_uri,
|
| }
|
| }
|
| if (package_root == NULL) {
|
| - if (parent_isolate_data != NULL) {
|
| - package_root = parent_isolate_data->package_root;
|
| - } else {
|
| - package_root = ".";
|
| - }
|
| + package_root = parent_isolate_data->package_root;
|
| }
|
| return CreateIsolateAndSetupHelper(script_uri,
|
| main,
|
| @@ -661,6 +656,50 @@ static Dart_Isolate CreateIsolateAndSetup(const char* script_uri,
|
| }
|
|
|
|
|
| +#define CHECK_RESULT(result) \
|
| + if (Dart_IsError(result)) { \
|
| + *error = strdup(Dart_GetError(result)); \
|
| + Dart_ExitScope(); \
|
| + Dart_ShutdownIsolate(); \
|
| + return NULL; \
|
| + } \
|
| +
|
| +static Dart_Isolate CreateServiceIsolate(void* data, char** error) {
|
| + const char* script_uri = DartUtils::kVMServiceLibURL;
|
| + IsolateData* isolate_data = new IsolateData(script_uri, NULL);
|
| + Dart_Isolate isolate =
|
| + Dart_CreateIsolate(script_uri, "main", snapshot_buffer, isolate_data,
|
| + error);
|
| + if (isolate == NULL) {
|
| + return NULL;
|
| + }
|
| + Dart_EnterScope();
|
| + if (snapshot_buffer != NULL) {
|
| + // Setup the native resolver as the snapshot does not carry it.
|
| + Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
|
| + Builtin::SetNativeResolver(Builtin::kIOLibrary);
|
| + }
|
| + // Set up the library tag handler for this isolate.
|
| + Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler);
|
| + CHECK_RESULT(result);
|
| + result = Dart_SetEnvironmentCallback(EnvironmentCallback);
|
| + CHECK_RESULT(result);
|
| + // Prepare builtin and its dependent libraries for use to resolve URIs.
|
| + Dart_Handle builtin_lib =
|
| + Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
|
| + CHECK_RESULT(builtin_lib);
|
| + // Prepare for script loading by setting up the 'print' and 'timer'
|
| + // closures and setting up 'package root' for URI resolution.
|
| + result = DartUtils::PrepareForScriptLoading(NULL, builtin_lib);
|
| + CHECK_RESULT(result);
|
| +
|
| + Dart_ExitScope();
|
| + Dart_ExitIsolate();
|
| + return isolate;
|
| +}
|
| +
|
| +#undef CHECK_RESULT
|
| +
|
| static void PrintVersion() {
|
| Log::PrintErr("Dart VM version: %s\n", Dart_VersionString());
|
| }
|
| @@ -941,22 +980,21 @@ void main(int argc, char** argv) {
|
|
|
| Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
|
|
|
| - // Start event handler.
|
| - EventHandler::Start();
|
| -
|
| // Initialize the Dart VM.
|
| if (!Dart_Initialize(CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate,
|
| DartUtils::OpenFile,
|
| DartUtils::ReadFile,
|
| DartUtils::WriteFile,
|
| DartUtils::CloseFile,
|
| - DartUtils::EntropySource)) {
|
| + DartUtils::EntropySource,
|
| + CreateServiceIsolate)) {
|
| fprintf(stderr, "%s", "VM initialization failed\n");
|
| fflush(stderr);
|
| exit(kErrorExitCode);
|
| }
|
|
|
| -
|
| + // Start event handler.
|
| + EventHandler::Start();
|
|
|
| // Start the debugger wire protocol handler if necessary.
|
| if (start_debugger) {
|
| @@ -966,12 +1004,23 @@ void main(int argc, char** argv) {
|
| if (print_msg) {
|
| Log::Print("Debugger listening on port %d\n", debug_port);
|
| }
|
| - } else {
|
| - DebuggerConnectionHandler::InitForVmService();
|
| }
|
|
|
| - Dart_RegisterIsolateServiceRequestCallback(
|
| + ASSERT(Dart_CurrentIsolate() == NULL);
|
| + // Start the VM service isolate, if necessary.
|
| + if (start_vm_service) {
|
| + if (!start_debugger) {
|
| + DebuggerConnectionHandler::InitForVmService();
|
| + }
|
| + bool r = VmService::Start(vm_service_server_ip, vm_service_server_port);
|
| + if (!r) {
|
| + Log::PrintErr("Could not start VM Service isolate %s\n",
|
| + VmService::GetErrorMessage());
|
| + }
|
| + Dart_RegisterIsolateServiceRequestCallback(
|
| "io", &ServiceRequestHandler, NULL);
|
| + }
|
| + ASSERT(Dart_CurrentIsolate() == NULL);
|
|
|
| // Call CreateIsolateAndSetup which creates an isolate and loads up
|
| // the specified application script.
|
|
|