summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/Frame-asyncPromise-04.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/debug/Frame-asyncPromise-04.js')
-rw-r--r--js/src/jit-test/tests/debug/Frame-asyncPromise-04.js104
1 files changed, 104 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/debug/Frame-asyncPromise-04.js b/js/src/jit-test/tests/debug/Frame-asyncPromise-04.js
new file mode 100644
index 0000000000..1d2a6bf55f
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-asyncPromise-04.js
@@ -0,0 +1,104 @@
+// Test the promise property on async generator function frames.
+
+load(libdir + 'asserts.js');
+
+var g = newGlobal({ newCompartment: true });
+var dbg = Debugger(g);
+g.eval(`
+async function* f() {
+ debugger;
+ yield 42;
+ debugger;
+ return 50
+}
+`);
+
+let frame;
+const promises = [];
+dbg.onEnterFrame = function(f) {
+ frame = f;
+ promises.push(["enter", frame.asyncPromise]);
+
+ frame.onPop = function() {
+ promises.push(["leave", frame.asyncPromise]);
+ };
+
+ dbg.onDebuggerStatement = function(f) {
+ assertEq(f, frame);
+ promises.push(["dbg", frame.asyncPromise]);
+ };
+};
+
+
+(async () => {
+ const it = g.f();
+
+ // Promise is null until initial iteration.
+ assertEq(frame.asyncPromise, null);
+
+ assertEq(promises.length, 2);
+ assertEq(promises[0][0], "enter");
+ assertEq(promises[0][1], null);
+
+ assertEq(promises[1][0], "leave");
+ assertEq(promises[1][1], null);
+
+
+ const result1Promise = it.next();
+
+ const frameIt1Promise = frame.asyncPromise;
+ assertEq(frameIt1Promise instanceof Debugger.Object, true);
+ assertEq(frameIt1Promise.unsafeDereference(), result1Promise);
+
+ assertEq(promises.length, 5);
+ assertEq(promises[2][0], "enter");
+ assertEq(promises[2][1], frameIt1Promise);
+
+ assertEq(promises[3][0], "dbg");
+ assertEq(promises[3][1], frameIt1Promise);
+
+ assertEq(promises[4][0], "leave");
+ assertEq(promises[4][1], frameIt1Promise);
+
+ await result1Promise;
+
+ // Iteration step has fully completed, so promise state has been cleared.
+ assertEq(frame.asyncPromise, null);
+
+ assertEq(promises.length, 7);
+ assertEq(promises[5][0], "enter");
+ assertEq(promises[5][1], frameIt1Promise);
+
+ assertEq(promises[6][0], "leave");
+ assertEq(promises[6][1], frameIt1Promise);
+
+
+ const result2Promise = it.next();
+
+ const frameIt2Promise = frame.asyncPromise;
+ assertEq(frameIt2Promise instanceof Debugger.Object, true);
+ assertEq(frameIt2Promise.unsafeDereference(), result2Promise);
+ assertEq(frameIt1Promise !== frameIt2Promise, true);
+
+ assertEq(promises.length, 10);
+ assertEq(promises[7][0], "enter");
+ assertEq(promises[7][1], frameIt2Promise);
+
+ assertEq(promises[8][0], "dbg");
+ assertEq(promises[8][1], frameIt2Promise);
+
+ assertEq(promises[9][0], "leave");
+ assertEq(promises[9][1], frameIt2Promise);
+
+ await result2Promise;
+
+ // Frame has terminated, so accessing the property throws.
+ assertThrowsInstanceOf(() => frame.asyncPromise, Error);
+
+ assertEq(promises.length, 12);
+ assertEq(promises[10][0], "enter");
+ assertEq(promises[10][1], frameIt2Promise);
+
+ assertEq(promises[11][0], "leave");
+ assertEq(promises[11][1], frameIt2Promise);
+})();