src: expose MaybeInitializeContext to allow existing contexts

Splits the node.js specific tweak intialization of NewContext into a new
helper MaybeInitializeContext so that embedders with existing contexts
can still use them in a Node.js Environment now that primordials are
initialized and required so early.

Update MaybeInitializeContext to return MaybeLocal,

PR-URL: https://github.com/nodejs/node/pull/28544
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Samuel Attard 2019-07-04 15:57:09 -07:00 committed by Rich Trott
parent d770b8a931
commit 33ae95c58d
2 changed files with 17 additions and 4 deletions

View File

@ -353,6 +353,15 @@ Local<Context> NewContext(Isolate* isolate,
Local<ObjectTemplate> object_template) { Local<ObjectTemplate> object_template) {
auto context = Context::New(isolate, nullptr, object_template); auto context = Context::New(isolate, nullptr, object_template);
if (context.IsEmpty()) return context; if (context.IsEmpty()) return context;
if (!InitializeContext(context)) {
return Local<Context>();
}
return context;
}
bool InitializeContext(Local<Context> context) {
Isolate* isolate = context->GetIsolate();
HandleScope handle_scope(isolate); HandleScope handle_scope(isolate);
context->SetEmbedderData(ContextEmbedderIndex::kAllowWasmCodeGeneration, context->SetEmbedderData(ContextEmbedderIndex::kAllowWasmCodeGeneration,
@ -373,7 +382,7 @@ Local<Context> NewContext(Isolate* isolate,
if (!primordials->SetPrototype(context, Null(isolate)).FromJust() || if (!primordials->SetPrototype(context, Null(isolate)).FromJust() ||
!GetPerContextExports(context).ToLocal(&exports) || !GetPerContextExports(context).ToLocal(&exports) ||
!exports->Set(context, primordials_string, primordials).FromJust()) { !exports->Set(context, primordials_string, primordials).FromJust()) {
return Local<Context>(); return false;
} }
static const char* context_files[] = {"internal/per_context/primordials", static const char* context_files[] = {"internal/per_context/primordials",
@ -389,7 +398,7 @@ Local<Context> NewContext(Isolate* isolate,
native_module::NativeModuleEnv::LookupAndCompile( native_module::NativeModuleEnv::LookupAndCompile(
context, *module, &parameters, nullptr); context, *module, &parameters, nullptr);
if (maybe_fn.IsEmpty()) { if (maybe_fn.IsEmpty()) {
return Local<Context>(); return false;
} }
Local<Function> fn = maybe_fn.ToLocalChecked(); Local<Function> fn = maybe_fn.ToLocalChecked();
MaybeLocal<Value> result = MaybeLocal<Value> result =
@ -398,12 +407,12 @@ Local<Context> NewContext(Isolate* isolate,
// Execution failed during context creation. // Execution failed during context creation.
// TODO(joyeecheung): deprecate this signature and return a MaybeLocal. // TODO(joyeecheung): deprecate this signature and return a MaybeLocal.
if (result.IsEmpty()) { if (result.IsEmpty()) {
return Local<Context>(); return false;
} }
} }
} }
return context; return true;
} }
uv_loop_t* GetCurrentEventLoop(Isolate* isolate) { uv_loop_t* GetCurrentEventLoop(Isolate* isolate) {

View File

@ -305,6 +305,10 @@ NODE_EXTERN v8::Local<v8::Context> NewContext(
v8::Local<v8::ObjectTemplate> object_template = v8::Local<v8::ObjectTemplate> object_template =
v8::Local<v8::ObjectTemplate>()); v8::Local<v8::ObjectTemplate>());
// Runs Node.js-specific tweaks on an already constructed context
// Return value indicates success of operation
NODE_EXTERN bool InitializeContext(v8::Local<v8::Context> context);
// If `platform` is passed, it will be used to register new Worker instances. // 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 // It can be `nullptr`, in which case creating new Workers inside of
// Environments that use this `IsolateData` will not work. // Environments that use this `IsolateData` will not work.