tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

onDebuggerStatement-async-generator-resumption-01.js (1491B)


      1 // A Debugger can {return:} from onDebuggerStatement in an async generator.
      2 // A resolved promise for a {value: _, done: true} object is returned.
      3 
      4 load(libdir + "asserts.js");
      5 
      6 let g = newGlobal({newCompartment: true});
      7 g.eval(`
      8    async function* f(x) {
      9        debugger;  // when==0 to force return here
     10        await x;
     11        yield 1;
     12        debugger;  // when==1 to force return here
     13    }
     14 `);
     15 
     16 let exc = null;
     17 let dbg = new Debugger;
     18 let gw = dbg.addDebuggee(g);
     19 function test(when) {
     20    let hits = 0;
     21    let outcome = "FAIL";
     22    dbg.onDebuggerStatement = frame => {
     23        if (hits++ == when)
     24            return {return: "ponies"};
     25    };
     26 
     27    let iter = g.f(0);
     28 
     29    // At the initial suspend.
     30    assertEq(hits, 0);
     31    iter.next().then(result => {
     32        // At the yield point, unless we already force-returned from the first
     33        // debugger statement.
     34        assertEq(hits, 1);
     35        if (when == 0)
     36            return result;
     37        assertEq(result.value, 1);
     38        assertEq(result.done, false);
     39        return iter.next();
     40    }).then(result => {
     41        // After forced return.
     42        assertEq(hits, when + 1);
     43        assertEq(result.value, "ponies");
     44        assertEq(result.done, true);
     45        outcome = "pass";
     46    }).catch(e => {
     47        // An assertion failed.
     48        exc = e;
     49    });
     50 
     51    assertEq(hits, 1);
     52    drainJobQueue();
     53    if (exc !== null)
     54        throw exc;
     55    assertEq(outcome, "pass");
     56 }
     57 
     58 for (let i = 0; i < 2; i++) {
     59    test(i);
     60 }