@@ -421,6 +421,7 @@ bool SourceTextModule::MaybeTransitionComponent(
421421 DCHECK_LE (module ->dfs_ancestor_index (), module ->dfs_index ());
422422 if (module ->dfs_ancestor_index () == module ->dfs_index ()) {
423423 // This is the root of its strongly connected component.
424+ Handle<SourceTextModule> cycle_root = module ;
424425 Handle<SourceTextModule> ancestor;
425426 do {
426427 ancestor = stack->front ();
@@ -430,6 +431,9 @@ bool SourceTextModule::MaybeTransitionComponent(
430431 if (new_status == kInstantiated ) {
431432 if (!SourceTextModule::RunInitializationCode (isolate, ancestor))
432433 return false ;
434+ } else if (new_status == kEvaluated ) {
435+ DCHECK (ancestor->cycle_root ().IsTheHole (isolate));
436+ ancestor->set_cycle_root (*cycle_root);
433437 }
434438 ancestor->SetStatus (new_status);
435439 } while (*ancestor != *module );
@@ -642,9 +646,9 @@ MaybeHandle<Object> SourceTextModule::EvaluateMaybeAsync(
642646 CHECK (module ->status () == kInstantiated || module ->status () == kEvaluated );
643647
644648 // 3. If module.[[Status]] is "evaluated", set module to
645- // GetAsyncCycleRoot( module) .
649+ // module.[[CycleRoot]] .
646650 if (module ->status () == kEvaluated ) {
647- module = GetAsyncCycleRoot (isolate, module );
651+ module = module -> GetCycleRoot (isolate);
648652 }
649653
650654 // 4. If module.[[TopLevelCapability]] is not undefined, then
@@ -759,37 +763,27 @@ void SourceTextModule::AsyncModuleExecutionFulfilled(
759763 for (int i = 0 ; i < module ->AsyncParentModuleCount (); i++) {
760764 Handle<SourceTextModule> m = module ->GetAsyncParentModule (isolate, i);
761765
762- // a. If module.[[DFSIndex]] is not equal to module.[[DFSAncestorIndex]],
763- // then
764- if (module ->dfs_index () != module ->dfs_ancestor_index ()) {
765- // i. Assert: m.[[DFSAncestorIndex]] is equal to
766- // module.[[DFSAncestorIndex]].
767- DCHECK_LE (m->dfs_ancestor_index (), module ->dfs_ancestor_index ());
768- }
769- // b. Decrement m.[[PendingAsyncDependencies]] by 1.
766+ // a. Decrement m.[[PendingAsyncDependencies]] by 1.
770767 m->DecrementPendingAsyncDependencies ();
771768
772- // c . If m.[[PendingAsyncDependencies]] is 0 and m.[[EvaluationError]] is
769+ // b . If m.[[PendingAsyncDependencies]] is 0 and m.[[EvaluationError]] is
773770 // undefined, then
774771 if (!m->HasPendingAsyncDependencies () && m->status () == kEvaluated ) {
775772 // i. Assert: m.[[AsyncEvaluating]] is true.
776773 DCHECK (m->async_evaluating ());
777774
778- // ii. Let cycleRoot be ! GetAsyncCycleRoot(m).
779- auto cycle_root = GetAsyncCycleRoot (isolate, m);
780-
781- // iii. If cycleRoot.[[EvaluationError]] is not undefined,
775+ // ii. If m.[[CycleRoot]].[[EvaluationError]] is not undefined,
782776 // return undefined.
783- if (cycle_root ->status () == kErrored ) {
777+ if (m-> GetCycleRoot (isolate) ->status () == kErrored ) {
784778 return ;
785779 }
786780
787- // iv . If m.[[Async]] is true, then
781+ // iii . If m.[[Async]] is true, then
788782 if (m->async ()) {
789783 // 1. Perform ! ExecuteAsyncModule(m).
790784 ExecuteAsyncModule (isolate, m);
791785 } else {
792- // v . Otherwise,
786+ // iv . Otherwise,
793787 // 1. Let result be m.ExecuteModule().
794788 // 2. If result is a normal completion,
795789 Handle<Object> unused_result;
@@ -1069,8 +1063,8 @@ MaybeHandle<Object> SourceTextModule::InnerModuleEvaluation(
10691063 required_module->dfs_ancestor_index ()));
10701064 } else {
10711065 // iv. Otherwise,
1072- // 1. Set requiredModule to GetAsyncCycleRoot( requiredModule) .
1073- required_module = GetAsyncCycleRoot (isolate, required_module );
1066+ // 1. Set requiredModule to requiredModule.[[CycleRoot]] .
1067+ required_module = required_module-> GetCycleRoot (isolate);
10741068
10751069 // 2. Assert: requiredModule.[[Status]] is "evaluated".
10761070 CHECK_GE (required_module->status (), kEvaluated );
@@ -1128,43 +1122,6 @@ MaybeHandle<Object> SourceTextModule::InnerModuleEvaluation(
11281122 return result;
11291123}
11301124
1131- Handle<SourceTextModule> SourceTextModule::GetAsyncCycleRoot (
1132- Isolate* isolate, Handle<SourceTextModule> module ) {
1133- // 1. Assert: module.[[Status]] is "evaluated".
1134- CHECK_GE (module ->status (), kEvaluated );
1135-
1136- // 2. If module.[[AsyncParentModules]] is an empty List, return module.
1137- if (module ->AsyncParentModuleCount () == 0 ) {
1138- return module ;
1139- }
1140-
1141- // 3. Repeat, while module.[[DFSIndex]] is greater than
1142- // module.[[DFSAncestorIndex]],
1143- while (module ->dfs_index () > module ->dfs_ancestor_index ()) {
1144- // a. Assert: module.[[AsyncParentModules]] is a non-empty List.
1145- DCHECK_GT (module ->AsyncParentModuleCount (), 0 );
1146-
1147- // b. Let nextCycleModule be the first element of
1148- // module.[[AsyncParentModules]].
1149- Handle<SourceTextModule> next_cycle_module =
1150- module ->GetAsyncParentModule (isolate, 0 );
1151-
1152- // c. Assert: nextCycleModule.[[DFSAncestorIndex]] is less than or equal
1153- // to module.[[DFSAncestorIndex]].
1154- DCHECK_LE (next_cycle_module->dfs_ancestor_index (),
1155- module ->dfs_ancestor_index ());
1156-
1157- // d. Set module to nextCycleModule
1158- module = next_cycle_module;
1159- }
1160-
1161- // 4. Assert: module.[[DFSIndex]] is equal to module.[[DFSAncestorIndex]].
1162- DCHECK_EQ (module ->dfs_index (), module ->dfs_ancestor_index ());
1163-
1164- // 5. Return module.
1165- return module ;
1166- }
1167-
11681125void SourceTextModule::Reset (Isolate* isolate,
11691126 Handle<SourceTextModule> module ) {
11701127 Factory* factory = isolate->factory ();
0 commit comments