Skip to content

Commit

Permalink
windows: fix module registration
Browse files Browse the repository at this point in the history
The linker was optimizing the static variables that were supposed
to trigger module initialization.

I am making them non-static, and dllexport so that they don't get
optimized away.

Fixes nodejs#7116
  • Loading branch information
orangemocha authored and tjfontaine committed Feb 25, 2014
1 parent 2ca4d9d commit b5f9779
Showing 1 changed file with 11 additions and 11 deletions.
22 changes: 11 additions & 11 deletions src/node.h
Original file line number Diff line number Diff line change
Expand Up @@ -332,15 +332,16 @@ extern "C" NODE_EXTERN void node_module_register(void* mod);
#pragma section(".CRT$XCU", read)
#define NODE_C_CTOR(fn) \
static void __cdecl fn(void); \
__declspec(allocate(".CRT$XCU")) static void (__cdecl*fn ## _)(void) = fn; \
__declspec(dllexport, allocate(".CRT$XCU")) \
void (__cdecl*fn ## _)(void) = fn; \
static void __cdecl fn(void)
#else
#define NODE_C_CTOR(fn) \
static void fn(void) __attribute__((constructor)); \
static void fn(void)
#endif

#define NODE_MODULE_X(modstr, regfunc, priv, flags) \
#define NODE_MODULE_X(modname, regfunc, priv, flags) \
extern "C" { \
static node::node_module _module = \
{ \
Expand All @@ -350,16 +351,16 @@ extern "C" NODE_EXTERN void node_module_register(void* mod);
__FILE__, \
(node::addon_register_func) (regfunc), \
NULL, \
modstr, \
NODE_STRINGIFY(modname), \
priv, \
NULL \
}; \
NODE_C_CTOR(_register) { \
NODE_C_CTOR(_register_ ## modname) { \
node_module_register(&_module); \
} \
}

#define NODE_MODULE_CONTEXT_AWARE_X(modstr, regfunc, priv, flags) \
#define NODE_MODULE_CONTEXT_AWARE_X(modname, regfunc, priv, flags) \
extern "C" { \
static node::node_module _module = \
{ \
Expand All @@ -369,24 +370,23 @@ extern "C" NODE_EXTERN void node_module_register(void* mod);
__FILE__, \
NULL, \
(node::addon_context_register_func) (regfunc), \
modstr, \
NODE_STRINGIFY(modname), \
priv, \
NULL \
}; \
NODE_C_CTOR(_register) { \
NODE_C_CTOR(_register_ ## modname) { \
node_module_register(&_module); \
} \
}

#define NODE_MODULE(modname, regfunc) \
NODE_MODULE_X(NODE_STRINGIFY(modname), regfunc, NULL, 0)
NODE_MODULE_X(modname, regfunc, NULL, 0)

#define NODE_MODULE_CONTEXT_AWARE(modname, regfunc) \
NODE_MODULE_CONTEXT_AWARE_X(NODE_STRINGIFY(modname), regfunc, NULL, 0)
NODE_MODULE_CONTEXT_AWARE_X(modname, regfunc, NULL, 0)

#define NODE_MODULE_CONTEXT_AWARE_BUILTIN(modname, regfunc) \
NODE_MODULE_CONTEXT_AWARE_X(NODE_STRINGIFY(modname), \
regfunc, NULL, NM_F_BUILTIN)
NODE_MODULE_CONTEXT_AWARE_X(modname, regfunc, NULL, NM_F_BUILTIN) \

/*
* For backward compatibility in add-on modules.
Expand Down

0 comments on commit b5f9779

Please sign in to comment.