summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/onEnterFrame-generator-resumption-02.js
blob: fa1a8f233b0c378c27e447d1550480fc56987142 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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});
}