Skip to content

Commit 7effda9

Browse files
vmorozRafaelGSS
authored andcommitted
node-api: deprecate napi_module_register
PR-URL: #46319 Reviewed-By: Chengzhong Wu <[email protected]> Reviewed-By: Michael Dawson <[email protected]>
1 parent 9a12e0d commit 7effda9

File tree

5 files changed

+254
-155
lines changed

5 files changed

+254
-155
lines changed

src/api/environment.cc

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,9 @@ void AddLinkedBinding(Environment* env, const node_module& mod) {
865865
}
866866

867867
void AddLinkedBinding(Environment* env, const napi_module& mod) {
868-
AddLinkedBinding(env, napi_module_to_node_module(&mod));
868+
node_module node_mod = napi_module_to_node_module(&mod);
869+
node_mod.nm_flags = NM_F_LINKED;
870+
AddLinkedBinding(env, node_mod);
869871
}
870872

871873
void AddLinkedBinding(Environment* env,
@@ -886,6 +888,32 @@ void AddLinkedBinding(Environment* env,
886888
AddLinkedBinding(env, mod);
887889
}
888890

891+
void AddLinkedBinding(Environment* env,
892+
const char* name,
893+
napi_addon_register_func fn) {
894+
node_module mod = {
895+
-1,
896+
NM_F_LINKED,
897+
nullptr, // nm_dso_handle
898+
nullptr, // nm_filename
899+
nullptr, // nm_register_func
900+
[](v8::Local<v8::Object> exports,
901+
v8::Local<v8::Value> module,
902+
v8::Local<v8::Context> context,
903+
void* priv) {
904+
napi_module_register_by_symbol(
905+
exports,
906+
module,
907+
context,
908+
reinterpret_cast<napi_addon_register_func>(priv));
909+
},
910+
name,
911+
reinterpret_cast<void*>(fn),
912+
nullptr // nm_link
913+
};
914+
AddLinkedBinding(env, mod);
915+
}
916+
889917
static std::atomic<uint64_t> next_thread_id{0};
890918

891919
ThreadId AllocateEnvironmentThreadId() {

src/node.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@
7575
#include "v8-platform.h" // NOLINT(build/include_order)
7676
#include "node_version.h" // NODE_MODULE_VERSION
7777

78+
#define NAPI_EXPERIMENTAL
79+
#include "node_api.h"
80+
7881
#include <functional>
7982
#include <memory>
8083
#include <ostream>
@@ -121,8 +124,6 @@
121124
// Forward-declare libuv loop
122125
struct uv_loop_s;
123126

124-
struct napi_module;
125-
126127
// Forward-declare these functions now to stop MSVS from becoming
127128
// terminally confused when it's done in node_internals.h
128129
namespace node {
@@ -1252,6 +1253,9 @@ NODE_EXTERN void AddLinkedBinding(Environment* env,
12521253
const char* name,
12531254
addon_context_register_func fn,
12541255
void* priv);
1256+
NODE_EXTERN void AddLinkedBinding(Environment* env,
1257+
const char* name,
1258+
napi_addon_register_func fn);
12551259

12561260
/* Registers a callback with the passed-in Environment instance. The callback
12571261
* is called after the event loop exits, but before the VM is disposed.

src/node_api.h

Lines changed: 17 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ struct uv_loop_s; // Forward declaration.
3131
typedef 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.
3435
typedef struct napi_module {
3536
int nm_version;
3637
unsigned int nm_flags;
@@ -43,70 +44,15 @@ typedef struct napi_module {
4344

4445
#define NAPI_MODULE_VERSION 1
4546

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-
9047
#define NAPI_MODULE_INITIALIZER_X(base, version) \
9148
NAPI_MODULE_INITIALIZER_X_HELPER(base, version)
9249
#define NAPI_MODULE_INITIALIZER_X_HELPER(base, version) base##version
9350

9451
#ifdef __wasm32__
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
52+
#define NAPI_MODULE_INITIALIZER_BASE napi_register_wasm_v
10453
#else
105-
#define NAPI_MODULE(modname, regfunc) \
106-
NAPI_MODULE_X(modname, regfunc, NULL, 0) // NOLINT (readability/null_usage)
107-
#endif
108-
10954
#define NAPI_MODULE_INITIALIZER_BASE napi_register_module_v
55+
#endif
11056

11157
#define NAPI_MODULE_INITIALIZER \
11258
NAPI_MODULE_INITIALIZER_X(NAPI_MODULE_INITIALIZER_BASE, NAPI_MODULE_VERSION)
@@ -116,12 +62,24 @@ typedef struct napi_module {
11662
NAPI_MODULE_EXPORT napi_value NAPI_MODULE_INITIALIZER(napi_env env, \
11763
napi_value exports); \
11864
EXTERN_C_END \
119-
NAPI_MODULE(NODE_GYP_MODULE_NAME, NAPI_MODULE_INITIALIZER) \
12065
napi_value NAPI_MODULE_INITIALIZER(napi_env env, napi_value exports)
12166

67+
#define NAPI_MODULE(modname, regfunc) \
68+
NAPI_MODULE_INIT() { return regfunc(env, exports); }
69+
70+
// Deprecated. Use NAPI_MODULE.
71+
#define NAPI_MODULE_X(modname, regfunc, priv, flags) \
72+
NAPI_MODULE(modname, regfunc)
73+
12274
EXTERN_C_START
12375

124-
NAPI_EXTERN void NAPI_CDECL napi_module_register(napi_module* mod);
76+
// Deprecated. Replaced by symbol-based registration defined by NAPI_MODULE
77+
// and NAPI_MODULE_INIT macros.
78+
#if defined(__cplusplus) && __cplusplus >= 201402L
79+
[[deprecated]]
80+
#endif
81+
NAPI_EXTERN void NAPI_CDECL
82+
napi_module_register(napi_module* mod);
12583

12684
NAPI_EXTERN NAPI_NO_RETURN void NAPI_CDECL
12785
napi_fatal_error(const char* location,

0 commit comments

Comments
 (0)