diff --git a/src/node_errors.h b/src/node_errors.h index 801b19fc91810b..4d2667fb4dfdce 100644 --- a/src/node_errors.h +++ b/src/node_errors.h @@ -115,11 +115,21 @@ void OOMErrorHandler(const char* location, const v8::OOMDetails& details); V(ERR_WORKER_INIT_FAILED, Error) \ V(ERR_PROTO_ACCESS, Error) +// If the macros are used as ERR_*(isolate, message) or +// THROW_ERR_*(isolate, message) with a single string argument, do run +// formatter on the message, and allow the caller to pass in a message +// directly with characters that would otherwise need escaping if used +// as format string unconditionally. #define V(code, type) \ template \ inline v8::Local code( \ v8::Isolate* isolate, const char* format, Args&&... args) { \ - std::string message = SPrintF(format, std::forward(args)...); \ + std::string message; \ + if (sizeof...(Args) == 0) { \ + message = format; \ + } else { \ + message = SPrintF(format, std::forward(args)...); \ + } \ v8::Local js_code = FIXED_ONE_BYTE_STRING(isolate, #code); \ v8::Local js_msg = \ v8::String::NewFromUtf8(isolate, \