Skip to content

Commit 3da36d0

Browse files
committed
lib: create primordials in every context
This allows us to use primordials in other per-context scripts. PR-URL: #27171 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent dfd7e99 commit 3da36d0

File tree

4 files changed

+28
-28
lines changed

4 files changed

+28
-28
lines changed
File renamed without changes.

node.gyp

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626
'node_lib_target_name%': 'node_lib',
2727
'node_intermediate_lib_type%': 'static_library',
2828
'library_files': [
29-
'lib/internal/bootstrap/primordials.js',
3029
'lib/internal/bootstrap/environment.js',
3130
'lib/internal/bootstrap/loaders.js',
3231
'lib/internal/bootstrap/node.js',
3332
'lib/internal/bootstrap/pre_execution.js',
33+
'lib/internal/per_context/primordials.js',
3434
'lib/internal/per_context/setup.js',
3535
'lib/internal/per_context/domexception.js',
3636
'lib/async_hooks.js',

src/api/environment.cc

+17-11
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ using v8::Local;
2323
using v8::MaybeLocal;
2424
using v8::Message;
2525
using v8::MicrotasksPolicy;
26+
using v8::Null;
2627
using v8::Object;
2728
using v8::ObjectTemplate;
2829
using v8::Private;
@@ -332,24 +333,29 @@ Local<Context> NewContext(Isolate* isolate,
332333
// Run per-context JS files.
333334
Context::Scope context_scope(context);
334335
Local<Object> exports;
335-
if (!GetPerContextExports(context).ToLocal(&exports))
336-
return Local<Context>();
337336

337+
Local<String> primordials_string =
338+
FIXED_ONE_BYTE_STRING(isolate, "primordials");
338339
Local<String> global_string = FIXED_ONE_BYTE_STRING(isolate, "global");
339340
Local<String> exports_string = FIXED_ONE_BYTE_STRING(isolate, "exports");
340341

341-
static const char* context_files[] = {
342-
"internal/per_context/setup",
343-
"internal/per_context/domexception",
344-
nullptr
345-
};
342+
// Create primordials first and make it available to per-context scripts.
343+
Local<Object> primordials = Object::New(isolate);
344+
if (!primordials->SetPrototype(context, Null(isolate)).FromJust() ||
345+
!GetPerContextExports(context).ToLocal(&exports) ||
346+
!exports->Set(context, primordials_string, primordials).FromJust()) {
347+
return Local<Context>();
348+
}
349+
350+
static const char* context_files[] = {"internal/per_context/primordials",
351+
"internal/per_context/setup",
352+
"internal/per_context/domexception",
353+
nullptr};
346354

347355
for (const char** module = context_files; *module != nullptr; module++) {
348356
std::vector<Local<String>> parameters = {
349-
global_string,
350-
exports_string
351-
};
352-
Local<Value> arguments[] = {context->Global(), exports};
357+
global_string, exports_string, primordials_string};
358+
Local<Value> arguments[] = {context->Global(), exports, primordials};
353359
MaybeLocal<Function> maybe_fn =
354360
native_module::NativeModuleEnv::LookupAndCompile(
355361
context, *module, &parameters, nullptr);

src/node.cc

+10-16
Original file line numberDiff line numberDiff line change
@@ -268,29 +268,23 @@ MaybeLocal<Value> RunBootstrapping(Environment* env) {
268268
global->Set(context, FIXED_ONE_BYTE_STRING(env->isolate(), "global"), global)
269269
.Check();
270270

271-
// Store primordials
272-
env->set_primordials(Object::New(isolate));
273-
std::vector<Local<String>> primordials_params = {
274-
env->primordials_string()
275-
};
276-
std::vector<Local<Value>> primordials_args = {
277-
env->primordials()
278-
};
271+
// Store primordials setup by the per-context script in the environment.
272+
Local<Object> per_context_bindings;
273+
Local<Value> primordials;
274+
if (!GetPerContextExports(context).ToLocal(&per_context_bindings) ||
275+
!per_context_bindings->Get(context, env->primordials_string())
276+
.ToLocal(&primordials) ||
277+
!primordials->IsObject()) {
278+
return MaybeLocal<Value>();
279+
}
280+
env->set_primordials(primordials.As<Object>());
279281

280282
#if HAVE_INSPECTOR
281283
if (env->options()->debug_options().break_node_first_line) {
282284
env->inspector_agent()->PauseOnNextJavascriptStatement(
283285
"Break at bootstrap");
284286
}
285287
#endif // HAVE_INSPECTOR
286-
MaybeLocal<Value> primordials_ret =
287-
ExecuteBootstrapper(env,
288-
"internal/bootstrap/primordials",
289-
&primordials_params,
290-
&primordials_args);
291-
if (primordials_ret.IsEmpty()) {
292-
return MaybeLocal<Value>();
293-
}
294288

295289
// Create binding loaders
296290
std::vector<Local<String>> loaders_params = {

0 commit comments

Comments
 (0)