From e0828635c5da0f6553686501a26327b146f5083e Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sat, 6 Oct 2018 17:26:02 -0700 Subject: [PATCH] zlib: generate error code names in C++ This makes it easier to implement the lookup in a way that targets error codes from a specific compression library, as a way towards supporting multiple ones (e.g. brotli). PR-URL: https://github.com/nodejs/node/pull/23413 Reviewed-By: Richard Lau Reviewed-By: Luigi Pinca Reviewed-By: Sakthipriyan Vairamani Reviewed-By: James M Snell Reviewed-By: Colin Ihrig --- lib/zlib.js | 4 ++-- src/node_zlib.cc | 25 ++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/lib/zlib.js b/lib/zlib.js index 5d5ef3e083ce9c..97b12410f121ef 100644 --- a/lib/zlib.js +++ b/lib/zlib.js @@ -143,7 +143,7 @@ function zlibBufferSync(engine, buffer) { return buffer; } -function zlibOnError(message, errno) { +function zlibOnError(message, errno, code) { var self = this[owner_symbol]; // there is no way to cleanly recover. // continuing only obscures problems. @@ -153,7 +153,7 @@ function zlibOnError(message, errno) { // eslint-disable-next-line no-restricted-syntax const error = new Error(message); error.errno = errno; - error.code = codes[errno]; + error.code = code; self.emit('error', error); } diff --git a/src/node_zlib.cc b/src/node_zlib.cc index 6e99f68108730f..aef5e3e40ffa80 100644 --- a/src/node_zlib.cc +++ b/src/node_zlib.cc @@ -46,8 +46,8 @@ using v8::FunctionCallbackInfo; using v8::FunctionTemplate; using v8::HandleScope; using v8::Int32; +using v8::Integer; using v8::Local; -using v8::Number; using v8::Object; using v8::String; using v8::Uint32; @@ -56,6 +56,24 @@ using v8::Value; namespace { +#define ZLIB_ERROR_CODES(V) \ + V(Z_OK) \ + V(Z_STREAM_END) \ + V(Z_NEED_DICT) \ + V(Z_ERRNO) \ + V(Z_STREAM_ERROR) \ + V(Z_DATA_ERROR) \ + V(Z_MEM_ERROR) \ + V(Z_BUF_ERROR) \ + V(Z_VERSION_ERROR) \ + +inline const char* ZlibStrerror(int err) { +#define V(code) if (err == code) return #code; + ZLIB_ERROR_CODES(V) +#undef V + return "Z_UNKNOWN_ERROR"; +} + enum node_zlib_mode { NONE, DEFLATE, @@ -404,9 +422,10 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork { } HandleScope scope(env()->isolate()); - Local args[2] = { + Local args[3] = { OneByteString(env()->isolate(), message), - Number::New(env()->isolate(), err_) + Integer::New(env()->isolate(), err_), + OneByteString(env()->isolate(), ZlibStrerror(err_)) }; MakeCallback(env()->onerror_string(), arraysize(args), args);