summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/onEnterFrame-generator-04.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/debug/onEnterFrame-generator-04.js')
-rw-r--r--js/src/jit-test/tests/debug/onEnterFrame-generator-04.js44
1 files changed, 44 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/debug/onEnterFrame-generator-04.js b/js/src/jit-test/tests/debug/onEnterFrame-generator-04.js
new file mode 100644
index 0000000000..00f9d0f3b4
--- /dev/null
+++ b/js/src/jit-test/tests/debug/onEnterFrame-generator-04.js
@@ -0,0 +1,44 @@
+// When a generator frame is resumed, the onEnterFrame fires again.
+// The same Frame object is passed.
+
+let g = newGlobal({newCompartment: true});
+g.eval(`
+ function* easyMode() {}
+
+ function* f() { yield* "XYZ"; }
+ function* hardMode() {
+ for (let c1 of "AB")
+ for (let c2 of f())
+ yield c1 + c2;
+ }
+`);
+
+function test(mode, expected) {
+ let dbg = new Debugger(g);
+ let nextid = 1;
+ dbg.onEnterFrame = frame => {
+ if (frame.type == "call") {
+ if (!("id" in frame))
+ frame.id = nextid++;
+ g.log += frame.id + "(";
+
+ frame.onPop = rv => {
+ g.log += ")";
+ };
+ }
+ };
+
+ g.log = "";
+ g.eval(`
+ for (let x of ${mode}())
+ log += x;
+ `);
+ assertEq(g.log, expected);
+ dbg.removeDebuggee(g);
+}
+
+// We fire onEnterFrame for the initial activation when a generator is first
+// called, even though the initial yield happens before any body code. This is
+// weird but at least it's consistent.
+test("easyMode", "1()1()");
+test("hardMode", "1()1(2()2())AX1(2())AY1(2())AZ1(2()3()3())BX1(3())BY1(3())BZ1(3())");