11#include < cstdlib>
2+ #include " env_properties.h"
23#include " node.h"
34#include " node_builtins.h"
45#include " node_context_data.h"
@@ -599,7 +600,8 @@ std::unique_ptr<MultiIsolatePlatform> MultiIsolatePlatform::Create(
599600 page_allocator);
600601}
601602
602- MaybeLocal<Object> GetPerContextExports (Local<Context> context) {
603+ MaybeLocal<Object> GetPerContextExports (Local<Context> context,
604+ IsolateData* isolate_data) {
603605 Isolate* isolate = context->GetIsolate ();
604606 EscapableHandleScope handle_scope (isolate);
605607
@@ -614,21 +616,24 @@ MaybeLocal<Object> GetPerContextExports(Local<Context> context) {
614616 return handle_scope.Escape (existing_value.As <Object>());
615617
616618 Local<Object> exports = Object::New (isolate);
617- if (context->Global ()->SetPrivate (context, key, exports).IsNothing () ||
618- InitializePrimordials (context).IsNothing ())
619+ if (isolate_data == nullptr ||
620+ context->Global ()->SetPrivate (context, key, exports).IsNothing () ||
621+ InitializePrimordials (context, isolate_data).IsNothing ()) {
619622 return MaybeLocal<Object>();
623+ }
620624 return handle_scope.Escape (exports);
621625}
622626
623627// Any initialization logic should be performed in
624628// InitializeContext, because embedders don't necessarily
625629// call NewContext and so they will experience breakages.
626630Local<Context> NewContext (Isolate* isolate,
631+ IsolateData* isolate_data,
627632 Local<ObjectTemplate> object_template) {
628633 auto context = Context::New (isolate, nullptr , object_template);
629634 if (context.IsEmpty ()) return context;
630635
631- if (InitializeContext (context).IsNothing ()) {
636+ if (InitializeContext (context, isolate_data ).IsNothing ()) {
632637 return Local<Context>();
633638 }
634639
@@ -745,7 +750,8 @@ Maybe<void> InitializeBaseContextForSnapshot(Local<Context> context) {
745750 return JustVoid ();
746751}
747752
748- Maybe<void > InitializeMainContextForSnapshot (Local<Context> context) {
753+ Maybe<void > InitializeMainContextForSnapshot (Local<Context> context,
754+ IsolateData* isolate_data) {
749755 Isolate* isolate = context->GetIsolate ();
750756 HandleScope handle_scope (isolate);
751757
@@ -758,10 +764,35 @@ Maybe<void> InitializeMainContextForSnapshot(Local<Context> context) {
758764 if (InitializeBaseContextForSnapshot (context).IsNothing ()) {
759765 return Nothing<void >();
760766 }
761- return InitializePrimordials (context);
767+ return InitializePrimordials (context, isolate_data);
768+ }
769+
770+ Local<Object> InitializePrivateSymbols (Local<Context> context,
771+ IsolateData* isolate_data) {
772+ Isolate* isolate = context->GetIsolate ();
773+ EscapableHandleScope scope (isolate);
774+ Context::Scope context_scope (context);
775+
776+ Local<ObjectTemplate> private_symbols;
777+ Local<Object> private_symbols_object;
778+ private_symbols = ObjectTemplate::New (isolate);
779+ #define V (PropertyName, _ ) \
780+ private_symbols->Set (isolate, #PropertyName, isolate_data->PropertyName ());
781+
782+ PER_ISOLATE_PRIVATE_SYMBOL_PROPERTIES (V)
783+ #undef V
784+
785+ if (!private_symbols->NewInstance (context).ToLocal (&private_symbols_object) ||
786+ private_symbols_object->SetPrototypeV2 (context, Null (isolate))
787+ .IsNothing ()) {
788+ return Local<Object>();
789+ }
790+
791+ return scope.Escape (private_symbols_object);
762792}
763793
764- Maybe<void > InitializePrimordials (Local<Context> context) {
794+ Maybe<void > InitializePrimordials (Local<Context> context,
795+ IsolateData* isolate_data) {
765796 // Run per-context JS files.
766797 Isolate* isolate = context->GetIsolate ();
767798 Context::Scope context_scope (context);
@@ -772,12 +803,19 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
772803
773804 // Create primordials first and make it available to per-context scripts.
774805 Local<Object> primordials = Object::New (isolate);
806+
775807 if (primordials->SetPrototypeV2 (context, Null (isolate)).IsNothing () ||
776- !GetPerContextExports (context).ToLocal (&exports) ||
808+ !GetPerContextExports (context, isolate_data ).ToLocal (&exports) ||
777809 exports->Set (context, primordials_string, primordials).IsNothing ()) {
778810 return Nothing<void >();
779811 }
780812
813+ Local<Object> private_symbols =
814+ InitializePrivateSymbols (context, isolate_data);
815+ if (private_symbols.IsEmpty ()) {
816+ return Nothing<void >();
817+ }
818+
781819 static const char * context_files[] = {" internal/per_context/primordials" ,
782820 " internal/per_context/domexception" ,
783821 " internal/per_context/messageport" ,
@@ -793,7 +831,7 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
793831 builtin_loader.SetEagerCompile ();
794832
795833 for (const char ** module = context_files; *module != nullptr ; module ++) {
796- Local<Value> arguments[] = {exports, primordials};
834+ Local<Value> arguments[] = {exports, primordials, private_symbols };
797835 if (builtin_loader
798836 .CompileAndCall (
799837 context, *module , arraysize (arguments), arguments, nullptr )
@@ -807,8 +845,9 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
807845}
808846
809847// This initializes the main context (i.e. vm contexts are not included).
810- Maybe<bool > InitializeContext (Local<Context> context) {
811- if (InitializeMainContextForSnapshot (context).IsNothing ()) {
848+ Maybe<bool > InitializeContext (Local<Context> context,
849+ IsolateData* isolate_data) {
850+ if (InitializeMainContextForSnapshot (context, isolate_data).IsNothing ()) {
812851 return Nothing<bool >();
813852 }
814853
0 commit comments