summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/onEnterFrame-generator-resumption-02.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/debug/onEnterFrame-generator-resumption-02.js')
-rw-r--r--js/src/jit-test/tests/debug/onEnterFrame-generator-resumption-02.js39
1 files changed, 39 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/debug/onEnterFrame-generator-resumption-02.js b/js/src/jit-test/tests/debug/onEnterFrame-generator-resumption-02.js
new file mode 100644
index 0000000000..fa1a8f233b
--- /dev/null
+++ b/js/src/jit-test/tests/debug/onEnterFrame-generator-resumption-02.js
@@ -0,0 +1,39 @@
+// A Debugger can {return:} from onEnterFrame at any resume point in a generator.
+// Force-returning closes the generator.
+
+load(libdir + "asserts.js");
+
+let g = newGlobal({newCompartment: true});
+g.values = [1, 2, 3];
+g.eval(`function* f() { yield* values; }`);
+
+let dbg = Debugger(g);
+
+// onEnterFrame will fire up to 5 times.
+// - once for the initial call to g.f();
+// - four times at resume points:
+// - initial resume at the top of the generator body
+// - resume after yielding 1
+// - resume after yielding 2
+// - resume after yielding 3 (this resumption will run to the end).
+// This test ignores the initial call and focuses on resume points.
+for (let i = 1; i < 5; i++) {
+ let hits = 0;
+ dbg.onEnterFrame = frame => {
+ return hits++ < i ? undefined : {return: "we're done here"};
+ };
+
+ let genObj = g.f();
+ let actual = [];
+ while (true) {
+ let r = genObj.next();
+ if (r.done) {
+ assertDeepEq(r, {value: "we're done here", done: true});
+ break;
+ }
+ actual.push(r.value);
+ }
+ assertEq(hits, i + 1);
+ assertDeepEq(actual, g.values.slice(0, i - 1));
+ assertDeepEq(genObj.next(), {value: undefined, done: true});
+}