@@ -31,7 +31,6 @@ struct uv_loop_s; // Forward declaration.
3131typedef napi_value (NAPI_CDECL * napi_addon_register_func )(napi_env env ,
3232 napi_value exports );
3333
34- // Used by deprecated registration method napi_module_register.
3534typedef struct napi_module {
3635 int nm_version ;
3736 unsigned int nm_flags ;
@@ -44,16 +43,68 @@ typedef struct napi_module {
4443
4544#define NAPI_MODULE_VERSION 1
4645
46+ #if defined(_MSC_VER )
47+ #if defined(__cplusplus )
48+ #define NAPI_C_CTOR (fn ) \
49+ static void NAPI_CDECL fn(void); \
50+ namespace { \
51+ struct fn##_ { \
52+ fn##_() { fn(); } \
53+ } fn##_v_; \
54+ } \
55+ static void NAPI_CDECL fn(void)
56+ #else // !defined(__cplusplus)
57+ #pragma section(".CRT$XCU", read)
58+ // The NAPI_C_CTOR macro defines a function fn that is called during CRT
59+ // initialization.
60+ // C does not support dynamic initialization of static variables and this code
61+ // simulates C++ behavior. Exporting the function pointer prevents it from being
62+ // optimized. See for details:
63+ // https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-initialization?view=msvc-170
64+ #define NAPI_C_CTOR (fn ) \
65+ static void NAPI_CDECL fn(void); \
66+ __declspec(dllexport, allocate(".CRT$XCU")) void(NAPI_CDECL * fn##_)(void) = \
67+ fn; \
68+ static void NAPI_CDECL fn(void)
69+ #endif // defined(__cplusplus)
70+ #else
71+ #define NAPI_C_CTOR (fn ) \
72+ static void fn(void) __attribute__((constructor)); \
73+ static void fn(void)
74+ #endif
75+
76+ #define NAPI_MODULE_X (modname , regfunc , priv , flags ) \
77+ EXTERN_C_START \
78+ static napi_module _module = { \
79+ NAPI_MODULE_VERSION, \
80+ flags, \
81+ __FILE__, \
82+ regfunc, \
83+ #modname, \
84+ priv, \
85+ {0}, \
86+ }; \
87+ NAPI_C_CTOR(_register_##modname) { napi_module_register(&_module); } \
88+ EXTERN_C_END
89+
4790#define NAPI_MODULE_INITIALIZER_X (base , version ) \
4891 NAPI_MODULE_INITIALIZER_X_HELPER(base, version)
4992#define NAPI_MODULE_INITIALIZER_X_HELPER (base , version ) base##version
5093
5194#ifdef __wasm32__
52- #define NAPI_MODULE_INITIALIZER_BASE napi_register_wasm_v
53- #else
54- #define NAPI_MODULE_INITIALIZER_BASE napi_register_module_v
95+ #define NAPI_WASM_INITIALIZER \
96+ NAPI_MODULE_INITIALIZER_X(napi_register_wasm_v, NAPI_MODULE_VERSION)
97+ #define NAPI_MODULE (modname , regfunc ) \
98+ EXTERN_C_START \
99+ NAPI_MODULE_EXPORT napi_value NAPI_WASM_INITIALIZER(napi_env env, \
100+ napi_value exports) { \
101+ return regfunc(env, exports); \
102+ } \
103+ EXTERN_C_END
55104#endif
56105
106+ #define NAPI_MODULE_INITIALIZER_BASE napi_register_module_v
107+
57108#define NAPI_MODULE_INITIALIZER \
58109 NAPI_MODULE_INITIALIZER_X(NAPI_MODULE_INITIALIZER_BASE, NAPI_MODULE_VERSION)
59110
@@ -64,13 +115,13 @@ typedef struct napi_module {
64115 EXTERN_C_END \
65116 napi_value NAPI_MODULE_INITIALIZER(napi_env env, napi_value exports)
66117
118+ #ifndef __wasm32__
67119#define NAPI_MODULE (modname , regfunc ) \
68120 NAPI_MODULE_INIT() { return regfunc(env, exports); }
121+ #endif
69122
70123EXTERN_C_START
71124
72- // Deprecated. Replaced by symbol-based registration defined by NAPI_MODULE
73- // and NAPI_MODULE_INIT macros.
74125NAPI_EXTERN void NAPI_CDECL napi_module_register (napi_module * mod );
75126
76127NAPI_EXTERN NAPI_NO_RETURN void NAPI_CDECL
0 commit comments