Skip to content

Commit 699fb9a

Browse files
committed
REVIEW: Explicitly register builtin modules
nodejs/node#16565
1 parent 43004be commit 699fb9a

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 atom {
6871

@@ -96,6 +99,12 @@ base::FilePath GetResourcesPath(bool is_browser) {
9699
return resources_path;
97100
}
98101

102+
void RegisterBuiltinModules() {
103+
#define V(modname) _register_##modname();
104+
ELECTRON_BUILTIN_MODULES(V)
105+
#undef V
106+
}
107+
99108
} // namespace
100109

101110
NodeBindings::NodeBindings(BrowserEnvironment browser_env)
@@ -139,6 +148,9 @@ void NodeBindings::Initialize() {
139148
// (we assume node::Init would not modify the parameters under embedded mode).
140149
node::Init(nullptr, nullptr, nullptr, nullptr);
141150

151+
// Explicitly register electron's builtin modules.
152+
RegisterBuiltinModules();
153+
142154
#if defined(OS_WIN)
143155
// uv_init overrides error mode to suppress the default crash dialog, bring
144156
// it back if user wants to show it.

0 commit comments

Comments
 (0)