-
Notifications
You must be signed in to change notification settings - Fork 15k
/
feat_add_flags_for_low-level_hooks_and_exceptions.patch
112 lines (95 loc) · 3.9 KB
/
feat_add_flags_for_low-level_hooks_and_exceptions.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Shelley Vohr <shelley.vohr@gmail.com>
Date: Thu, 13 Sep 2018 08:42:22 -0700
Subject: feat: add flags for low-level hooks and exceptions
This commit adds two new exposed methods to `node.cc`, `InitGeneric` and
`LoadEnvironmentGeneric` that allow for control of which mode Node
should run, which i have called `standalone_mode` and
`upstream_node_mode`. Default behavior of `Init` and `LoadEnvironment`
remain the same.
We have 3 modes when running Node in Electron:
1. In the main process, we want to have a full Node environment, but
with signal handlers and other low level things disabled
2. In renderer process, we want Node to reuse the web page's context
3. In `ELECTRON_RUN_AS_NODE`, we want Node to run as it runs officially
by default
For modes 1 and 3, we have Node create a new V8 context with a Node
Environment on it. However, for mode 2, since the V8 context is created
by blink for web frames and web workers we make Node create the Node
Environment on the V8 context of blink, so no new V8 context is created.
As a result, a renderer process may have multiple Node Environments in it.
diff --git a/src/env.cc b/src/env.cc
index 5b8a63a0017c4f9eed50afacb8de0b7f659f81b6..3974e6c7ebe74004a7a9e4dc2966fd8651c1522f 100644
--- a/src/env.cc
+++ b/src/env.cc
@@ -410,6 +410,12 @@ Environment::Environment(IsolateData* isolate_data,
// TODO(joyeecheung): deserialize when the snapshot covers the environment
// properties.
CreateProperties();
+
+ // TODO(addaleax): the per-isolate state should not be controlled by
+ // a single Environment.
+ if (g_standalone_mode) {
+ isolate()->SetPromiseRejectCallback(task_queue::PromiseRejectCallback);
+ }
}
Environment::~Environment() {
diff --git a/src/node.cc b/src/node.cc
index da6aebf7178cf6d61ac46088bd50270b335e0b9e..f46db766de54f59d5baae28b16cd04ce9f20042c 100644
--- a/src/node.cc
+++ b/src/node.cc
@@ -124,6 +124,9 @@ using v8::Undefined;
using v8::V8;
using v8::Value;
+bool g_standalone_mode = true;
+bool g_upstream_node_mode = true;
+
namespace per_process {
// node_revert.h
@@ -339,6 +342,13 @@ MaybeLocal<Value> Environment::RunBootstrapping() {
CHECK(!has_run_bootstrapping_code());
+ if (g_standalone_mode) {
+ isolate()->AddMessageListener(errors::PerIsolateMessageListener);
+ }
+ if (g_upstream_node_mode) {
+ isolate()->SetFatalErrorHandler(OnFatalError);
+ }
+
if (BootstrapInternalLoaders().IsEmpty()) {
return MaybeLocal<Value>();
}
@@ -735,7 +745,9 @@ int InitializeNodeWithArgs(std::vector<std::string>* argv,
binding::RegisterBuiltinModules();
// Make inherited handles noninheritable.
- uv_disable_stdio_inheritance();
+ if (g_upstream_node_mode) {
+ uv_disable_stdio_inheritance();
+ }
// Cache the original command line to be
// used in diagnostic reports.
@@ -769,6 +781,8 @@ int InitializeNodeWithArgs(std::vector<std::string>* argv,
if (exit_code != 0) return exit_code;
}
#endif
+ if (g_upstream_node_mode) {
+ // NOTE(jeremy): indentation is intentionally wrong here, to ease rebasing.
const int exit_code = ProcessGlobalArgs(argv,
exec_argv,
@@ -813,6 +827,7 @@ int InitializeNodeWithArgs(std::vector<std::string>* argv,
}
per_process::metadata.versions.InitializeIntlVersions();
#endif
+ } // g_upstream_node_mode
NativeModuleEnv::InitializeCodeCache();
diff --git a/src/node.h b/src/node.h
index 886216e2cb533e7337bc4f6816e2de796f64f81e..19d5eff164a543a38b4c77f99c2f15c30a226f77 100644
--- a/src/node.h
+++ b/src/node.h
@@ -211,6 +211,9 @@ namespace node {
class IsolateData;
class Environment;
+// Whether node should open some low level hooks.
+NODE_EXTERN extern bool g_standalone_mode;
+NODE_EXTERN extern bool g_upstream_node_mode;
// TODO(addaleax): Officially deprecate this and replace it with something
// better suited for a public embedder API.