From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- js/src/jit-test/tests/modules/async-eval-state.js | 207 ++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 js/src/jit-test/tests/modules/async-eval-state.js (limited to 'js/src/jit-test/tests/modules/async-eval-state.js') 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); +} -- cgit v1.2.3