@@ -14,13 +14,14 @@ renderer/browser/worker/sandboxed bootstrap scripts). These are loaded
14
14
through LoadEmbedderJavaScriptSource()
15
15
16
16
diff --git a/lib/internal/fs/watchers.js b/lib/internal/fs/watchers.js
17
- indexce885c154c81c5703365fa34957697698da9aff6..229b0d522aeee3632145c86715bea1394d496bc4 100644
17
+ index99212fa713bf3f767d4604906e41d9b279447239..4e32a274a63c8244ce3168d0c5cc56203cfe5473 100644
18
18
--- a/lib/internal/fs/watchers.js
19
19
+++ b/lib/internal/fs/watchers.js
20
- @@ -293,11 +293,13 @@ function emitCloseNT(self) {
20
+ @@ -292,12 +292,13 @@ function emitCloseNT(self) {
21
+ }
21
22
22
23
// Legacy alias on the C++ wrapper object. This is not public API, so we may
23
- // want to runtime-deprecate it at some point. There's no hurry, though.
24
+ - // want to runtime-deprecate it at some point. There's no hurry, though.
24
25
- ObjectDefineProperty(FSEvent.prototype, 'owner', {
25
26
- __proto__: null,
26
27
- get() { return this[owner_symbol]; },
@@ -34,159 +35,212 @@ index ce885c154c81c5703365fa34957697698da9aff6..229b0d522aeee3632145c86715bea139
34
35
+ });
35
36
+ }
36
37
37
- async function* watch(filename, options = kEmptyObject) {
38
- const path = toNamespacedPath(getValidatedPath(filename));
38
+ let kResistStopPropagation;
39
+
39
40
diff --git a/src/node_builtins.cc b/src/node_builtins.cc
40
- index356ec3acd0bf3ac1e7518b32a5a58b042a03f598..4d4b59916bfdb203702c4e878ff2659b79de8c52 100644
41
+ index84815969b6d1faa7cc3ed177e04248d9cb074596..7e4a43a6f13845c8a81bae96ec073ccdfc655999 100644
41
42
--- a/src/node_builtins.cc
42
43
+++ b/src/node_builtins.cc
43
- @@ -33 ,6 +33 ,7 @@ BuiltinLoader BuiltinLoader::instance_ ;
44
-
45
- BuiltinLoader::BuiltinLoader() : config_(GetConfig()),has_code_cache_(false ) {
44
+ @@ -35 ,6 +35 ,7 @@ using v8::Value ;
45
+ BuiltinLoader::BuiltinLoader()
46
+ : config_(GetConfig()),code_cache_(std::make_shared<BuiltinCodeCache>() ) {
46
47
LoadJavaScriptSource();
47
48
+ LoadEmbedderJavaScriptSource();
48
49
#ifdef NODE_SHARED_BUILTIN_CJS_MODULE_LEXER_LEXER_PATH
49
50
AddExternalizedBuiltin(
50
51
"internal/deps/cjs-module-lexer/lexer",
51
52
diff --git a/src/node_builtins.h b/src/node_builtins.h
52
- index90b158b84bb2a66781cf92f5b4c1a64f9e2ee651..8d9f7c409659a30747e5feeac6cfec4208791370 100644
53
+ index9f2fbc1e53937448aa27c1f5fe110eabc7edc0df..ba0c926a7968ec6a4cf07a469f1fd9314287a937 100644
53
54
--- a/src/node_builtins.h
54
55
+++ b/src/node_builtins.h
55
- @@ -71 ,6 +71 ,7 @@ class NODE_EXTERN_PRIVATE BuiltinLoader {
56
+ @@ -124 ,6 +124 ,7 @@ class NODE_EXTERN_PRIVATE BuiltinLoader {
56
57
57
58
// Generated by tools/js2c.py as node_javascript.cc
58
59
void LoadJavaScriptSource(); // Loads data into source_
59
60
+ void LoadEmbedderJavaScriptSource(); // Loads embedder data into source_
60
61
UnionBytes GetConfig(); // Return data for config.gypi
61
62
62
- std::vector<std::string> GetBuiltinIds();
63
- diff --git a/tools/js2c.py b/tools/js2c.py
64
- index 077bba1572f05f1aa16553894703b12abc19a985..bb9f26e3adc863757ad8ede5069d299c2d138369 100755
65
- --- a/tools/js2c.py
66
- +++ b/tools/js2c.py
67
- @@ -39,6 +39,8 @@ import codecs
68
- import utils
69
-
70
- def ReadFile(filename):
71
- + if filename.startswith("//v8"):
72
- + filename = "../../" + filename[2:]
73
- if is_verbose:
74
- print(filename)
75
- with codecs.open(filename, "r", "utf-8") as f:
76
- @@ -57,13 +59,15 @@ namespace builtins {{
77
-
78
- {0}
79
-
80
- - void BuiltinLoader::LoadJavaScriptSource() {{
81
- + void BuiltinLoader::Load{4}JavaScriptSource() {{
82
- {1}
83
- }}
84
-
85
- + #if {2}
86
- UnionBytes BuiltinLoader::GetConfig() {{
87
- - return UnionBytes(config_raw, {2}); // config.gypi
88
- + return UnionBytes(config_raw, {3}); // config.gypi
89
- }}
90
- + #endif
91
-
92
- }} // namespace builtins
93
-
94
- @@ -113,8 +117,8 @@ def GetDefinition(var, source, step=30):
95
- return definition, len(code_points)
96
-
97
-
98
- - def AddModule(filename, definitions, initializers):
99
- - code = ReadFile(filename)
100
- + def AddModule(filename, definitions, initializers, ReadFileFn=ReadFile):
101
- + code = ReadFileFn(filename)
102
- name = NormalizeFileName(filename)
103
- slug = SLUGGER_RE.sub('_', name)
104
- var = slug + '_raw'
105
- @@ -124,7 +128,9 @@ def AddModule(filename, definitions, initializers):
106
- initializers.append(initializer)
107
-
108
- def NormalizeFileName(filename):
109
- - split = filename.split('/')
110
- + if filename.startswith('//v8'):
111
- + filename = "deps/" + filename[2:]
112
- + split = os.path.normpath(filename).split(os.path.sep)
113
- if split[0] == 'deps':
114
- split = ['internal'] + split
115
- else: # `lib/**/*.js` so drop the 'lib' part
116
- @@ -142,23 +148,36 @@ def NormalizeFileName(filename):
117
- return os.path.splitext(filename)[0]
118
-
119
-
120
- - def JS2C(source_files, target):
121
- + def JS2C(source_files, target, only_js):
122
- # Build source code lines
123
- definitions = []
124
- initializers = []
125
-
126
- - for filename in source_files['.js']:
127
- - AddModule(filename, definitions, initializers)
128
- - for filename in source_files['.mjs']:
129
- - AddModule(filename, definitions, initializers)
130
- -
131
- - config_def, config_size = handle_config_gypi(source_files['config.gypi'])
132
- - definitions.append(config_def)
133
- + for extension in source_files.keys():
134
- + if extension == '.js' or extension == '.mjs':
135
- + for filename in source_files[extension]:
136
- + AddModule(filename, definitions, initializers)
63
+ std::vector<std::string_view> GetBuiltinIds() const;
64
+ diff --git a/tools/js2c.cc b/tools/js2c.cc
65
+ index 904fb6fa44d4f56fb67476e937edcbb797d78fe7..28dc4b59898fb5ac02dc55f930613f7a46a8a66e 100644
66
+ --- a/tools/js2c.cc
67
+ +++ b/tools/js2c.cc
68
+ @@ -29,6 +29,7 @@ namespace js2c {
69
+ int Main(int argc, char* argv[]);
70
+
71
+ static bool is_verbose = false;
72
+ + static bool only_js = false;
73
+
74
+ void Debug(const char* format, ...) {
75
+ va_list arguments;
76
+ @@ -213,13 +214,17 @@ void BuiltinLoader::LoadJavaScriptSource() {
77
+ source_ = global_source_map;
78
+ }
79
+
80
+ + void BuiltinLoader::LoadEmbedderJavaScriptSource() {
81
+ + source_ = global_source_map;
82
+ + }
83
+ +
84
+ void RegisterExternalReferencesForInternalizedBuiltinCode(
85
+ ExternalReferenceRegistry* registry) {
86
+ %.*s
87
+ }
88
+
89
+ UnionBytes BuiltinLoader::GetConfig() {
90
+ - return UnionBytes(&config_resource);
91
+ + return config_resource ? UnionBytes(&config_resource) : UnionBytes(nullptr);
92
+ }
93
+
94
+ } // namespace builtins
95
+ @@ -254,10 +259,14 @@ Fragment Format(const Fragments& definitions,
96
+ }
97
+
98
+ std::vector<char> ReadFileSync(const char* path, size_t size, int* error) {
99
+ + std::string filepath(path);
100
+ + if (filepath.starts_with("//v8"))
101
+ + filepath = "../../" + filepath.substr(2);
102
+ +
103
+ uv_fs_t req;
104
+ - Debug("ReadFileSync %s with size %zu\n", path, size);
105
+ + Debug("ReadFileSync %s with size %zu\n", filepath.c_str(), size);
106
+
107
+ - uv_file file = uv_fs_open(nullptr, &req, path, O_RDONLY, 0, nullptr);
108
+ + uv_file file = uv_fs_open(nullptr, &req, filepath.c_str(), O_RDONLY, 0, nullptr);
109
+ if (req.result < 0) {
110
+ uv_fs_req_cleanup(&req);
111
+ *error = req.result;
112
+ @@ -536,7 +545,8 @@ Fragment GetDefinition(const std::string& var, const std::vector<char>& code) {
113
+ int AddModule(const std::string& filename,
114
+ Fragments* definitions,
115
+ Fragments* initializers,
116
+ - Fragments* registrations) {
117
+ + Fragments* registrations,
118
+ + std::function<std::vector<char>(const std::vector<char>&)> read_file_fn = ReadFileSync) {
119
+ Debug("AddModule %s start\n", filename.c_str());
120
+
121
+ int error = 0;
122
+ @@ -544,7 +554,7 @@ int AddModule(const std::string& filename,
123
+ if (error != 0) {
124
+ return error;
125
+ }
126
+ - std::vector<char> code = ReadFileSync(filename.c_str(), file_size, &error);
127
+ + std::vector<char> code = read_file_fn(filename.c_str(), file_size, &error);
128
+ if (error != 0) {
129
+ return error;
130
+ }
131
+ @@ -703,6 +713,39 @@ int JS2C(const FileList& js_files,
132
+ if (r != 0) {
133
+ return r;
134
+ }
137
135
+
138
- + # Electron: Expose fs module without asar support.
139
- + if filename == 'lib/fs.js':
140
- + # Node's 'fs' and 'internal/fs/<filename> have lazy-loaded circular
141
- + # dependencies. So to expose the unmodified Node 'fs' functionality here,
142
- + # we have to copy both 'fs' *and* 'internal/fs/<filename>' files and modify the
143
- + # copies to depend on each other instead of on our asarified 'fs' code.
144
- + AddModule('lib/original-fs.js', definitions, initializers, lambda _: ReadFile(filename).replace("require('internal/fs/", "require('internal/original-fs/"))
145
- + elif filename.startswith('lib/internal/fs/'):
146
- + original_fs_filename = filename.replace('internal/fs/', 'internal/original-fs/')
147
- + AddModule(original_fs_filename, definitions, initializers, lambda _: ReadFile(filename).replace("require('fs')", "require('original-fs')"))
136
+ + // Electron: Expose fs module without asar support.
137
+ + if (filename == "lib/fs.js") {
138
+ + int error = 0;
139
+ + size_t size = GetFileSize(filename, &error);
140
+ + if (error != 0 && error != UV_ENOENT)
141
+ + return error;
148
142
+
149
- + config_size = 0
150
- + if not only_js:
151
- + config_def, config_size = handle_config_gypi(source_files['config.gypi'])
152
- + definitions.append(config_def)
153
-
154
- # Emit result
155
- definitions = ''.join(definitions)
156
- initializers = '\n '.join(initializers)
157
- - out = TEMPLATE.format(definitions, initializers, config_size)
158
- + out = TEMPLATE.format(definitions, initializers, '0' if only_js else '1', config_size, 'Embedder' if only_js else '')
159
- write_if_chaged(out, target)
160
-
161
-
162
- @@ -222,6 +241,7 @@ def main():
163
- default=None,
164
- help='root directory containing the sources')
165
- parser.add_argument('--verbose', action='store_true', help='output file')
166
- + parser.add_argument('--only-js', action='store_true', help='do not require or parse any config.gypi files')
167
- parser.add_argument('sources', nargs='*', help='input files')
168
- options = parser.parse_args()
169
- global is_verbose
170
- @@ -238,13 +258,15 @@ def main():
171
-
172
- source_files = functools.reduce(SourceFileByExt, sources, {})
173
-
174
- - # Should have exactly 3 types: `.js`, `.mjs` and `.gypi`
175
- - assert len(source_files) == 3
176
- - # Currently config.gypi is the only `.gypi` file allowed
177
- - assert len(source_files['.gypi']) == 1
178
- - assert os.path.basename(source_files['.gypi'][0]) == 'config.gypi'
179
- - source_files['config.gypi'] = source_files.pop('.gypi')[0]
180
- - JS2C(source_files, options.target)
181
- + if options.only_js:
182
- + assert len(source_files) == 1
183
- + else:
184
- + # Should have exactly 3 types: `.js`, `.mjs` and `.gypi`
185
- + assert len(source_files) == 3
186
- + # Currently config.gypi is the only `.gypi` file allowed
187
- + assert source_files['.gypi'][0].endswith('config.gypi')
188
- + source_files['config.gypi'] = source_files.pop('.gypi')[0]
189
- + JS2C(source_files, options.target, options.only_js)
190
-
191
-
192
- if __name__ == "__main__":
143
+ + std::function<std::vector<char>(const std::vector<char>&)> ReadFileTransform = [](const char* path, size_t size, int* error) {
144
+ + std::vector<char> code = ReadFileSync(path, size, &error);
145
+ + std::replace(code.begin(), code.end(), "require('internal/fs/", "require('internal/original-fs/");
146
+ + return code;
147
+ + };
148
+ + int r = AddModule("lib/original-fs.js", definitions, initializers, ReadFileTransform)
149
+ + if (r != 0) {
150
+ + return r;
151
+ + }
152
+ + } else if (filename.rfind("lib/internal/fs/")) {
153
+ + // std::equal(prefix.begin(), prefix.end(), toCheck.begin())?
154
+ + std::string original_fs_filename = filename;
155
+ + std::replace(original_fs_filename.begin(), original_fs_filename.end(), "internal/fs/", "internal/original-fs/");
156
+ +
157
+ + std::function<std::vector<char>(const std::vector<char>&)> ReadFileTransform = [](const char* path, size_t size, int* error) {
158
+ + std::vector<char> code = ReadFileSync(path, size, &error);
159
+ + std::replace(code.begin(), code.end(), "require('fs')", "require('original-fs')");
160
+ + return code;
161
+ + };
162
+ +
163
+ + int r = AddModule(original_fs_filename, definitions, initializers, ReadFileTransform)
164
+ + if (r != 0) {
165
+ + return r;
166
+ + }
167
+ + }
168
+ }
169
+ for (const auto& filename : mjs_files) {
170
+ int r = AddModule(filename, &definitions, &initializers, ®istrations);
171
+ @@ -711,12 +754,15 @@ int JS2C(const FileList& js_files,
172
+ }
173
+ }
174
+
175
+ - assert(FilenameIsConfigGypi(config));
176
+ - // "config.gypi" -> config_raw.
177
+ - int r = AddGypi("config", config, &definitions);
178
+ - if (r != 0) {
179
+ - return r;
180
+ + if (!only_js) {
181
+ + assert(FilenameIsConfigGypi(config));
182
+ + // "config.gypi" -> config_raw.
183
+ + int r = AddGypi("config", config, &definitions);
184
+ + if (r != 0) {
185
+ + return r;
186
+ + }
187
+ }
188
+ +
189
+ Fragment out = Format(definitions, initializers, registrations);
190
+ return WriteIfChanged(out, dest);
191
+ }
192
+ @@ -742,6 +788,8 @@ int Main(int argc, char* argv[]) {
193
+ std::string arg(argv[i]);
194
+ if (arg == "--verbose") {
195
+ is_verbose = true;
196
+ + } else if (arg == "--only-js") {
197
+ + only_js = true;
198
+ } else if (arg == "--root") {
199
+ if (i == argc - 1) {
200
+ fprintf(stderr, "--root must be followed by a path\n");
201
+ @@ -790,23 +838,30 @@ int Main(int argc, char* argv[]) {
202
+ }
203
+ }
204
+
205
+ - // Should have exactly 3 types: `.js`, `.mjs` and `.gypi`.
206
+ - assert(file_map.size() == 3);
207
+ - auto gypi_it = file_map.find(".gypi");
208
+ - // Currently config.gypi is the only `.gypi` file allowed
209
+ - if (gypi_it == file_map.end() || gypi_it->second.size() != 1 ||
210
+ - !FilenameIsConfigGypi(gypi_it->second[0])) {
211
+ - fprintf(
212
+ - stderr,
213
+ - "Arguments should contain one and only one .gypi file: config.gypi\n");
214
+ - return 1;
215
+ - }
216
+ auto js_it = file_map.find(".js");
217
+ auto mjs_it = file_map.find(".mjs");
218
+ - assert(js_it != file_map.end() && mjs_it != file_map.end());
219
+ + auto gypi_it = file_map.find(".gypi");
220
+
221
+ - std::sort(js_it->second.begin(), js_it->second.end());
222
+ - std::sort(mjs_it->second.begin(), mjs_it->second.end());
223
+ + if (only_js) {
224
+ + assert(file_map.size() == 1);
225
+ + assert(js_it != file_map.end());
226
+ + } else {
227
+ + // Should have exactly 3 types: `.js`, `.mjs` and `.gypi`.
228
+ + assert(file_map.size() == 3);
229
+ + assert(js_it != file_map.end() && mjs_it != file_map.end());
230
+ +
231
+ + std::sort(js_it->second.begin(), js_it->second.end());
232
+ + std::sort(mjs_it->second.begin(), mjs_it->second.end());
233
+ +
234
+ + // Currently config.gypi is the only `.gypi` file allowed
235
+ + if (gypi_it == file_map.end() || gypi_it->second.size() != 1 ||
236
+ + !FilenameIsConfigGypi(gypi_it->second[0])) {
237
+ + fprintf(
238
+ + stderr,
239
+ + "Arguments should contain one and only one .gypi file: config.gypi\n");
240
+ + return 1;
241
+ + }
242
+ + }
243
+
244
+ return JS2C(js_it->second, mjs_it->second, gypi_it->second[0], output);
245
+ }
246
+