diff --git a/node.gyp b/node.gyp index 4ae9d36a552413..3c598d8770172c 100644 --- a/node.gyp +++ b/node.gyp @@ -798,6 +798,7 @@ 'defines': [ 'NODE_WANT_INTERNALS=1' ], 'sources': [ + 'test/cctest/node_module_reg.cc', 'test/cctest/node_test_fixture.cc', 'test/cctest/test_aliased_buffer.cc', 'test/cctest/test_base64.cc', diff --git a/src/async-wrap.cc b/src/async-wrap.cc index 1b1452b69379c7..ee07ebb0368cda 100644 --- a/src/async-wrap.cc +++ b/src/async-wrap.cc @@ -729,8 +729,7 @@ void EmitAsyncDestroy(Isolate* isolate, async_context asyncContext) { } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(async_wrap, node::AsyncWrap::Initialize) - +NODE_BUILTIN_MODULE_CONTEXT_AWARE(async_wrap, node::AsyncWrap::Initialize) // Only legacy public API below this line. diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 605709c61945fd..1459dfafab030c 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -2241,4 +2241,4 @@ void Initialize(Local target, } // namespace cares_wrap } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(cares_wrap, node::cares_wrap::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(cares_wrap, node::cares_wrap::Initialize) diff --git a/src/fs_event_wrap.cc b/src/fs_event_wrap.cc index 5a8693c380b822..a7af5293bbfc72 100644 --- a/src/fs_event_wrap.cc +++ b/src/fs_event_wrap.cc @@ -222,4 +222,4 @@ void FSEventWrap::Close(const FunctionCallbackInfo& args) { } // anonymous namespace } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(fs_event_wrap, node::FSEventWrap::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(fs_event_wrap, node::FSEventWrap::Initialize) diff --git a/src/inspector_js_api.cc b/src/inspector_js_api.cc index f72517bac18c70..df700bf6a1b671 100644 --- a/src/inspector_js_api.cc +++ b/src/inspector_js_api.cc @@ -348,5 +348,5 @@ void InitInspectorBindings(Local target, Local unused, } // namespace inspector } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(inspector, +NODE_BUILTIN_MODULE_CONTEXT_AWARE(inspector, node::inspector::InitInspectorBindings); diff --git a/src/js_stream.cc b/src/js_stream.cc index 9d28b90585048a..842fc3b711bd51 100644 --- a/src/js_stream.cc +++ b/src/js_stream.cc @@ -251,4 +251,4 @@ void JSStream::Initialize(Local target, } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(js_stream, node::JSStream::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(js_stream, node::JSStream::Initialize) diff --git a/src/node.cc b/src/node.cc index fa8b44e64d0cfd..f70d2bd7448a8c 100644 --- a/src/node.cc +++ b/src/node.cc @@ -120,6 +120,16 @@ typedef int mode_t; extern char **environ; #endif +// This is used to load built-in modules. Instead of using +// __attribute__((constructor)), we call the _register_ +// function for each built-in modules explicitly in +// node::RegisterBuiltinModules(). This is only forward declaration. +// The definitions are in each module's implementation when calling +// the NODE_BUILTIN_MODULE_CONTEXT_AWARE. +#define V(modname) void _register_##modname(); + NODE_BUILTIN_MODULES(V) +#undef V + namespace node { using v8::Array; @@ -4572,6 +4582,9 @@ void Init(int* argc, // Initialize prog_start_time to get relative uptime. prog_start_time = static_cast(uv_now(uv_default_loop())); + // Register built-in modules + node::RegisterBuiltinModules(); + // Make inherited handles noninheritable. uv_disable_stdio_inheritance(); @@ -4947,11 +4960,18 @@ int Start(int argc, char** argv) { return exit_code; } +// Call built-in modules' _register_ function to +// do module registration explicitly. +void RegisterBuiltinModules() { +#define V(modname) _register_##modname(); + NODE_BUILTIN_MODULES(V) +#undef V +} } // namespace node #if !HAVE_INSPECTOR -static void InitEmptyBindings() {} +void InitEmptyBindings() {} -NODE_MODULE_CONTEXT_AWARE_BUILTIN(inspector, InitEmptyBindings) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(inspector, InitEmptyBindings) #endif // !HAVE_INSPECTOR diff --git a/src/node_buffer.cc b/src/node_buffer.cc index 0828091a1dfb6e..66ae9feb697a32 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -1304,4 +1304,4 @@ void Initialize(Local target, } // namespace Buffer } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(buffer, node::Buffer::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(buffer, node::Buffer::Initialize) diff --git a/src/node_config.cc b/src/node_config.cc index 7fa275b8df05cc..07f891cf0c012a 100644 --- a/src/node_config.cc +++ b/src/node_config.cc @@ -129,4 +129,4 @@ static void InitConfig(Local target, } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(config, node::InitConfig) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(config, node::InitConfig) diff --git a/src/node_contextify.cc b/src/node_contextify.cc index c297a7fadb7c51..47857e8cab0a10 100644 --- a/src/node_contextify.cc +++ b/src/node_contextify.cc @@ -1085,4 +1085,4 @@ void InitContextify(Local target, } // anonymous namespace } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(contextify, node::InitContextify) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(contextify, node::InitContextify) diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 5504ea3f7ee6cb..7255fa32dbcdde 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -6195,4 +6195,4 @@ void InitCrypto(Local target, } // namespace crypto } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(crypto, node::crypto::InitCrypto) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(crypto, node::crypto::InitCrypto) diff --git a/src/node_file.cc b/src/node_file.cc index 2b67978556316c..9de7fe0e378642 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -1518,4 +1518,4 @@ void InitFs(Local target, } // end namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(fs, node::InitFs) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(fs, node::InitFs) diff --git a/src/node_http2.cc b/src/node_http2.cc index 4235ba0f17f47f..89d68de88f8cfe 100644 --- a/src/node_http2.cc +++ b/src/node_http2.cc @@ -2250,4 +2250,4 @@ HTTP_STATUS_CODES(V) } // namespace http2 } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(http2, node::http2::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(http2, node::http2::Initialize) diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc index 329da616f7cf1a..aa325277f6c6dd 100644 --- a/src/node_http_parser.cc +++ b/src/node_http_parser.cc @@ -810,4 +810,4 @@ void InitHttpParser(Local target, } // anonymous namespace } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(http_parser, node::InitHttpParser) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(http_parser, node::InitHttpParser) diff --git a/src/node_i18n.cc b/src/node_i18n.cc index 1b3f0293e2f3f0..cc02092dd8630a 100644 --- a/src/node_i18n.cc +++ b/src/node_i18n.cc @@ -874,6 +874,6 @@ void Init(Local target, } // namespace i18n } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(icu, node::i18n::Init) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(icu, node::i18n::Init) #endif // NODE_HAVE_I18N_SUPPORT diff --git a/src/node_internals.h b/src/node_internals.h index 4baeed9e56247a..55798d2e7a87f6 100644 --- a/src/node_internals.h +++ b/src/node_internals.h @@ -56,6 +56,81 @@ struct sockaddr; constant_attributes).FromJust(); \ } while (0) + +#if HAVE_OPENSSL +#define NODE_BUILTIN_OPENSSL_MODULES(V) V(crypto) V(tls_wrap) +#else +#define NODE_BUILTIN_OPENSSL_MODULES(V) +#endif + +#if NODE_HAVE_I18N_SUPPORT +#define NODE_BUILTIN_ICU_MODULES(V) V(icu) +#else +#define NODE_BUILTIN_ICU_MODULES(V) +#endif + +// A list of built-in modules. In order to do module registration +// in node::Init(), need to add built-in modules in the following list. +// Then in node::RegisterBuiltinModules(), it calls modules' registration +// function. This helps the built-in modules are loaded properly when +// node is built as static library. No need to depends on the +// __attribute__((constructor)) like mechanism in GCC. +#define NODE_BUILTIN_STANDARD_MODULES(V) \ + V(async_wrap) \ + V(buffer) \ + V(cares_wrap) \ + V(config) \ + V(contextify) \ + V(fs) \ + V(fs_event_wrap) \ + V(http2) \ + V(http_parser) \ + V(inspector) \ + V(js_stream) \ + V(module_wrap) \ + V(os) \ + V(performance) \ + V(pipe_wrap) \ + V(process_wrap) \ + V(serdes) \ + V(signal_wrap) \ + V(spawn_sync) \ + V(stream_wrap) \ + V(tcp_wrap) \ + V(timer_wrap) \ + V(tty_wrap) \ + V(udp_wrap) \ + V(url) \ + V(util) \ + V(uv) \ + V(v8) \ + V(zlib) + +#define NODE_BUILTIN_MODULES(V) \ + NODE_BUILTIN_STANDARD_MODULES(V) \ + NODE_BUILTIN_OPENSSL_MODULES(V) \ + NODE_BUILTIN_ICU_MODULES(V) + +#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); \ + } + + +#define NODE_BUILTIN_MODULE_CONTEXT_AWARE(modname, regfunc) \ + NODE_MODULE_CONTEXT_AWARE_CPP(modname, regfunc, nullptr, NM_F_BUILTIN) + namespace node { // Set in node.cc by ParseArgs with the value of --openssl-config. @@ -182,6 +257,12 @@ void SetupProcessObject(Environment* env, int exec_argc, const char* const* exec_argv); +// 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(); + enum Endianness { kLittleEndian, // _Not_ LITTLE_ENDIAN, clashes with endian.h. kBigEndian @@ -305,9 +386,8 @@ class InternalCallbackScope { bool closed_ = false; }; -#define NODE_MODULE_CONTEXT_AWARE_INTERNAL(modname, regfunc) \ - /* NOLINTNEXTLINE (readability/null_usage) */ \ - NODE_MODULE_CONTEXT_AWARE_X(modname, regfunc, NULL, NM_F_INTERNAL) \ +#define NODE_MODULE_CONTEXT_AWARE_INTERNAL(modname, regfunc) \ + NODE_MODULE_CONTEXT_AWARE_CPP(modname, regfunc, nullptr, NM_F_INTERNAL) } // namespace node diff --git a/src/node_os.cc b/src/node_os.cc index 98fa6087f3b5b3..4ebca206a57c17 100644 --- a/src/node_os.cc +++ b/src/node_os.cc @@ -430,4 +430,4 @@ void Initialize(Local target, } // namespace os } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(os, node::os::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(os, node::os::Initialize) diff --git a/src/node_perf.cc b/src/node_perf.cc index a3b428bac94fc4..94c3a0f8e0c047 100644 --- a/src/node_perf.cc +++ b/src/node_perf.cc @@ -390,4 +390,4 @@ void Init(Local target, } // namespace performance } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(performance, node::performance::Init) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(performance, node::performance::Init) diff --git a/src/node_serdes.cc b/src/node_serdes.cc index 4e99513a5fd31c..19b6f163e6ef7d 100644 --- a/src/node_serdes.cc +++ b/src/node_serdes.cc @@ -483,4 +483,4 @@ void InitializeSerdesBindings(Local target, } // anonymous namespace } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(serdes, node::InitializeSerdesBindings) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(serdes, node::InitializeSerdesBindings) diff --git a/src/node_url.cc b/src/node_url.cc index b0cfc626598227..ad9996a4ce5765 100644 --- a/src/node_url.cc +++ b/src/node_url.cc @@ -2220,4 +2220,4 @@ static void Init(Local target, } // namespace url } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(url, node::url::Init) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(url, node::url::Init) diff --git a/src/node_util.cc b/src/node_util.cc index ab1f3c9f91257d..a40401b71926b3 100644 --- a/src/node_util.cc +++ b/src/node_util.cc @@ -238,4 +238,4 @@ void Initialize(Local target, } // namespace util } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(util, node::util::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(util, node::util::Initialize) diff --git a/src/node_v8.cc b/src/node_v8.cc index 8b4d31a880dc0c..0fbae2d8a297a8 100644 --- a/src/node_v8.cc +++ b/src/node_v8.cc @@ -20,6 +20,7 @@ // USE OR OTHER DEALINGS IN THE SOFTWARE. #include "node.h" +#include "node_internals.h" #include "env-inl.h" #include "util-inl.h" #include "v8.h" @@ -206,4 +207,4 @@ void InitializeV8Bindings(Local target, } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(v8, node::InitializeV8Bindings) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(v8, node::InitializeV8Bindings) diff --git a/src/node_zlib.cc b/src/node_zlib.cc index 1a623075a5a421..0accd6441a5889 100644 --- a/src/node_zlib.cc +++ b/src/node_zlib.cc @@ -701,4 +701,4 @@ void InitZlib(Local target, } // anonymous namespace } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(zlib, node::InitZlib) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(zlib, node::InitZlib) diff --git a/src/pipe_wrap.cc b/src/pipe_wrap.cc index b76b31e81df45b..bb5a6d27dd2316 100644 --- a/src/pipe_wrap.cc +++ b/src/pipe_wrap.cc @@ -203,4 +203,4 @@ void PipeWrap::Connect(const FunctionCallbackInfo& args) { } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(pipe_wrap, node::PipeWrap::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(pipe_wrap, node::PipeWrap::Initialize) diff --git a/src/process_wrap.cc b/src/process_wrap.cc index a73e4d9779ed46..3667b0449e4e2c 100644 --- a/src/process_wrap.cc +++ b/src/process_wrap.cc @@ -311,4 +311,4 @@ class ProcessWrap : public HandleWrap { } // anonymous namespace } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(process_wrap, node::ProcessWrap::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(process_wrap, node::ProcessWrap::Initialize) diff --git a/src/signal_wrap.cc b/src/signal_wrap.cc index d5bbddc8a025e7..66ec8d69faa2e1 100644 --- a/src/signal_wrap.cc +++ b/src/signal_wrap.cc @@ -127,4 +127,4 @@ class SignalWrap : public HandleWrap { } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(signal_wrap, node::SignalWrap::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(signal_wrap, node::SignalWrap::Initialize) diff --git a/src/spawn_sync.cc b/src/spawn_sync.cc index 626ecbb04ff5b7..4e51cc5d8f1dca 100644 --- a/src/spawn_sync.cc +++ b/src/spawn_sync.cc @@ -1081,5 +1081,5 @@ void SyncProcessRunner::KillTimerCloseCallback(uv_handle_t* handle) { } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(spawn_sync, +NODE_BUILTIN_MODULE_CONTEXT_AWARE(spawn_sync, node::SyncProcessRunner::Initialize) diff --git a/src/stream_wrap.cc b/src/stream_wrap.cc index c2915ac453ea33..b089f1506746dc 100644 --- a/src/stream_wrap.cc +++ b/src/stream_wrap.cc @@ -399,5 +399,5 @@ void LibuvStreamWrap::OnAfterWriteImpl(WriteWrap* w, void* ctx) { } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(stream_wrap, +NODE_BUILTIN_MODULE_CONTEXT_AWARE(stream_wrap, node::LibuvStreamWrap::Initialize) diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc index ce86108cb0acbb..af64f89b546079 100644 --- a/src/tcp_wrap.cc +++ b/src/tcp_wrap.cc @@ -360,4 +360,4 @@ Local AddressToJS(Environment* env, } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(tcp_wrap, node::TCPWrap::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(tcp_wrap, node::TCPWrap::Initialize) diff --git a/src/timer_wrap.cc b/src/timer_wrap.cc index 08701b4ff08d55..dc4c2ea5c3def3 100644 --- a/src/timer_wrap.cc +++ b/src/timer_wrap.cc @@ -137,4 +137,4 @@ class TimerWrap : public HandleWrap { } // anonymous namespace } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(timer_wrap, node::TimerWrap::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(timer_wrap, node::TimerWrap::Initialize) diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc index 3315267330afa2..d5b56ca9ba3dd7 100644 --- a/src/tls_wrap.cc +++ b/src/tls_wrap.cc @@ -982,4 +982,4 @@ void TLSWrap::Initialize(Local target, } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(tls_wrap, node::TLSWrap::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(tls_wrap, node::TLSWrap::Initialize) diff --git a/src/tty_wrap.cc b/src/tty_wrap.cc index 872a126c6d4ee4..ae8ff64f70c29a 100644 --- a/src/tty_wrap.cc +++ b/src/tty_wrap.cc @@ -175,4 +175,4 @@ TTYWrap::TTYWrap(Environment* env, } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(tty_wrap, node::TTYWrap::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(tty_wrap, node::TTYWrap::Initialize) diff --git a/src/udp_wrap.cc b/src/udp_wrap.cc index 54f1b610238ff9..73a976057719fa 100644 --- a/src/udp_wrap.cc +++ b/src/udp_wrap.cc @@ -511,4 +511,4 @@ uv_udp_t* UDPWrap::UVHandle() { } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(udp_wrap, node::UDPWrap::Initialize) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(udp_wrap, node::UDPWrap::Initialize) diff --git a/src/uv.cc b/src/uv.cc index fbe61c9b0164d7..6cbba07e59039c 100644 --- a/src/uv.cc +++ b/src/uv.cc @@ -21,6 +21,7 @@ #include "uv.h" #include "node.h" +#include "node_internals.h" #include "env-inl.h" namespace node { @@ -61,4 +62,4 @@ void InitializeUV(Local target, } // anonymous namespace } // namespace node -NODE_MODULE_CONTEXT_AWARE_BUILTIN(uv, node::InitializeUV) +NODE_BUILTIN_MODULE_CONTEXT_AWARE(uv, node::InitializeUV) diff --git a/test/cctest/node_module_reg.cc b/test/cctest/node_module_reg.cc new file mode 100644 index 00000000000000..f8d9d03c1cdb99 --- /dev/null +++ b/test/cctest/node_module_reg.cc @@ -0,0 +1,28 @@ +// Need to create empty definition for these modules' +// registration function for cctest. Because when +// building cctest, the definitions for the following +// registration functions are not included. +void _register_cares_wrap() {} +void _register_config() {} +void _register_contextify() {} +void _register_fs() {} +void _register_fs_event_wrap() {} +void _register_http2() {} +void _register_http_parser() {} +void _register_js_stream() {} +void _register_module_wrap() {} +void _register_os() {} +void _register_pipe_wrap() {} +void _register_process_wrap() {} +void _register_serdes() {} +void _register_signal_wrap() {} +void _register_spawn_sync() {} +void _register_stream_wrap() {} +void _register_tcp_wrap() {} +void _register_timer_wrap() {} +void _register_tty_wrap() {} +void _register_udp_wrap() {} +void _register_util() {} +void _register_uv() {} +void _register_v8() {} +void _register_zlib() {}