@@ -411,7 +411,8 @@ MaybeLocal<Object> GetPerContextExports(Local<Context> context) {
411411 return handle_scope.Escape (existing_value.As <Object>());
412412
413413 Local<Object> exports = Object::New (isolate);
414- if (context->Global ()->SetPrivate (context, key, exports).IsNothing ())
414+ if (context->Global ()->SetPrivate (context, key, exports).IsNothing () ||
415+ !InitializePrimordials (context))
415416 return MaybeLocal<Object>();
416417 return handle_scope.Escape (exports);
417418}
@@ -467,49 +468,50 @@ bool InitializeContextForSnapshot(Local<Context> context) {
467468
468469 context->SetEmbedderData (ContextEmbedderIndex::kAllowWasmCodeGeneration ,
469470 True (isolate));
471+ return InitializePrimordials (context);
472+ }
473+
474+ bool InitializePrimordials (Local<Context> context) {
475+ // Run per-context JS files.
476+ Isolate* isolate = context->GetIsolate ();
477+ Context::Scope context_scope (context);
478+ Local<Object> exports;
479+
480+ Local<String> primordials_string =
481+ FIXED_ONE_BYTE_STRING (isolate, " primordials" );
482+ Local<String> global_string = FIXED_ONE_BYTE_STRING (isolate, " global" );
483+ Local<String> exports_string = FIXED_ONE_BYTE_STRING (isolate, " exports" );
484+
485+ // Create primordials first and make it available to per-context scripts.
486+ Local<Object> primordials = Object::New (isolate);
487+ if (!primordials->SetPrototype (context, Null (isolate)).FromJust () ||
488+ !GetPerContextExports (context).ToLocal (&exports) ||
489+ !exports->Set (context, primordials_string, primordials).FromJust ()) {
490+ return false ;
491+ }
470492
471- {
472- // Run per-context JS files.
473- Context::Scope context_scope (context);
474- Local<Object> exports;
475-
476- Local<String> primordials_string =
477- FIXED_ONE_BYTE_STRING (isolate, " primordials" );
478- Local<String> global_string = FIXED_ONE_BYTE_STRING (isolate, " global" );
479- Local<String> exports_string = FIXED_ONE_BYTE_STRING (isolate, " exports" );
480-
481- // Create primordials first and make it available to per-context scripts.
482- Local<Object> primordials = Object::New (isolate);
483- if (!primordials->SetPrototype (context, Null (isolate)).FromJust () ||
484- !GetPerContextExports (context).ToLocal (&exports) ||
485- !exports->Set (context, primordials_string, primordials).FromJust ()) {
493+ static const char * context_files[] = {" internal/per_context/primordials" ,
494+ " internal/per_context/domexception" ,
495+ " internal/per_context/messageport" ,
496+ nullptr };
497+
498+ for (const char ** module = context_files; *module != nullptr ; module ++) {
499+ std::vector<Local<String>> parameters = {
500+ global_string, exports_string, primordials_string};
501+ Local<Value> arguments[] = {context->Global (), exports, primordials};
502+ MaybeLocal<Function> maybe_fn =
503+ native_module::NativeModuleEnv::LookupAndCompile (
504+ context, *module , ¶meters, nullptr );
505+ if (maybe_fn.IsEmpty ()) {
486506 return false ;
487507 }
488-
489- static const char * context_files[] = {" internal/per_context/primordials" ,
490- " internal/per_context/domexception" ,
491- " internal/per_context/messageport" ,
492- nullptr };
493-
494- for (const char ** module = context_files; *module != nullptr ; module ++) {
495- std::vector<Local<String>> parameters = {
496- global_string, exports_string, primordials_string};
497- Local<Value> arguments[] = {context->Global (), exports, primordials};
498- MaybeLocal<Function> maybe_fn =
499- native_module::NativeModuleEnv::LookupAndCompile (
500- context, *module , ¶meters, nullptr );
501- if (maybe_fn.IsEmpty ()) {
502- return false ;
503- }
504- Local<Function> fn = maybe_fn.ToLocalChecked ();
505- MaybeLocal<Value> result =
506- fn->Call (context, Undefined (isolate),
507- arraysize (arguments), arguments);
508- // Execution failed during context creation.
509- // TODO(joyeecheung): deprecate this signature and return a MaybeLocal.
510- if (result.IsEmpty ()) {
511- return false ;
512- }
508+ Local<Function> fn = maybe_fn.ToLocalChecked ();
509+ MaybeLocal<Value> result =
510+ fn->Call (context, Undefined (isolate), arraysize (arguments), arguments);
511+ // Execution failed during context creation.
512+ // TODO(joyeecheung): deprecate this signature and return a MaybeLocal.
513+ if (result.IsEmpty ()) {
514+ return false ;
513515 }
514516 }
515517
0 commit comments