From c39b0020b5be4f9c892a0fc8b63f6089485bd0e5 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Mon, 25 Dec 2017 21:36:15 +0800 Subject: [PATCH] src: expose uv.errmap to binding Add a errno -> [error code, uv error message] map to the uv binding so the error message can be assembled in the JS layer. Backport-PR-URL: https://github.com/nodejs/node/pull/19191 PR-URL: https://github.com/nodejs/node/pull/17338 Reviewed-By: James M Snell Reviewed-By: Ruben Bridgewater --- src/uv.cc | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/uv.cc b/src/uv.cc index 6cbba07e59039c..5ad53a0024b1ea 100644 --- a/src/uv.cc +++ b/src/uv.cc @@ -27,11 +27,15 @@ namespace node { namespace { +using v8::Array; using v8::Context; using v8::FunctionCallbackInfo; using v8::Integer; +using v8::Isolate; using v8::Local; +using v8::Map; using v8::Object; +using v8::String; using v8::Value; @@ -49,15 +53,31 @@ void InitializeUV(Local target, Local unused, Local context) { Environment* env = Environment::GetCurrent(context); - target->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "errname"), + Isolate* isolate = env->isolate(); + target->Set(FIXED_ONE_BYTE_STRING(isolate, "errname"), env->NewFunctionTemplate(ErrName)->GetFunction()); #define V(name, _) \ target->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "UV_" # name), \ Integer::New(env->isolate(), UV_ ## name)); UV_ERRNO_MAP(V) #undef V -} + Local err_map = Map::New(isolate); + +#define V(name, msg) do { \ + Local arr = Array::New(isolate, 2); \ + arr->Set(0, OneByteString(isolate, #name)); \ + arr->Set(1, OneByteString(isolate, msg)); \ + err_map->Set(context, \ + Integer::New(isolate, UV_##name), \ + arr).ToLocalChecked(); \ +} while (0); + UV_ERRNO_MAP(V) +#undef V + + target->Set(context, FIXED_ONE_BYTE_STRING(isolate, "errmap"), + err_map).FromJust(); +} } // anonymous namespace } // namespace node