summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/Frame-onStep-20.js
blob: e070037c36a7546fa5460f1efed2879d7714dd90 (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
40
41
// Stepping should always pause in a frame between two function calls.

let g = newGlobal({newCompartment: true});
g.evaluate(`
    class X {
        constructor() { this._p = 0; }
        m() { return this; }
        get p() { return this._p; }
        set p(value) { this._p = value; }
    }
    let x = new X;

    function f() { return 1; }
    function inc(x) { return x + 1; }
`);

let dbg = Debugger(g);

// `code` is a snippet of JS that performs two JS calls.
function test(code) {
    let hits = 0;
    let log = "";
    dbg.onEnterFrame = frame => {
        if (hits++ === 0)
            frame.onStep = () => { log += "s"; };
        else
            log += "E";
    };

    g.eval(code);
    assertEq(log.includes("EE"), false, "should have received onStep between onEnterFrame events");
    assertEq(log.match(/^s+Es+Es*$/) !== null, true,
             "should get two calls, with steps before, between, and possibly after");
}

test("f(); f();");
test("f() + f()");
test("inc(f())");
test("x.m().m()");
test("new X().m()");
test("x.p = x.p");  // getter, then setter