diff options
author | Joyee Cheung <joyeec9h3@gmail.com> | 2018-04-02 10:36:17 +0800 |
---|---|---|
committer | Joyee Cheung <joyeec9h3@gmail.com> | 2018-04-07 17:15:03 +0800 |
commit | 289d152ce0222d3be32bf20ef7dc7d8d5e40f218 (patch) | |
tree | ad0d3e90bf1dc247a95455e0b58d7693fc4966ee | |
parent | 1f29963eacf587817a6d40da527d05d151668198 (diff) | |
download | android-node-v8-289d152ce0222d3be32bf20ef7dc7d8d5e40f218.tar.gz android-node-v8-289d152ce0222d3be32bf20ef7dc7d8d5e40f218.tar.bz2 android-node-v8-289d152ce0222d3be32bf20ef7dc7d8d5e40f218.zip |
src: add error code helpers to src/node_errors.h
This commit adds node::ERR_*(isolate, message) helpers in
the C++ land to assign error codes to existing C++ errors.
The following errors are added:
- ERR_MEMORY_ALLOCATION_FAILED
- ERR_STRING_TOO_LARGE
PR-URL: https://github.com/nodejs/node/pull/19739
Fixes: https://github.com/nodejs/node/issues/3175
Fixes: https://github.com/nodejs/node/issues/9489
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
-rw-r--r-- | doc/api/errors.md | 12 | ||||
-rw-r--r-- | node.gyp | 1 | ||||
-rw-r--r-- | src/node_errors.h | 73 |
3 files changed, 86 insertions, 0 deletions
diff --git a/doc/api/errors.md b/doc/api/errors.md index 936b1b0cd5..e96848b296 100644 --- a/doc/api/errors.md +++ b/doc/api/errors.md @@ -1242,6 +1242,12 @@ An attempt was made to open an IPC communication channel with a synchronously forked Node.js process. See the documentation for the [`child_process`][] module for more information. +<a id="ERR_MEMORY_ALLOCATION_FAILED"></a> +### ERR_MEMORY_ALLOCATION_FAILED + +An attempt was made to allocate memory (usually in the C++ layer) but it +failed. + <a id="ERR_METHOD_NOT_IMPLEMENTED"></a> ### ERR_METHOD_NOT_IMPLEMENTED @@ -1468,6 +1474,12 @@ additional details. A stream method was called that cannot complete because the stream was destroyed using `stream.destroy()`. +<a id="ERR_STRING_TOO_LARGE"></a> +### ERR_STRING_TOO_LARGE + +An attempt has been made to create a string larger than the maximum allowed +size. + <a id="ERR_TLS_CERT_ALTNAME_INVALID"></a> ### ERR_TLS_CERT_ALTNAME_INVALID @@ -316,6 +316,7 @@ 'src/node_contextify.cc', 'src/node_debug_options.cc', 'src/node_domain.cc', + 'src/node_errors.h', 'src/node_file.cc', 'src/node_http2.cc', 'src/node_http_parser.cc', diff --git a/src/node_errors.h b/src/node_errors.h new file mode 100644 index 0000000000..8e328ac2f3 --- /dev/null +++ b/src/node_errors.h @@ -0,0 +1,73 @@ +#ifndef SRC_NODE_ERRORS_H_ +#define SRC_NODE_ERRORS_H_ + +#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#include "node.h" +#include "util-inl.h" +#include "env-inl.h" +#include "v8.h" + +namespace node { + +// Helpers to construct errors similar to the ones provided by +// lib/internal/errors.js. +// Example: with `V(ERR_INVALID_ARG_TYPE, TypeError)`, there will be +// `node::ERR_INVALID_ARG_TYPE(isolate, "message")` returning +// a `Local<Value>` containing the TypeError with proper code and message + +#define ERRORS_WITH_CODE(V) \ + V(ERR_MEMORY_ALLOCATION_FAILED, Error) \ + V(ERR_STRING_TOO_LARGE, Error) \ + V(ERR_BUFFER_TOO_LARGE, Error) + +#define V(code, type) \ + inline v8::Local<v8::Value> code(v8::Isolate* isolate, \ + const char* message) { \ + v8::Local<v8::String> js_code = OneByteString(isolate, #code); \ + v8::Local<v8::String> js_msg = OneByteString(isolate, message); \ + v8::Local<v8::Object> e = \ + v8::Exception::type(js_msg)->ToObject( \ + isolate->GetCurrentContext()).ToLocalChecked(); \ + e->Set(isolate->GetCurrentContext(), OneByteString(isolate, "code"), \ + js_code).FromJust(); \ + return e; \ + } + ERRORS_WITH_CODE(V) +#undef V + +// Errors with predefined static messages + +#define PREDEFINED_ERROR_MESSAGES(V) \ + V(ERR_MEMORY_ALLOCATION_FAILED, "Failed to allocate memory") + +#define V(code, message) \ + inline v8::Local<v8::Value> code(v8::Isolate* isolate) { \ + return code(isolate, message); \ + } + PREDEFINED_ERROR_MESSAGES(V) +#undef V + +// Errors with predefined non-static messages + +inline v8::Local<v8::Value> ERR_BUFFER_TOO_LARGE(v8::Isolate *isolate) { + char message[128]; + snprintf(message, sizeof(message), + "Cannot create a Buffer larger than 0x%lx bytes", + v8::TypedArray::kMaxLength); + return ERR_BUFFER_TOO_LARGE(isolate, message); +} + +inline v8::Local<v8::Value> ERR_STRING_TOO_LARGE(v8::Isolate *isolate) { + char message[128]; + snprintf(message, sizeof(message), + "Cannot create a string larger than 0x%x bytes", + v8::String::kMaxLength); + return ERR_STRING_TOO_LARGE(isolate, message); +} + +} // namespace node + +#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#endif // SRC_NODE_ERRORS_H_ |