From 7bc364a3748f88cf86d48cdea7714669bac28516 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 7 Dec 2014 13:09:50 -0800 Subject: [PATCH] Upgrade node for new V8 API --- atom/browser/api/atom_api_window.cc | 2 -- atom/common/node_bindings.cc | 41 +++++++++++++++++++++++++-- atom/renderer/atom_renderer_client.cc | 2 +- common.gypi | 1 + vendor/node | 2 +- 5 files changed, 41 insertions(+), 7 deletions(-) diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index 615adb512cdd..17255fd238ec 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -72,8 +72,6 @@ Window::Window(const mate::Dictionary& options) Window::~Window() { if (window_) Destroy(); - - Emit("destroyed"); } void Window::OnPageTitleUpdated(bool* prevent_default, diff --git a/atom/common/node_bindings.cc b/atom/common/node_bindings.cc index 9bfd0c4f3c5e..e43c4d9625b1 100644 --- a/atom/common/node_bindings.cc +++ b/atom/common/node_bindings.cc @@ -89,6 +89,19 @@ namespace { void UvNoOp(uv_async_t* handle) { } +// Moved from node.cc. +void HandleCloseCb(uv_handle_t* handle) { + node::Environment* env = reinterpret_cast(handle->data); + env->FinishHandleCleanup(handle); +} + +void HandleCleanup(node::Environment* env, + uv_handle_t* handle, + void* arg) { + handle->data = env; + uv_close(handle, HandleCloseCb); +} + // Convert the given vector to an array of C-strings. The strings in the // returned vector are only guaranteed valid so long as the vector of strings // is not modified. @@ -181,6 +194,7 @@ node::Environment* NodeBindings::CreateEnvironment( // Construct the parameters that passed to node::CreateEnvironment: v8::Isolate* isolate = context->GetIsolate(); + uv_loop_t* loop = uv_default_loop(); int argc = args.size(); const char** argv = c_argv.get(); int exec_argc = 0; @@ -191,13 +205,16 @@ node::Environment* NodeBindings::CreateEnvironment( // Following code are stripped from node::CreateEnvironment in node.cc: HandleScope handle_scope(isolate); - Context::Scope context_scope(context); - Environment* env = Environment::New(context); + Context::Scope context_scope(context); + Environment* env = Environment::New(context, loop); + + isolate->SetAutorunMicrotasks(false); uv_check_init(env->event_loop(), env->immediate_check_handle()); uv_unref( reinterpret_cast(env->immediate_check_handle())); + uv_idle_init(env->event_loop(), env->immediate_idle_handle()); uv_prepare_init(env->event_loop(), env->idle_prepare_handle()); @@ -205,6 +222,24 @@ node::Environment* NodeBindings::CreateEnvironment( uv_unref(reinterpret_cast(env->idle_prepare_handle())); uv_unref(reinterpret_cast(env->idle_check_handle())); + // Register handle cleanups + env->RegisterHandleCleanup( + reinterpret_cast(env->immediate_check_handle()), + HandleCleanup, + nullptr); + env->RegisterHandleCleanup( + reinterpret_cast(env->immediate_idle_handle()), + HandleCleanup, + nullptr); + env->RegisterHandleCleanup( + reinterpret_cast(env->idle_prepare_handle()), + HandleCleanup, + nullptr); + env->RegisterHandleCleanup( + reinterpret_cast(env->idle_check_handle()), + HandleCleanup, + nullptr); + Local process_template = FunctionTemplate::New(isolate); process_template->SetClassName(FIXED_ONE_BYTE_STRING(isolate, "process")); @@ -212,7 +247,7 @@ node::Environment* NodeBindings::CreateEnvironment( env->set_process_object(process_object); SetupProcessObject(env, argc, argv, exec_argc, exec_argv); - Load(env); + LoadEnvironment(env); return env; } diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index 7a108d72c5e1..c910014e19dc 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -92,7 +92,7 @@ void AtomRendererClient::WebKitInitialized() { v8::Isolate* isolate = blink::mainThreadIsolate(); v8::HandleScope handle_scope(isolate); v8::Local context = v8::Context::New(isolate); - global_env = node::Environment::New(context); + global_env = node::Environment::New(context, uv_default_loop()); } void AtomRendererClient::RenderThreadStarted() { diff --git a/common.gypi b/common.gypi index 2bf92e790e20..d3835bbd89f2 100644 --- a/common.gypi +++ b/common.gypi @@ -33,6 +33,7 @@ 'uv_parent_path': 'vendor/node/deps/uv', 'uv_use_dtrace': 'false', 'v8_postmortem_support': 'false', + 'v8_enable_i18n_support': 'false', # Required by Linux (empty for now, should support it in future). 'sysroot': '', }, diff --git a/vendor/node b/vendor/node index 6403ce1c2ff7..b1d7464f1c05 160000 --- a/vendor/node +++ b/vendor/node @@ -1 +1 @@ -Subproject commit 6403ce1c2ff752e81c1145112fa73f9273b8e73a +Subproject commit b1d7464f1c05456027d41fa97384765bc1790212