2022-09-30 05:39:11 +00:00

143 lines
3.8 KiB
C++

#include "node_internals.h"
#include <stdlib.h>
#include <cstdarg>
#include <vector>
#include "uv.h"
#if defined(_MSC_VER)
#define getpid GetCurrentProcessId
#else
#include <unistd.h> // getpid
#endif
#if NODE_MAJOR_VERSION < 8 || NODE_MAJOR_VERSION == 8 && NODE_MINOR_VERSION < 6
CallbackScope::CallbackScope(void *work) {
}
#endif // NODE_MAJOR_VERSION < 8
namespace node {
#if NODE_MAJOR_VERSION < 8
async_context EmitAsyncInit(v8::Isolate* isolate,
v8::Local<v8::Object> resource,
v8::Local<v8::String> name,
async_id trigger_async_id) {
return async_context();
}
void EmitAsyncDestroy(v8::Isolate* isolate,
async_context asyncContext) {
}
AsyncResource::AsyncResource(v8::Isolate* isolate,
v8::Local<v8::Object> object,
const char *name) {
}
#endif // NODE_MAJOR_VERSION < 8
#if NODE_MAJOR_VERSION < 8 || NODE_MAJOR_VERSION == 8 && NODE_MINOR_VERSION < 6
v8::MaybeLocal<v8::Value> MakeCallback(v8::Isolate* isolate,
v8::Local<v8::Object> recv,
v8::Local<v8::Function> callback,
int argc,
v8::Local<v8::Value>* argv,
async_context asyncContext) {
return node::MakeCallback(isolate, recv, callback, argc, argv);
}
#endif // NODE_MAJOR_VERSION < 8 || NODE_MAJOR_VERSION == 8 && NODE_MINOR_VERSION < 6
static void PrintErrorString(const char* format, ...) {
va_list ap;
va_start(ap, format);
#ifdef _WIN32
HANDLE stderr_handle = GetStdHandle(STD_ERROR_HANDLE);
// Check if stderr is something other than a tty/console
if (stderr_handle == INVALID_HANDLE_VALUE ||
stderr_handle == nullptr ||
uv_guess_handle(_fileno(stderr)) != UV_TTY) {
vfprintf(stderr, format, ap);
va_end(ap);
return;
}
// Fill in any placeholders
int n = _vscprintf(format, ap);
std::vector<char> out(n + 1);
vsprintf(out.data(), format, ap);
// Get required wide buffer size
n = MultiByteToWideChar(CP_UTF8, 0, out.data(), -1, nullptr, 0);
std::vector<wchar_t> wbuf(n);
MultiByteToWideChar(CP_UTF8, 0, out.data(), -1, wbuf.data(), n);
// Don't include the null character in the output
CHECK_GT(n, 0);
WriteConsoleW(stderr_handle, wbuf.data(), n - 1, nullptr, nullptr);
#else
vfprintf(stderr, format, ap);
#endif
va_end(ap);
}
void DumpBacktrace(FILE* fp) {
}
NO_RETURN void Abort() {
DumpBacktrace(stderr);
fflush(stderr);
ABORT_NO_BACKTRACE();
}
NO_RETURN void Assert(const char* const (*args)[4]) {
auto filename = (*args)[0];
auto linenum = (*args)[1];
auto message = (*args)[2];
auto function = (*args)[3];
char exepath[256];
size_t exepath_size = sizeof(exepath);
if (uv_exepath(exepath, &exepath_size))
snprintf(exepath, sizeof(exepath), "node");
char pid[12] = {0};
snprintf(pid, sizeof(pid), "[%u]", getpid());
fprintf(stderr, "%s%s: %s:%s:%s%s Assertion `%s' failed.\n",
exepath, pid, filename, linenum,
function, *function ? ":" : "", message);
fflush(stderr);
Abort();
}
static void OnFatalError(const char* location, const char* message) {
if (location) {
PrintErrorString("FATAL ERROR: %s %s\n", location, message);
} else {
PrintErrorString("FATAL ERROR: %s\n", message);
}
fflush(stderr);
ABORT();
}
NO_RETURN void FatalError(const char* location, const char* message) {
OnFatalError(location, message);
// to suppress compiler warning
ABORT();
}
} // namespace node
#if NODE_MAJOR_VERSION < 6
v8::Local<v8::Name> v8::Private::ForApi(v8::Isolate* isolate,
v8::Local<v8::String> key) {
return v8::Symbol::ForApi(isolate, key);
}
#endif // NODE_MAJOR_VERSION < 6