#ifndef SRC_NODE_BINDING_H_ #define SRC_NODE_BINDING_H_ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS #if defined(__POSIX__) #include #endif #include "node.h" #define NAPI_EXPERIMENTAL #include "node_api.h" enum { NM_F_BUILTIN = 1 << 0, // Unused. NM_F_LINKED = 1 << 1, NM_F_INTERNAL = 1 << 2, NM_F_DELETEME = 1 << 3, }; // Make sure our internal values match the public API's values. static_assert(static_cast(NM_F_LINKED) == static_cast(node::ModuleFlags::kLinked), "NM_F_LINKED != node::ModuleFlags::kLinked"); #define NODE_MODULE_CONTEXT_AWARE_CPP(modname, regfunc, priv, flags) \ static node::node_module _module = { \ NODE_MODULE_VERSION, \ flags, \ nullptr, \ __FILE__, \ nullptr, \ (node::addon_context_register_func)(regfunc), \ NODE_STRINGIFY(modname), \ priv, \ nullptr}; \ void _register_##modname() { node_module_register(&_module); } void napi_module_register_by_symbol(v8::Local exports, v8::Local module, v8::Local context, napi_addon_register_func init); namespace node { #define NODE_MODULE_CONTEXT_AWARE_INTERNAL(modname, regfunc) \ NODE_MODULE_CONTEXT_AWARE_CPP(modname, regfunc, nullptr, NM_F_INTERNAL) // Globals per process // This is set by node::Init() which is used by embedders extern bool node_is_initialized; namespace binding { class DLib { public: #ifdef __POSIX__ static const int kDefaultFlags = RTLD_LAZY; #else static const int kDefaultFlags = 0; #endif DLib(const char* filename, int flags); bool Open(); void Close(); void* GetSymbolAddress(const char* name); void SaveInGlobalHandleMap(node_module* mp); node_module* GetSavedModuleFromGlobalHandleMap(); const std::string filename_; const int flags_; std::string errmsg_; void* handle_; #ifndef __POSIX__ uv_lib_t lib_; #endif bool has_entry_in_global_handle_map_ = false; DLib(const DLib&) = delete; DLib& operator=(const DLib&) = delete; }; // Call _register functions for all of // the built-in modules. Because built-in modules don't // use the __attribute__((constructor)). Need to // explicitly call the _register* functions. void RegisterBuiltinModules(); void GetInternalBinding(const v8::FunctionCallbackInfo& args); void GetLinkedBinding(const v8::FunctionCallbackInfo& args); void DLOpen(const v8::FunctionCallbackInfo& args); } // namespace binding } // namespace node #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS #endif // SRC_NODE_BINDING_H_