summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/modules/async-eval-state.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /js/src/jit-test/tests/modules/async-eval-state.js
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/jit-test/tests/modules/async-eval-state.js')
-rw-r--r--js/src/jit-test/tests/modules/async-eval-state.js207
1 files changed, 207 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/modules/async-eval-state.js b/js/src/jit-test/tests/modules/async-eval-state.js
new file mode 100644
index 0000000000..b3c524d961
--- /dev/null
+++ b/js/src/jit-test/tests/modules/async-eval-state.js
@@ -0,0 +1,207 @@
+// Test module fields related to asynchronous evaluation.
+
+// Hardcoded values of ModuleStatus. Keep these in sync if the code changes.
+const StatusUnlinked = 0;
+const StatusLinked = 2;
+const StatusEvaluating = 3;
+const StatusEvaluatingAsync = 4;
+const StatusEvaluated = 5;
+
+{
+ let m = parseModule('');
+ assertEq(m.status, StatusUnlinked);
+
+ moduleLink(m);
+ assertEq(m.isAsyncEvaluating, false);
+ assertEq(m.status, StatusLinked);
+
+ moduleEvaluate(m);
+ assertEq(m.isAsyncEvaluating, false);
+ assertEq(m.status, StatusEvaluated);
+}
+
+{
+ let m = parseModule('await 1;');
+
+ moduleLink(m);
+ assertEq(m.isAsyncEvaluating, false);
+
+ moduleEvaluate(m);
+ assertEq(m.isAsyncEvaluating, true);
+ assertEq(m.status, StatusEvaluatingAsync);
+ assertEq(m.asyncEvaluatingPostOrder, 1);
+
+ drainJobQueue();
+ assertEq(m.isAsyncEvaluating, true);
+ assertEq(m.status, StatusEvaluated);
+ assertEq(m.asyncEvaluatingPostOrder, undefined);
+}
+
+{
+ let m = parseModule('await 1; throw 2;');
+
+ moduleLink(m);
+ moduleEvaluate(m).catch(() => 0);
+ assertEq(m.isAsyncEvaluating, true);
+ assertEq(m.status, StatusEvaluatingAsync);
+ assertEq(m.asyncEvaluatingPostOrder, 1);
+
+ drainJobQueue();
+ assertEq(m.isAsyncEvaluating, true);
+ assertEq(m.status, StatusEvaluated);
+ assertEq(m.evaluationError, 2);
+ assertEq(m.asyncEvaluatingPostOrder, undefined);
+}
+
+{
+ let m = parseModule('throw 1; await 2;');
+ moduleLink(m);
+ moduleEvaluate(m).catch(() => 0);
+ assertEq(m.isAsyncEvaluating, true);
+ assertEq(m.status, StatusEvaluatingAsync);
+ assertEq(m.asyncEvaluatingPostOrder, 1);
+
+ drainJobQueue();
+ assertEq(m.isAsyncEvaluating, true);
+ assertEq(m.status, StatusEvaluated);
+ assertEq(m.evaluationError, 1);
+ assertEq(m.asyncEvaluatingPostOrder, undefined);
+}
+
+{
+ clearModules();
+ let a = registerModule('a', parseModule(''));
+ let b = registerModule('b', parseModule('import {} from "a"; await 1;'));
+
+ moduleLink(b);
+ moduleEvaluate(b);
+ assertEq(a.isAsyncEvaluating, false);
+ assertEq(a.status, StatusEvaluated);
+ assertEq(b.isAsyncEvaluating, true);
+ assertEq(b.status, StatusEvaluatingAsync);
+ assertEq(b.asyncEvaluatingPostOrder, 1);
+
+ drainJobQueue();
+ assertEq(a.isAsyncEvaluating, false);
+ assertEq(a.status, StatusEvaluated);
+ assertEq(b.isAsyncEvaluating, true);
+ assertEq(b.status, StatusEvaluated);
+ assertEq(b.asyncEvaluatingPostOrder, undefined);
+}
+
+{
+ clearModules();
+ let a = registerModule('a', parseModule('await 1;'));
+ let b = registerModule('b', parseModule('import {} from "a";'));
+
+ moduleLink(b);
+ moduleEvaluate(b);
+ assertEq(a.isAsyncEvaluating, true);
+ assertEq(a.status, StatusEvaluatingAsync);
+ assertEq(a.asyncEvaluatingPostOrder, 1);
+ assertEq(b.isAsyncEvaluating, true);
+ assertEq(b.status, StatusEvaluatingAsync);
+ assertEq(b.asyncEvaluatingPostOrder, 2);
+
+ drainJobQueue();
+ assertEq(a.isAsyncEvaluating, true);
+ assertEq(a.status, StatusEvaluated);
+ assertEq(a.asyncEvaluatingPostOrder, undefined);
+ assertEq(b.isAsyncEvaluating, true);
+ assertEq(b.status, StatusEvaluated);
+ assertEq(b.asyncEvaluatingPostOrder, undefined);
+}
+
+{
+ clearModules();
+ let resolve;
+ var promise = new Promise(r => { resolve = r; });
+ let a = registerModule('a', parseModule('await promise;'));
+ let b = registerModule('b', parseModule('await 2;'));
+ let c = registerModule('c', parseModule('import {} from "a"; import {} from "b";'));
+
+ moduleLink(c);
+ moduleEvaluate(c);
+ assertEq(a.isAsyncEvaluating, true);
+ assertEq(a.status, StatusEvaluatingAsync);
+ assertEq(a.asyncEvaluatingPostOrder, 1);
+ assertEq(b.isAsyncEvaluating, true);
+ assertEq(b.status, StatusEvaluatingAsync);
+ assertEq(b.asyncEvaluatingPostOrder, 2);
+ assertEq(c.isAsyncEvaluating, true);
+ assertEq(c.status, StatusEvaluatingAsync);
+ assertEq(c.asyncEvaluatingPostOrder, 3);
+
+ resolve(1);
+ drainJobQueue();
+ assertEq(a.isAsyncEvaluating, true);
+ assertEq(a.status, StatusEvaluated);
+ assertEq(a.asyncEvaluatingPostOrder, undefined);
+ assertEq(b.isAsyncEvaluating, true);
+ assertEq(b.status, StatusEvaluated);
+ assertEq(b.asyncEvaluatingPostOrder, undefined);
+ assertEq(c.isAsyncEvaluating, true);
+ assertEq(c.status, StatusEvaluated);
+ assertEq(c.asyncEvaluatingPostOrder, undefined);
+}
+
+{
+ clearModules();
+ let a = registerModule('a', parseModule('throw 1;'));
+ let b = registerModule('b', parseModule('import {} from "a"; await 2;'));
+
+ moduleLink(b);
+ moduleEvaluate(b).catch(() => 0);
+ assertEq(a.status, StatusEvaluated);
+ assertEq(a.isAsyncEvaluating, false);
+ assertEq(a.evaluationError, 1);
+ assertEq(b.status, StatusEvaluated);
+ assertEq(b.isAsyncEvaluating, false);
+ assertEq(b.evaluationError, 1);
+}
+
+{
+ clearModules();
+ let a = registerModule('a', parseModule('throw 1; await 2;'));
+ let b = registerModule('b', parseModule('import {} from "a";'));
+
+ moduleLink(b);
+ moduleEvaluate(b).catch(() => 0);
+ assertEq(a.isAsyncEvaluating, true);
+ assertEq(a.status, StatusEvaluatingAsync);
+ assertEq(b.isAsyncEvaluating, true);
+ assertEq(b.status, StatusEvaluatingAsync);
+
+ drainJobQueue();
+ assertEq(a.isAsyncEvaluating, true);
+ assertEq(a.status, StatusEvaluated);
+ assertEq(a.evaluationError, 1);
+ assertEq(a.asyncEvaluatingPostOrder, undefined);
+ assertEq(b.isAsyncEvaluating, true);
+ assertEq(b.status, StatusEvaluated);
+ assertEq(b.evaluationError, 1);
+ assertEq(b.asyncEvaluatingPostOrder, undefined);
+}
+
+{
+ clearModules();
+ let a = registerModule('a', parseModule('await 1; throw 2;'));
+ let b = registerModule('b', parseModule('import {} from "a";'));
+
+ moduleLink(b);
+ moduleEvaluate(b).catch(() => 0);
+ assertEq(a.isAsyncEvaluating, true);
+ assertEq(a.status, StatusEvaluatingAsync);
+ assertEq(b.isAsyncEvaluating, true);
+ assertEq(b.status, StatusEvaluatingAsync);
+
+ drainJobQueue();
+ assertEq(a.isAsyncEvaluating, true);
+ assertEq(a.status, StatusEvaluated);
+ assertEq(a.evaluationError, 2);
+ assertEq(a.asyncEvaluatingPostOrder, undefined);
+ assertEq(b.isAsyncEvaluating, true);
+ assertEq(b.status, StatusEvaluated);
+ assertEq(b.evaluationError, 2);
+ assertEq(b.asyncEvaluatingPostOrder, undefined);
+}