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
@@ -615,8 +617,9 @@ MaybeLocal<Object> GetPerContextExports(Local<Context> context) {
615617
616618 Local<Object> exports = Object::New (isolate);
617619 if (context->Global ()->SetPrivate (context, key, exports).IsNothing () ||
618- InitializePrimordials (context).IsNothing ())
620+ InitializePrimordials (context, isolate_data ).IsNothing ()) {
619621 return MaybeLocal<Object>();
622+ }
620623 return handle_scope.Escape (exports);
621624}
622625
@@ -761,7 +764,34 @@ Maybe<void> InitializeMainContextForSnapshot(Local<Context> context) {
761764 return JustVoid ();
762765}
763766
764- Maybe<void > InitializePrimordials (Local<Context> context) {
767+ Local<Object> InitializePrivateSymbols (Local<Context> context,
768+ IsolateData* isolate_data) {
769+ if (isolate_data == nullptr ) {
770+ return Local<Object>();
771+ }
772+ Isolate* isolate = context->GetIsolate ();
773+ EscapableHandleScope scope (isolate);
774+ Context::Scope context_scope (context);
775+
776+ Local<ObjectTemplate> private_symbols = ObjectTemplate::New (isolate);
777+ Local<Object> private_symbols_object;
778+ #define V (PropertyName, _ ) \
779+ private_symbols->Set (isolate, #PropertyName, isolate_data->PropertyName ());
780+
781+ PER_ISOLATE_PRIVATE_SYMBOL_PROPERTIES (V)
782+ #undef V
783+
784+ if (!private_symbols->NewInstance (context).ToLocal (&private_symbols_object) ||
785+ private_symbols_object->SetPrototypeV2 (context, Null (isolate))
786+ .IsNothing ()) {
787+ return Local<Object>();
788+ }
789+
790+ return scope.Escape (private_symbols_object);
791+ }
792+
793+ Maybe<void > InitializePrimordials (Local<Context> context,
794+ IsolateData* isolate_data) {
765795 // Run per-context JS files.
766796 Isolate* isolate = context->GetIsolate ();
767797 Context::Scope context_scope (context);
@@ -783,6 +813,9 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
783813 return Nothing<void >();
784814 }
785815
816+ Local<Object> private_symbols =
817+ InitializePrivateSymbols (context, isolate_data);
818+
786819 static const char * context_files[] = {" internal/per_context/primordials" ,
787820 " internal/per_context/domexception" ,
788821 " internal/per_context/messageport" ,
@@ -798,7 +831,12 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
798831 builtin_loader.SetEagerCompile ();
799832
800833 for (const char ** module = context_files; *module != nullptr ; module ++) {
801- Local<Value> arguments[] = {exports, primordials};
834+ Local<Value> arguments[3 ];
835+ arguments[0 ] = exports;
836+ arguments[1 ] = primordials;
837+ arguments[2 ] = private_symbols.IsEmpty () ? Local<Value>(Undefined (isolate))
838+ : Local<Value>(private_symbols);
839+
802840 if (builtin_loader
803841 .CompileAndCall (
804842 context, *module , arraysize (arguments), arguments, nullptr )
0 commit comments