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,20 +617,22 @@ 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
623626// Any initialization logic should be performed in
624627// InitializeContext, because embedders don't necessarily
625628// call NewContext and so they will experience breakages.
626629Local<Context> NewContext (Isolate* isolate,
630+ IsolateData* isolate_data,
627631 Local<ObjectTemplate> object_template) {
628632 auto context = Context::New (isolate, nullptr , object_template);
629633 if (context.IsEmpty ()) return context;
630634
631- if (InitializeContext (context).IsNothing ()) {
635+ if (InitializeContext (context, isolate_data ).IsNothing ()) {
632636 return Local<Context>();
633637 }
634638
@@ -745,7 +749,8 @@ Maybe<void> InitializeBaseContextForSnapshot(Local<Context> context) {
745749 return JustVoid ();
746750}
747751
748- Maybe<void > InitializeMainContextForSnapshot (Local<Context> context) {
752+ Maybe<void > InitializeMainContextForSnapshot (Local<Context> context,
753+ IsolateData* isolate_data) {
749754 Isolate* isolate = context->GetIsolate ();
750755 HandleScope handle_scope (isolate);
751756
@@ -758,10 +763,35 @@ Maybe<void> InitializeMainContextForSnapshot(Local<Context> context) {
758763 if (InitializeBaseContextForSnapshot (context).IsNothing ()) {
759764 return Nothing<void >();
760765 }
761- return InitializePrimordials (context);
766+ return InitializePrimordials (context, isolate_data);
767+ }
768+
769+ Local<Object> InitializePrivateSymbols (Local<Context> context,
770+ IsolateData* isolate_data) {
771+ Isolate* isolate = context->GetIsolate ();
772+ EscapableHandleScope scope (isolate);
773+ Context::Scope context_scope (context);
774+
775+ Local<ObjectTemplate> private_symbols;
776+ Local<Object> private_symbols_object;
777+ private_symbols = ObjectTemplate::New (isolate);
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);
762791}
763792
764- Maybe<void > InitializePrimordials (Local<Context> context) {
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);
@@ -772,12 +802,18 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
772802
773803 // Create primordials first and make it available to per-context scripts.
774804 Local<Object> primordials = Object::New (isolate);
805+
775806 if (primordials->SetPrototypeV2 (context, Null (isolate)).IsNothing () ||
776- !GetPerContextExports (context).ToLocal (&exports) ||
807+ !GetPerContextExports (context, isolate_data ).ToLocal (&exports) ||
777808 exports->Set (context, primordials_string, primordials).IsNothing ()) {
778809 return Nothing<void >();
779810 }
780811
812+ Local<Object> private_symbols;
813+ if (isolate_data != nullptr ) {
814+ private_symbols = InitializePrivateSymbols (context, isolate_data);
815+ }
816+
781817 static const char * context_files[] = {" internal/per_context/primordials" ,
782818 " internal/per_context/domexception" ,
783819 " internal/per_context/messageport" ,
@@ -793,7 +829,13 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
793829 builtin_loader.SetEagerCompile ();
794830
795831 for (const char ** module = context_files; *module != nullptr ; module ++) {
796- Local<Value> arguments[] = {exports, primordials};
832+ Local<Value> arguments[3 ];
833+ arguments[0 ] = exports;
834+ arguments[1 ] = primordials;
835+ arguments[2 ] = private_symbols.IsEmpty () ?
836+ Local<Value>(Undefined (isolate)) :
837+ Local<Value>(private_symbols);
838+
797839 if (builtin_loader
798840 .CompileAndCall (
799841 context, *module , arraysize (arguments), arguments, nullptr )
@@ -807,8 +849,9 @@ Maybe<void> InitializePrimordials(Local<Context> context) {
807849}
808850
809851// This initializes the main context (i.e. vm contexts are not included).
810- Maybe<bool > InitializeContext (Local<Context> context) {
811- if (InitializeMainContextForSnapshot (context).IsNothing ()) {
852+ Maybe<bool > InitializeContext (Local<Context> context,
853+ IsolateData* isolate_data) {
854+ if (InitializeMainContextForSnapshot (context, isolate_data).IsNothing ()) {
812855 return Nothing<bool >();
813856 }
814857
0 commit comments