@@ -595,6 +595,20 @@ void Environment::AssignToContext(Local<v8::Context> context,
595595 TrackContext (context);
596596}
597597
598+ void Environment::UnassignToContext (Local<v8::Context> context) {
599+ if (!context.IsEmpty ()) {
600+ context->SetAlignedPointerInEmbedderData (ContextEmbedderIndex::kEnvironment ,
601+ nullptr );
602+ context->SetAlignedPointerInEmbedderData (ContextEmbedderIndex::kRealm ,
603+ nullptr );
604+ context->SetAlignedPointerInEmbedderData (
605+ ContextEmbedderIndex::kBindingDataStoreIndex , nullptr );
606+ context->SetAlignedPointerInEmbedderData (
607+ ContextEmbedderIndex::kContextifyContext , nullptr );
608+ }
609+ UntrackContext (context);
610+ }
611+
598612void Environment::TryLoadAddon (
599613 const char * filename,
600614 int flags,
@@ -820,7 +834,6 @@ void Environment::InitializeMainContext(Local<Context> context,
820834 const EnvSerializeInfo* env_info) {
821835 principal_realm_ = std::make_unique<PrincipalRealm>(
822836 this , context, MAYBE_FIELD_PTR (env_info, principal_realm));
823- AssignToContext (context, principal_realm_.get (), ContextInfo (" " ));
824837 if (env_info != nullptr ) {
825838 DeserializeProperties (env_info);
826839 }
@@ -890,9 +903,9 @@ Environment::~Environment() {
890903 inspector_agent_.reset ();
891904#endif
892905
893- ctx-> SetAlignedPointerInEmbedderData (ContextEmbedderIndex:: kEnvironment ,
894- nullptr );
895- ctx-> SetAlignedPointerInEmbedderData (ContextEmbedderIndex:: kRealm , nullptr );
906+ // Sub-realms should have been cleared with Environment's cleanup.
907+ DCHECK_EQ (shadow_realms_. size (), 0 );
908+ principal_realm_. reset ( );
896909
897910 if (trace_state_observer_) {
898911 tracing::AgentWriterHandle* writer = GetTracingAgentWriter ();
@@ -915,10 +928,6 @@ Environment::~Environment() {
915928 addon.Close ();
916929 }
917930 }
918-
919- for (auto realm : shadow_realms_) {
920- realm->OnEnvironmentDestruct ();
921- }
922931}
923932
924933void Environment::InitializeLibuv () {
@@ -1714,6 +1723,9 @@ void Environment::DeserializeProperties(const EnvSerializeInfo* info) {
17141723 std::cerr << *info << " \n " ;
17151724 }
17161725
1726+ // Deserialize the realm's properties before running the deserialize
1727+ // requests as the requests may need to access the realm's properties.
1728+ principal_realm_->DeserializeProperties (&info->principal_realm );
17171729 RunDeserializeRequests ();
17181730
17191731 async_hooks_.Deserialize (ctx);
@@ -1724,8 +1736,6 @@ void Environment::DeserializeProperties(const EnvSerializeInfo* info) {
17241736 exit_info_.Deserialize (ctx);
17251737 stream_base_state_.Deserialize (ctx);
17261738 should_abort_on_uncaught_toggle_.Deserialize (ctx);
1727-
1728- principal_realm_->DeserializeProperties (&info->principal_realm );
17291739}
17301740
17311741uint64_t GuessMemoryAvailableToTheProcess () {
0 commit comments