@@ -397,6 +397,7 @@ bool SourceTextModule::MaybeTransitionComponent(
397397 DCHECK_LE (module ->dfs_ancestor_index (), module ->dfs_index ());
398398 if (module ->dfs_ancestor_index () == module ->dfs_index ()) {
399399 // This is the root of its strongly connected component.
400+ Handle<SourceTextModule> cycle_root = module ;
400401 Handle<SourceTextModule> ancestor;
401402 do {
402403 ancestor = stack->front ();
@@ -406,6 +407,9 @@ bool SourceTextModule::MaybeTransitionComponent(
406407 if (new_status == kInstantiated ) {
407408 if (!SourceTextModule::RunInitializationCode (isolate, ancestor))
408409 return false ;
410+ } else if (new_status == kEvaluated ) {
411+ DCHECK (ancestor->cycle_root ().IsTheHole (isolate));
412+ ancestor->set_cycle_root (*cycle_root);
409413 }
410414 ancestor->SetStatus (new_status);
411415 } while (*ancestor != *module );
@@ -619,9 +623,9 @@ MaybeHandle<Object> SourceTextModule::EvaluateMaybeAsync(
619623 CHECK (module ->status () == kInstantiated || module ->status () == kEvaluated );
620624
621625 // 3. If module.[[Status]] is "evaluated", set module to
622- // GetAsyncCycleRoot( module) .
626+ // module.[[CycleRoot]] .
623627 if (module ->status () == kEvaluated ) {
624- module = GetAsyncCycleRoot (isolate, module );
628+ module = module -> GetCycleRoot (isolate);
625629 }
626630
627631 // 4. If module.[[TopLevelCapability]] is not undefined, then
@@ -736,37 +740,27 @@ void SourceTextModule::AsyncModuleExecutionFulfilled(
736740 for (int i = 0 ; i < module ->AsyncParentModuleCount (); i++) {
737741 Handle<SourceTextModule> m = module ->GetAsyncParentModule (isolate, i);
738742
739- // a. If module.[[DFSIndex]] is not equal to module.[[DFSAncestorIndex]],
740- // then
741- if (module ->dfs_index () != module ->dfs_ancestor_index ()) {
742- // i. Assert: m.[[DFSAncestorIndex]] is equal to
743- // module.[[DFSAncestorIndex]].
744- DCHECK_LE (m->dfs_ancestor_index (), module ->dfs_ancestor_index ());
745- }
746- // b. Decrement m.[[PendingAsyncDependencies]] by 1.
743+ // a. Decrement m.[[PendingAsyncDependencies]] by 1.
747744 m->DecrementPendingAsyncDependencies ();
748745
749- // c . If m.[[PendingAsyncDependencies]] is 0 and m.[[EvaluationError]] is
746+ // b . If m.[[PendingAsyncDependencies]] is 0 and m.[[EvaluationError]] is
750747 // undefined, then
751748 if (!m->HasPendingAsyncDependencies () && m->status () == kEvaluated ) {
752749 // i. Assert: m.[[AsyncEvaluating]] is true.
753750 DCHECK (m->async_evaluating ());
754751
755- // ii. Let cycleRoot be ! GetAsyncCycleRoot(m).
756- auto cycle_root = GetAsyncCycleRoot (isolate, m);
757-
758- // iii. If cycleRoot.[[EvaluationError]] is not undefined,
752+ // ii. If m.[[CycleRoot]].[[EvaluationError]] is not undefined,
759753 // return undefined.
760- if (cycle_root ->status () == kErrored ) {
754+ if (m-> GetCycleRoot (isolate) ->status () == kErrored ) {
761755 return ;
762756 }
763757
764- // iv . If m.[[Async]] is true, then
758+ // iii . If m.[[Async]] is true, then
765759 if (m->async ()) {
766760 // 1. Perform ! ExecuteAsyncModule(m).
767761 ExecuteAsyncModule (isolate, m);
768762 } else {
769- // v . Otherwise,
763+ // iv . Otherwise,
770764 // 1. Let result be m.ExecuteModule().
771765 // 2. If result is a normal completion,
772766 Handle<Object> unused_result;
@@ -1046,8 +1040,8 @@ MaybeHandle<Object> SourceTextModule::InnerModuleEvaluation(
10461040 required_module->dfs_ancestor_index ()));
10471041 } else {
10481042 // iv. Otherwise,
1049- // 1. Set requiredModule to GetAsyncCycleRoot( requiredModule) .
1050- required_module = GetAsyncCycleRoot (isolate, required_module );
1043+ // 1. Set requiredModule to requiredModule.[[CycleRoot]] .
1044+ required_module = required_module-> GetCycleRoot (isolate);
10511045
10521046 // 2. Assert: requiredModule.[[Status]] is "evaluated".
10531047 CHECK_GE (required_module->status (), kEvaluated );
@@ -1105,43 +1099,6 @@ MaybeHandle<Object> SourceTextModule::InnerModuleEvaluation(
11051099 return result;
11061100}
11071101
1108- Handle<SourceTextModule> SourceTextModule::GetAsyncCycleRoot (
1109- Isolate* isolate, Handle<SourceTextModule> module ) {
1110- // 1. Assert: module.[[Status]] is "evaluated".
1111- CHECK_GE (module ->status (), kEvaluated );
1112-
1113- // 2. If module.[[AsyncParentModules]] is an empty List, return module.
1114- if (module ->AsyncParentModuleCount () == 0 ) {
1115- return module ;
1116- }
1117-
1118- // 3. Repeat, while module.[[DFSIndex]] is greater than
1119- // module.[[DFSAncestorIndex]],
1120- while (module ->dfs_index () > module ->dfs_ancestor_index ()) {
1121- // a. Assert: module.[[AsyncParentModules]] is a non-empty List.
1122- DCHECK_GT (module ->AsyncParentModuleCount (), 0 );
1123-
1124- // b. Let nextCycleModule be the first element of
1125- // module.[[AsyncParentModules]].
1126- Handle<SourceTextModule> next_cycle_module =
1127- module ->GetAsyncParentModule (isolate, 0 );
1128-
1129- // c. Assert: nextCycleModule.[[DFSAncestorIndex]] is less than or equal
1130- // to module.[[DFSAncestorIndex]].
1131- DCHECK_LE (next_cycle_module->dfs_ancestor_index (),
1132- module ->dfs_ancestor_index ());
1133-
1134- // d. Set module to nextCycleModule
1135- module = next_cycle_module;
1136- }
1137-
1138- // 4. Assert: module.[[DFSIndex]] is equal to module.[[DFSAncestorIndex]].
1139- DCHECK_EQ (module ->dfs_index (), module ->dfs_ancestor_index ());
1140-
1141- // 5. Return module.
1142- return module ;
1143- }
1144-
11451102void SourceTextModule::Reset (Isolate* isolate,
11461103 Handle<SourceTextModule> module ) {
11471104 Factory* factory = isolate->factory ();
0 commit comments