Skip to content

Commit 2129383

Browse files
committed
Replace GetCycleRoot with [[CycleRoot]] field.
1 parent 85fdc77 commit 2129383

File tree

2 files changed

+18
-28
lines changed

2 files changed

+18
-28
lines changed

graal-js/src/com.oracle.truffle.js.parser/src/com/oracle/truffle/js/parser/GraalJSEvaluator.java

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/runtime/objects/JSModuleRecord.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,8 @@ public void setUninstantiated() {
239239

240240
// ##### Top-level await
241241

242+
// [[CycleRoot]]
243+
private JSModuleRecord cycleRoot = this;
242244
// [[Async]]
243245
private final boolean async;
244246
// [[AsyncEvaluating]]
@@ -316,4 +318,12 @@ public Object getExecutionContinuation() {
316318
return topLevelAwaitModuleLoadingContinuation;
317319
}
318320

321+
public void setCycleRoot(JSModuleRecord module) {
322+
cycleRoot = module;
323+
}
324+
325+
public JSModuleRecord getCycleRoot() {
326+
return cycleRoot;
327+
}
328+
319329
}

0 commit comments

Comments
 (0)