diff options
author | Anna Henningsen <anna@addaleax.net> | 2018-09-23 19:24:33 +0200 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2018-10-03 13:43:42 -0700 |
commit | d527dde3600655eae7ce0ba5da9263ec4560cd11 (patch) | |
tree | cb9186b8b85a696ec7f916f40fcec935ba86fdc9 /src/process_wrap.cc | |
parent | 2ebdba12297348649620e3d302b156c149d85a6e (diff) | |
download | node-new-d527dde3600655eae7ce0ba5da9263ec4560cd11.tar.gz |
src: use JS inheritance for `AsyncWrap`
For all classes descending from `AsyncWrap`, use JS inheritance
instead of manually adding methods to the individual classes.
This allows cleanup of some code around transferring handles
over IPC.
PR-URL: https://github.com/nodejs/node/pull/23094
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src/process_wrap.cc')
-rw-r--r-- | src/process_wrap.cc | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/src/process_wrap.cc b/src/process_wrap.cc index 1daa437b29..af6cbfb4e5 100644 --- a/src/process_wrap.cc +++ b/src/process_wrap.cc @@ -20,10 +20,9 @@ // USE OR OTHER DEALINGS IN THE SOFTWARE. #include "env-inl.h" -#include "handle_wrap.h" #include "node_internals.h" -#include "node_wrap.h" #include "stream_base-inl.h" +#include "stream_wrap.h" #include "util-inl.h" #include <string.h> @@ -58,8 +57,7 @@ class ProcessWrap : public HandleWrap { FIXED_ONE_BYTE_STRING(env->isolate(), "Process"); constructor->SetClassName(processString); - AsyncWrap::AddWrapMethods(env, constructor); - HandleWrap::AddWrapMethods(env, constructor); + constructor->Inherit(HandleWrap::GetConstructorTemplate(env)); env->SetProtoMethod(constructor, "spawn", Spawn); env->SetProtoMethod(constructor, "kill", Kill); @@ -92,6 +90,17 @@ class ProcessWrap : public HandleWrap { MarkAsUninitialized(); } + static uv_stream_t* StreamForWrap(Environment* env, Local<Object> stdio) { + Local<String> handle_key = env->handle_string(); + // This property has always been set by JS land if we are in this code path. + Local<Object> handle = + stdio->Get(env->context(), handle_key).ToLocalChecked().As<Object>(); + + uv_stream_t* stream = LibuvStreamWrap::From(env, handle)->stream(); + CHECK_NOT_NULL(stream); + return stream; + } + static void ParseStdioOptions(Environment* env, Local<Object> js_options, uv_process_options_t* options) { @@ -115,22 +124,10 @@ class ProcessWrap : public HandleWrap { } else if (type->StrictEquals(env->pipe_string())) { options->stdio[i].flags = static_cast<uv_stdio_flags>( UV_CREATE_PIPE | UV_READABLE_PIPE | UV_WRITABLE_PIPE); - Local<String> handle_key = env->handle_string(); - Local<Object> handle = - stdio->Get(context, handle_key).ToLocalChecked().As<Object>(); - CHECK(!handle.IsEmpty()); - options->stdio[i].data.stream = - reinterpret_cast<uv_stream_t*>( - Unwrap<PipeWrap>(handle)->UVHandle()); + options->stdio[i].data.stream = StreamForWrap(env, stdio); } else if (type->StrictEquals(env->wrap_string())) { - Local<String> handle_key = env->handle_string(); - Local<Object> handle = - stdio->Get(context, handle_key).ToLocalChecked().As<Object>(); - uv_stream_t* stream = HandleToStream(env, handle); - CHECK_NOT_NULL(stream); - options->stdio[i].flags = UV_INHERIT_STREAM; - options->stdio[i].data.stream = stream; + options->stdio[i].data.stream = StreamForWrap(env, stdio); } else { Local<String> fd_key = env->fd_string(); Local<Value> fd_value = stdio->Get(context, fd_key).ToLocalChecked(); |