@@ -398,6 +398,7 @@ bool SourceTextModule::MaybeTransitionComponent(
398398 DCHECK_LE (module ->dfs_ancestor_index (), module ->dfs_index ());
399399 if (module ->dfs_ancestor_index () == module ->dfs_index ()) {
400400 // This is the root of its strongly connected component.
401+ Handle<SourceTextModule> cycle_root = module ;
401402 Handle<SourceTextModule> ancestor;
402403 do {
403404 ancestor = stack->front ();
@@ -407,6 +408,9 @@ bool SourceTextModule::MaybeTransitionComponent(
407408 if (new_status == kInstantiated ) {
408409 if (!SourceTextModule::RunInitializationCode (isolate, ancestor))
409410 return false ;
411+ } else if (new_status == kEvaluated ) {
412+ DCHECK (ancestor->cycle_root ().IsTheHole (isolate));
413+ ancestor->set_cycle_root (*cycle_root);
410414 }
411415 ancestor->SetStatus (new_status);
412416 } while (*ancestor != *module );
@@ -617,9 +621,9 @@ MaybeHandle<Object> SourceTextModule::EvaluateMaybeAsync(
617621 CHECK (module ->status () == kInstantiated || module ->status () == kEvaluated );
618622
619623 // 3. If module.[[Status]] is "evaluated", set module to
620- // GetAsyncCycleRoot( module) .
624+ // module.[[CycleRoot]] .
621625 if (module ->status () == kEvaluated ) {
622- module = GetAsyncCycleRoot (isolate, module );
626+ module = module -> GetCycleRoot (isolate);
623627 }
624628
625629 // 4. If module.[[TopLevelCapability]] is not undefined, then
@@ -734,37 +738,27 @@ void SourceTextModule::AsyncModuleExecutionFulfilled(
734738 for (int i = 0 ; i < module ->AsyncParentModuleCount (); i++) {
735739 Handle<SourceTextModule> m = module ->GetAsyncParentModule (isolate, i);
736740
737- // a. If module.[[DFSIndex]] is not equal to module.[[DFSAncestorIndex]],
738- // then
739- if (module ->dfs_index () != module ->dfs_ancestor_index ()) {
740- // i. Assert: m.[[DFSAncestorIndex]] is equal to
741- // module.[[DFSAncestorIndex]].
742- DCHECK_LE (m->dfs_ancestor_index (), module ->dfs_ancestor_index ());
743- }
744- // b. Decrement m.[[PendingAsyncDependencies]] by 1.
741+ // a. Decrement m.[[PendingAsyncDependencies]] by 1.
745742 m->DecrementPendingAsyncDependencies ();
746743
747- // c . If m.[[PendingAsyncDependencies]] is 0 and m.[[EvaluationError]] is
744+ // b . If m.[[PendingAsyncDependencies]] is 0 and m.[[EvaluationError]] is
748745 // undefined, then
749746 if (!m->HasPendingAsyncDependencies () && m->status () == kEvaluated ) {
750747 // i. Assert: m.[[AsyncEvaluating]] is true.
751748 DCHECK (m->async_evaluating ());
752749
753- // ii. Let cycleRoot be ! GetAsyncCycleRoot(m).
754- auto cycle_root = GetAsyncCycleRoot (isolate, m);
755-
756- // iii. If cycleRoot.[[EvaluationError]] is not undefined,
750+ // ii. If m.[[CycleRoot]].[[EvaluationError]] is not undefined,
757751 // return undefined.
758- if (cycle_root ->status () == kErrored ) {
752+ if (m-> GetCycleRoot (isolate) ->status () == kErrored ) {
759753 return ;
760754 }
761755
762- // iv . If m.[[Async]] is true, then
756+ // iii . If m.[[Async]] is true, then
763757 if (m->async ()) {
764758 // 1. Perform ! ExecuteAsyncModule(m).
765759 ExecuteAsyncModule (isolate, m);
766760 } else {
767- // v . Otherwise,
761+ // iv . Otherwise,
768762 // 1. Let result be m.ExecuteModule().
769763 // 2. If result is a normal completion,
770764 Handle<Object> unused_result;
@@ -1044,8 +1038,8 @@ MaybeHandle<Object> SourceTextModule::InnerModuleEvaluation(
10441038 required_module->dfs_ancestor_index ()));
10451039 } else {
10461040 // iv. Otherwise,
1047- // 1. Set requiredModule to GetAsyncCycleRoot( requiredModule) .
1048- required_module = GetAsyncCycleRoot (isolate, required_module );
1041+ // 1. Set requiredModule to requiredModule.[[CycleRoot]] .
1042+ required_module = required_module-> GetCycleRoot (isolate);
10491043
10501044 // 2. Assert: requiredModule.[[Status]] is "evaluated".
10511045 CHECK_GE (required_module->status (), kEvaluated );
@@ -1103,43 +1097,6 @@ MaybeHandle<Object> SourceTextModule::InnerModuleEvaluation(
11031097 return result;
11041098}
11051099
1106- Handle<SourceTextModule> SourceTextModule::GetAsyncCycleRoot (
1107- Isolate* isolate, Handle<SourceTextModule> module ) {
1108- // 1. Assert: module.[[Status]] is "evaluated".
1109- CHECK_GE (module ->status (), kEvaluated );
1110-
1111- // 2. If module.[[AsyncParentModules]] is an empty List, return module.
1112- if (module ->AsyncParentModuleCount () == 0 ) {
1113- return module ;
1114- }
1115-
1116- // 3. Repeat, while module.[[DFSIndex]] is greater than
1117- // module.[[DFSAncestorIndex]],
1118- while (module ->dfs_index () > module ->dfs_ancestor_index ()) {
1119- // a. Assert: module.[[AsyncParentModules]] is a non-empty List.
1120- DCHECK_GT (module ->AsyncParentModuleCount (), 0 );
1121-
1122- // b. Let nextCycleModule be the first element of
1123- // module.[[AsyncParentModules]].
1124- Handle<SourceTextModule> next_cycle_module =
1125- module ->GetAsyncParentModule (isolate, 0 );
1126-
1127- // c. Assert: nextCycleModule.[[DFSAncestorIndex]] is less than or equal
1128- // to module.[[DFSAncestorIndex]].
1129- DCHECK_LE (next_cycle_module->dfs_ancestor_index (),
1130- module ->dfs_ancestor_index ());
1131-
1132- // d. Set module to nextCycleModule
1133- module = next_cycle_module;
1134- }
1135-
1136- // 4. Assert: module.[[DFSIndex]] is equal to module.[[DFSAncestorIndex]].
1137- DCHECK_EQ (module ->dfs_index (), module ->dfs_ancestor_index ());
1138-
1139- // 5. Return module.
1140- return module ;
1141- }
1142-
11431100void SourceTextModule::Reset (Isolate* isolate,
11441101 Handle<SourceTextModule> module ) {
11451102 Factory* factory = isolate->factory ();
0 commit comments