diff --git a/src/api/environment.cc b/src/api/environment.cc index ac1e513967310a..7fd219d6e8fcfe 100644 --- a/src/api/environment.cc +++ b/src/api/environment.cc @@ -353,6 +353,15 @@ Local NewContext(Isolate* isolate, Local object_template) { auto context = Context::New(isolate, nullptr, object_template); if (context.IsEmpty()) return context; + + if (!InitializeContext(context)) { + return Local(); + } + return context; +} + +bool InitializeContext(Local context) { + Isolate* isolate = context->GetIsolate(); HandleScope handle_scope(isolate); context->SetEmbedderData(ContextEmbedderIndex::kAllowWasmCodeGeneration, @@ -373,7 +382,7 @@ Local NewContext(Isolate* isolate, if (!primordials->SetPrototype(context, Null(isolate)).FromJust() || !GetPerContextExports(context).ToLocal(&exports) || !exports->Set(context, primordials_string, primordials).FromJust()) { - return Local(); + return false; } static const char* context_files[] = {"internal/per_context/primordials", @@ -389,7 +398,7 @@ Local NewContext(Isolate* isolate, native_module::NativeModuleEnv::LookupAndCompile( context, *module, ¶meters, nullptr); if (maybe_fn.IsEmpty()) { - return Local(); + return false; } Local fn = maybe_fn.ToLocalChecked(); MaybeLocal result = @@ -398,12 +407,12 @@ Local NewContext(Isolate* isolate, // Execution failed during context creation. // TODO(joyeecheung): deprecate this signature and return a MaybeLocal. if (result.IsEmpty()) { - return Local(); + return false; } } } - return context; + return true; } uv_loop_t* GetCurrentEventLoop(Isolate* isolate) { diff --git a/src/node.h b/src/node.h index f78c76023bb667..13d71d41398545 100644 --- a/src/node.h +++ b/src/node.h @@ -299,6 +299,10 @@ NODE_EXTERN v8::Local NewContext( v8::Local object_template = v8::Local()); +// Runs Node.js-specific tweaks on an already constructed context +// Return value indicates success of operation +NODE_EXTERN bool InitializeContext(v8::Local context); + // If `platform` is passed, it will be used to register new Worker instances. // It can be `nullptr`, in which case creating new Workers inside of // Environments that use this `IsolateData` will not work.