@@ -594,6 +594,20 @@ void Environment::AssignToContext(Local<v8::Context> context,
594594 TrackContext (context);
595595}
596596
597+ void Environment::UnassignFromContext (Local<v8::Context> context) {
598+ if (!context.IsEmpty ()) {
599+ context->SetAlignedPointerInEmbedderData (ContextEmbedderIndex::kEnvironment ,
600+ nullptr );
601+ context->SetAlignedPointerInEmbedderData (ContextEmbedderIndex::kRealm ,
602+ nullptr );
603+ context->SetAlignedPointerInEmbedderData (
604+ ContextEmbedderIndex::kBindingDataStoreIndex , nullptr );
605+ context->SetAlignedPointerInEmbedderData (
606+ ContextEmbedderIndex::kContextifyContext , nullptr );
607+ }
608+ UntrackContext (context);
609+ }
610+
597611void Environment::TryLoadAddon (
598612 const char * filename,
599613 int flags,
@@ -819,7 +833,6 @@ void Environment::InitializeMainContext(Local<Context> context,
819833 const EnvSerializeInfo* env_info) {
820834 principal_realm_ = std::make_unique<PrincipalRealm>(
821835 this , context, MAYBE_FIELD_PTR (env_info, principal_realm));
822- AssignToContext (context, principal_realm_.get (), ContextInfo (" " ));
823836 if (env_info != nullptr ) {
824837 DeserializeProperties (env_info);
825838 }
@@ -889,9 +902,9 @@ Environment::~Environment() {
889902 inspector_agent_.reset ();
890903#endif
891904
892- ctx-> SetAlignedPointerInEmbedderData (ContextEmbedderIndex:: kEnvironment ,
893- nullptr );
894- ctx-> SetAlignedPointerInEmbedderData (ContextEmbedderIndex:: kRealm , nullptr );
905+ // Sub-realms should have been cleared with Environment's cleanup.
906+ DCHECK_EQ (shadow_realms_. size (), 0 );
907+ principal_realm_. reset ( );
895908
896909 if (trace_state_observer_) {
897910 tracing::AgentWriterHandle* writer = GetTracingAgentWriter ();
@@ -914,10 +927,6 @@ Environment::~Environment() {
914927 addon.Close ();
915928 }
916929 }
917-
918- for (auto realm : shadow_realms_) {
919- realm->OnEnvironmentDestruct ();
920- }
921930}
922931
923932void Environment::InitializeLibuv () {
@@ -1713,6 +1722,9 @@ void Environment::DeserializeProperties(const EnvSerializeInfo* info) {
17131722 std::cerr << *info << " \n " ;
17141723 }
17151724
1725+ // Deserialize the realm's properties before running the deserialize
1726+ // requests as the requests may need to access the realm's properties.
1727+ principal_realm_->DeserializeProperties (&info->principal_realm );
17161728 RunDeserializeRequests ();
17171729
17181730 async_hooks_.Deserialize (ctx);
@@ -1723,8 +1735,6 @@ void Environment::DeserializeProperties(const EnvSerializeInfo* info) {
17231735 exit_info_.Deserialize (ctx);
17241736 stream_base_state_.Deserialize (ctx);
17251737 should_abort_on_uncaught_toggle_.Deserialize (ctx);
1726-
1727- principal_realm_->DeserializeProperties (&info->principal_realm );
17281738}
17291739
17301740uint64_t GuessMemoryAvailableToTheProcess () {
0 commit comments