summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/Promise-race-dependent-promises.js
blob: 196d29aeaed11dc7c5ee3a1e3d1cf7610d29df55 (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
42
43
44
45
46
// Promise.race(...) may add a dummy PromiseReaction which is only used for the
// debugger.
//
// See BlockOnPromise when called from PerformPromiseRace for when this dummy
// reaction is created.

var g = newGlobal({newCompartment: true});
var dbg = new Debugger();
var gw = dbg.addDebuggee(g);

function test(withFastPath) {
    g.eval(`
        function newPromiseCapability() {
            var resolve, reject, promise = new Promise(function(r1, r2) {
                resolve = r1;
                reject = r2;
            });
            return {promise, resolve, reject};
        }

        var {promise: alwaysPending} = newPromiseCapability();

        if (!${withFastPath}) {
            // Disable the BlockOnPromise fast path by giving |alwaysPending| a
            // non-default "then" function property. This will ensure the dummy
            // reaction is created.
            alwaysPending.then = function() {};
        }

        var result = Promise.race([alwaysPending]);
    `);

    var alwaysPending = gw.makeDebuggeeValue(g.alwaysPending);
    var result = gw.makeDebuggeeValue(g.result);

    assertEq(alwaysPending.promiseDependentPromises.length, 1);
    assertEq(alwaysPending.promiseDependentPromises[0], result);

    assertEq(result.promiseDependentPromises.length, 0);
}

// No dummy reaction created when the fast path is taken.
test(true);

// Dummy reaction is created when we can't take the fast path.
test(false);