diff --git a/lib/internal/bootstrap/primordials.js b/lib/internal/per_context/primordials.js similarity index 100% rename from lib/internal/bootstrap/primordials.js rename to lib/internal/per_context/primordials.js diff --git a/node.gyp b/node.gyp index 9088c4ce9612f7..f23fd42908d250 100644 --- a/node.gyp +++ b/node.gyp @@ -26,11 +26,11 @@ 'node_lib_target_name%': 'node_lib', 'node_intermediate_lib_type%': 'static_library', 'library_files': [ - 'lib/internal/bootstrap/primordials.js', 'lib/internal/bootstrap/environment.js', 'lib/internal/bootstrap/loaders.js', 'lib/internal/bootstrap/node.js', 'lib/internal/bootstrap/pre_execution.js', + 'lib/internal/per_context/primordials.js', 'lib/internal/per_context/setup.js', 'lib/internal/per_context/domexception.js', 'lib/async_hooks.js', diff --git a/src/api/environment.cc b/src/api/environment.cc index fb7d7003bba0b3..a87f591e4edf57 100644 --- a/src/api/environment.cc +++ b/src/api/environment.cc @@ -23,6 +23,7 @@ using v8::Local; using v8::MaybeLocal; using v8::Message; using v8::MicrotasksPolicy; +using v8::Null; using v8::Object; using v8::ObjectTemplate; using v8::Private; @@ -332,24 +333,29 @@ Local NewContext(Isolate* isolate, // Run per-context JS files. Context::Scope context_scope(context); Local exports; - if (!GetPerContextExports(context).ToLocal(&exports)) - return Local(); + Local primordials_string = + FIXED_ONE_BYTE_STRING(isolate, "primordials"); Local global_string = FIXED_ONE_BYTE_STRING(isolate, "global"); Local exports_string = FIXED_ONE_BYTE_STRING(isolate, "exports"); - static const char* context_files[] = { - "internal/per_context/setup", - "internal/per_context/domexception", - nullptr - }; + // Create primordials first and make it available to per-context scripts. + Local primordials = Object::New(isolate); + if (!primordials->SetPrototype(context, Null(isolate)).FromJust() || + !GetPerContextExports(context).ToLocal(&exports) || + !exports->Set(context, primordials_string, primordials).FromJust()) { + return Local(); + } + + static const char* context_files[] = {"internal/per_context/primordials", + "internal/per_context/setup", + "internal/per_context/domexception", + nullptr}; for (const char** module = context_files; *module != nullptr; module++) { std::vector> parameters = { - global_string, - exports_string - }; - Local arguments[] = {context->Global(), exports}; + global_string, exports_string, primordials_string}; + Local arguments[] = {context->Global(), exports, primordials}; MaybeLocal maybe_fn = native_module::NativeModuleEnv::LookupAndCompile( context, *module, ¶meters, nullptr); diff --git a/src/node.cc b/src/node.cc index 09817b8a4c1d0d..0e4e3618240303 100644 --- a/src/node.cc +++ b/src/node.cc @@ -268,14 +268,16 @@ MaybeLocal RunBootstrapping(Environment* env) { global->Set(context, FIXED_ONE_BYTE_STRING(env->isolate(), "global"), global) .Check(); - // Store primordials - env->set_primordials(Object::New(isolate)); - std::vector> primordials_params = { - env->primordials_string() - }; - std::vector> primordials_args = { - env->primordials() - }; + // Store primordials setup by the per-context script in the environment. + Local per_context_bindings; + Local primordials; + if (!GetPerContextExports(context).ToLocal(&per_context_bindings) || + !per_context_bindings->Get(context, env->primordials_string()) + .ToLocal(&primordials) || + !primordials->IsObject()) { + return MaybeLocal(); + } + env->set_primordials(primordials.As()); #if HAVE_INSPECTOR if (env->options()->debug_options().break_node_first_line) { @@ -283,14 +285,6 @@ MaybeLocal RunBootstrapping(Environment* env) { "Break at bootstrap"); } #endif // HAVE_INSPECTOR - MaybeLocal primordials_ret = - ExecuteBootstrapper(env, - "internal/bootstrap/primordials", - &primordials_params, - &primordials_args); - if (primordials_ret.IsEmpty()) { - return MaybeLocal(); - } // Create binding loaders std::vector> loaders_params = {