@@ -677,7 +677,7 @@ public Object moduleEvaluation(JSRealm realm, JSModuleRecord moduleRecord) {
677677 if (realm .getContext ().isOptionTopLevelAwait ()) {
678678 assert module .getStatus () == Status .Linked || module .getStatus () == Status .Evaluated ;
679679 if (module .getStatus () == Status .Evaluated ) {
680- module = getAsyncCycleRoot ( module );
680+ module = module . getCycleRoot ( );
681681 }
682682 if (module .getTopLevelCapability () != null ) {
683683 return module .getTopLevelCapability ().getPromise ();
@@ -729,26 +729,6 @@ public Object moduleEvaluation(JSRealm realm, JSModuleRecord moduleRecord) {
729729 }
730730 }
731731
732- @ TruffleBoundary
733- private static JSModuleRecord getAsyncCycleRoot (JSModuleRecord moduleRecord ) {
734- // GetAsyncCycleRoot ( module )
735- JSModuleRecord module = moduleRecord ;
736- assert module .getStatus () == Status .Evaluated ;
737-
738- if (module .getAsyncParentModules ().size () == 0 ) {
739- return module ;
740- }
741- while (module .getDFSIndex () > module .getDFSAncestorIndex ()) {
742- assert module .getAsyncParentModules ().size () != 0 ;
743- JSModuleRecord nextCycleModule = module .getAsyncParentModules ().remove (0 );
744- assert nextCycleModule .getDFSAncestorIndex () <= module .getDFSAncestorIndex ();
745- module = nextCycleModule ;
746- }
747-
748- assert module .getDFSIndex () == module .getDFSAncestorIndex ();
749- return module ;
750- }
751-
752732 @ TruffleBoundary
753733 private int innerModuleEvaluation (JSRealm realm , JSModuleRecord moduleRecord , Deque <JSModuleRecord > stack , int index0 ) {
754734 // InnerModuleEvaluation( module, stack, index )
@@ -783,7 +763,7 @@ private int innerModuleEvaluation(JSRealm realm, JSModuleRecord moduleRecord, De
783763 if (requiredModule .getStatus () == Status .Evaluating ) {
784764 moduleRecord .setDFSAncestorIndex (Math .min (moduleRecord .getDFSAncestorIndex (), requiredModule .getDFSAncestorIndex ()));
785765 } else {
786- requiredModule = getAsyncCycleRoot ( requiredModule );
766+ requiredModule = requiredModule . getCycleRoot ( );
787767 assert requiredModule .getStatus () == Status .Evaluated ;
788768 if (requiredModule .getEvaluationError () != null ) {
789769 throw JSRuntime .rethrow (moduleRecord .getEvaluationError ());
@@ -809,9 +789,11 @@ private int innerModuleEvaluation(JSRealm realm, JSModuleRecord moduleRecord, De
809789 assert occursExactlyOnce (moduleRecord , stack );
810790 assert moduleRecord .getDFSAncestorIndex () <= moduleRecord .getDFSIndex ();
811791 if (moduleRecord .getDFSAncestorIndex () == moduleRecord .getDFSIndex ()) {
792+ JSModuleRecord cycleRoot = moduleRecord ;
812793 while (true ) {
813794 JSModuleRecord requiredModule = stack .pop ();
814795 requiredModule .setStatus (Status .Evaluated );
796+ requiredModule .setCycleRoot (cycleRoot );
815797 if (requiredModule .equals (moduleRecord )) {
816798 break ;
817799 }
@@ -892,7 +874,7 @@ private static void gatherAvailableAncestors(JSModuleRecord module, Set<JSModule
892874 // GatherAvailableAncestors ( module, execList )
893875 assert module .getStatus () == Status .Evaluated ;
894876 for (JSModuleRecord m : module .getAsyncParentModules ()) {
895- if (!execList .contains (m ) && getAsyncCycleRoot ( m ).getEvaluationError () == null ) {
877+ if (!execList .contains (m ) && m . getCycleRoot ( ).getEvaluationError () == null ) {
896878 assert m .getEvaluationError () == null ;
897879 assert m .isAsyncEvaluating ();
898880 assert m .getPendingAsyncDependencies () > 0 ;
@@ -913,7 +895,7 @@ private static Object asyncModuleExecutionFulfilled(JSRealm realm, JSModuleRecor
913895 assert module .getEvaluationError () == null ;
914896 module .setAsyncEvaluating (false );
915897 if (module .getTopLevelCapability () != null ) {
916- assert module .getDFSIndex () == module . getDFSAncestorIndex () ;
898+ assert module .getCycleRoot () == module ;
917899 JSFunction .call (JSArguments .create (Undefined .instance , module .getTopLevelCapability ().getResolve (), dynamicImportResolutionResult ));
918900 }
919901 Set <JSModuleRecord > execList = new TreeSet <>(new Comparator <JSModuleRecord >() {
@@ -933,6 +915,7 @@ public int compare(JSModuleRecord o1, JSModuleRecord o2) {
933915 moduleExecution (realm , m , null );
934916 m .setAsyncEvaluating (false );
935917 if (m .getTopLevelCapability () != null ) {
918+ assert m .getCycleRoot () == m ;
936919 JSFunction .call (JSArguments .create (Undefined .instance , m .getTopLevelCapability ().getResolve (), dynamicImportResolutionResult ));
937920 }
938921 } catch (Exception e ) {
@@ -955,13 +938,10 @@ private static Object asyncModuleExecutionRejected(JSRealm realm, JSModuleRecord
955938 module .setEvaluationError (JSRuntime .getException (error ));
956939 module .setAsyncEvaluating (false );
957940 for (JSModuleRecord m : module .getAsyncParentModules ()) {
958- if (module .getDFSIndex () != module .getDFSAncestorIndex ()) {
959- assert m .getDFSAncestorIndex () == module .getDFSAncestorIndex ();
960- }
961941 asyncModuleExecutionRejected (realm , m , error );
962942 }
963943 if (module .getTopLevelCapability () != null ) {
964- assert module .getDFSIndex () == module . getDFSAncestorIndex () ;
944+ assert module .getCycleRoot () == module ;
965945 JSFunction .call ((DynamicObject ) module .getTopLevelCapability ().getReject (), Undefined .instance , new Object []{error });
966946 }
967947 return Undefined .instance ;
0 commit comments