#pragma once #include "../../config.hpp" #if (SCRIPT_ENGINE_TYPE == SCRIPT_ENGINE_V8) && SE_ENABLE_INSPECTOR #include "v8.h" #include #ifdef _WIN32 # ifndef BUILDING_NODE_EXTENSION # define NODE_EXTERN __declspec(dllexport) # else # define NODE_EXTERN __declspec(dllimport) # endif #else # define NODE_EXTERN /* nothing */ #endif #include #include #ifndef NODE_STRINGIFY #define NODE_STRINGIFY(n) NODE_STRINGIFY_HELPER(n) #define NODE_STRINGIFY_HELPER(n) #n #endif // The arraysize(arr) macro returns the # of elements in an array arr. // The expression is a compile-time constant, and therefore can be // used in defining new arrays, for example. If you use arraysize on // a pointer by mistake, you will get a compile-time error. #define arraysize(array) (sizeof(ArraySizeHelper(array))) // This template function declaration is used in defining arraysize. // Note that the function doesn't need an implementation, as we only // use its type. template char (&ArraySizeHelper(T (&array)[N]))[N]; #if !V8_CC_MSVC // That gcc wants both of these prototypes seems mysterious. VC, for // its part, can't decide which to use (another mystery). Matching of // template overloads: the final frontier. template char (&ArraySizeHelper(const T (&array)[N]))[N]; #endif #ifdef __POSIX__ void RegisterSignalHandler(int signal, void (*handler)(int signal), bool reset_handler = false); #endif // __POSIX__ namespace node { NODE_EXTERN v8::Local ErrnoException(v8::Isolate* isolate, int errorno, const char* syscall = NULL, const char* message = NULL, const char* path = NULL); NODE_EXTERN v8::Local UVException(v8::Isolate* isolate, int errorno, const char* syscall = NULL, const char* message = NULL, const char* path = NULL); NODE_EXTERN v8::Local UVException(v8::Isolate* isolate, int errorno, const char* syscall, const char* message, const char* path, const char* dest); typedef double async_id; struct async_context { ::node::async_id async_id; ::node::async_id trigger_async_id; }; /* An API specific to emit before/after callbacks is unnecessary because * MakeCallback will automatically call them for you. * * These methods may create handles on their own, so run them inside a * HandleScope. * * `asyncId` and `triggerAsyncId` should correspond to the values returned by * `EmitAsyncInit()` and `AsyncHooksGetTriggerAsyncId()`, respectively, when the * invoking resource was created. If these values are unknown, 0 can be passed. * */ v8::MaybeLocal MakeCallback(v8::Isolate* isolate, v8::Local recv, v8::Local callback, int argc, v8::Local* argv, async_context asyncContext); v8::MaybeLocal MakeCallback(v8::Isolate* isolate, v8::Local recv, const char* method, int argc, v8::Local* argv, async_context asyncContext); v8::MaybeLocal MakeCallback(v8::Isolate* isolate, v8::Local recv, v8::Local symbol, int argc, v8::Local* argv, async_context asyncContext); /* * These methods need to be called in a HandleScope. * * It is preferred that you use the `MakeCallback` overloads taking * `async_id` arguments. */ v8::Local MakeCallback( v8::Isolate* isolate, v8::Local recv, const char* method, int argc, v8::Local* argv); v8::Local MakeCallback( v8::Isolate* isolate, v8::Local recv, v8::Local symbol, int argc, v8::Local* argv); v8::Local MakeCallback( v8::Isolate* isolate, v8::Local recv, v8::Local callback, int argc, v8::Local* argv); class IsolateData; class Environment; NODE_EXTERN IsolateData* CreateIsolateData(v8::Isolate* isolate, struct uv_loop_s* loop); NODE_EXTERN void FreeIsolateData(IsolateData* isolate_data); NODE_EXTERN Environment* CreateEnvironment(IsolateData* isolate_data, v8::Local context, int argc, const char* const* argv, int exec_argc, const char* const* exec_argv); NODE_EXTERN void FreeEnvironment(Environment* env); void SetupProcessObject(Environment* env, int argc, const char* const* argv, int exec_argc, const char* const* exec_argv); } // namespace node { #endif // #if (SCRIPT_ENGINE_TYPE == SCRIPT_ENGINE_V8) && SE_ENABLE_INSPECTOR