Skip to content

Commit 13577c6

Browse files
deepak1556codebytere
authored andcommitted
REVIEW: Explicitly register builtin modules
nodejs/node#16565
1 parent b430e61 commit 13577c6

1 file changed

Lines changed: 50 additions & 38 deletions

File tree

atom/common/node_bindings.cc

Lines changed: 50 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -25,44 +25,47 @@
2525

2626
#include "atom/common/node_includes.h"
2727

28-
// Force all builtin modules to be referenced so they can actually run their
29-
// DSO constructors, see http://git.io/DRIqCg.
30-
#define REFERENCE_MODULE(name) \
31-
extern "C" void _register_ ## name(void); \
32-
void (*fp_register_ ## name)(void) = _register_ ## name
33-
// Electron's builtin modules.
34-
REFERENCE_MODULE(atom_browser_app);
35-
REFERENCE_MODULE(atom_browser_auto_updater);
36-
REFERENCE_MODULE(atom_browser_browser_view);
37-
REFERENCE_MODULE(atom_browser_content_tracing);
38-
REFERENCE_MODULE(atom_browser_debugger);
39-
REFERENCE_MODULE(atom_browser_desktop_capturer);
40-
REFERENCE_MODULE(atom_browser_dialog);
41-
REFERENCE_MODULE(atom_browser_download_item);
42-
REFERENCE_MODULE(atom_browser_global_shortcut);
43-
REFERENCE_MODULE(atom_browser_menu);
44-
REFERENCE_MODULE(atom_browser_net);
45-
REFERENCE_MODULE(atom_browser_power_monitor);
46-
REFERENCE_MODULE(atom_browser_power_save_blocker);
47-
REFERENCE_MODULE(atom_browser_protocol);
48-
REFERENCE_MODULE(atom_browser_render_process_preferences);
49-
REFERENCE_MODULE(atom_browser_session);
50-
REFERENCE_MODULE(atom_browser_system_preferences);
51-
REFERENCE_MODULE(atom_browser_tray);
52-
REFERENCE_MODULE(atom_browser_web_contents);
53-
REFERENCE_MODULE(atom_browser_web_view_manager);
54-
REFERENCE_MODULE(atom_browser_window);
55-
REFERENCE_MODULE(atom_common_asar);
56-
REFERENCE_MODULE(atom_common_clipboard);
57-
REFERENCE_MODULE(atom_common_crash_reporter);
58-
REFERENCE_MODULE(atom_common_native_image);
59-
REFERENCE_MODULE(atom_common_notification);
60-
REFERENCE_MODULE(atom_common_screen);
61-
REFERENCE_MODULE(atom_common_shell);
62-
REFERENCE_MODULE(atom_common_v8_util);
63-
REFERENCE_MODULE(atom_renderer_ipc);
64-
REFERENCE_MODULE(atom_renderer_web_frame);
65-
#undef REFERENCE_MODULE
28+
#define ELECTRON_BUILTIN_MODULES(V) \
29+
V(atom_browser_app) \
30+
V(atom_browser_auto_updater) \
31+
V(atom_browser_browser_view) \
32+
V(atom_browser_content_tracing) \
33+
V(atom_browser_debugger) \
34+
V(atom_browser_desktop_capturer) \
35+
V(atom_browser_dialog) \
36+
V(atom_browser_download_item) \
37+
V(atom_browser_global_shortcut) \
38+
V(atom_browser_menu) \
39+
V(atom_browser_net) \
40+
V(atom_browser_power_monitor) \
41+
V(atom_browser_power_save_blocker) \
42+
V(atom_browser_protocol) \
43+
V(atom_browser_render_process_preferences) \
44+
V(atom_browser_session) \
45+
V(atom_browser_system_preferences) \
46+
V(atom_browser_tray) \
47+
V(atom_browser_web_contents) \
48+
V(atom_browser_web_view_manager) \
49+
V(atom_browser_window) \
50+
V(atom_common_asar) \
51+
V(atom_common_clipboard) \
52+
V(atom_common_crash_reporter) \
53+
V(atom_common_native_image) \
54+
V(atom_common_notification) \
55+
V(atom_common_screen) \
56+
V(atom_common_shell) \
57+
V(atom_common_v8_util) \
58+
V(atom_renderer_ipc) \
59+
V(atom_renderer_web_frame)
60+
61+
// This is used to load built-in modules. Instead of using
62+
// __attribute__((constructor)), we call the _register_<modname>
63+
// function for each built-in modules explicitly. This is only
64+
// forward declaration. The definitions are in each module's
65+
// implementation when calling the NODE_BUILTIN_MODULE_CONTEXT_AWARE.
66+
#define V(modname) void _register_##modname();
67+
ELECTRON_BUILTIN_MODULES(V)
68+
#undef V
6669

6770
namespace {
6871

@@ -119,6 +122,12 @@ base::FilePath GetResourcesPath(bool is_browser) {
119122
return resources_path;
120123
}
121124

125+
void RegisterBuiltinModules() {
126+
#define V(modname) _register_##modname();
127+
ELECTRON_BUILTIN_MODULES(V)
128+
#undef V
129+
}
130+
122131
} // namespace
123132

124133
NodeBindings::NodeBindings(BrowserEnvironment browser_env)
@@ -167,6 +176,9 @@ void NodeBindings::Initialize() {
167176
// (we assume node::Init would not modify the parameters under embedded mode).
168177
node::Init(nullptr, nullptr, nullptr, nullptr);
169178

179+
// Explicitly register electron's builtin modules.
180+
RegisterBuiltinModules();
181+
170182
#if defined(OS_WIN)
171183
// uv_init overrides error mode to suppress the default crash dialog, bring
172184
// it back if user wants to show it.

0 commit comments

Comments
 (0)