// Test the promise property on async generator function frames.
load(libdir + 'asserts.js' );
var g = newGlobal({ newCompartment: true });
var dbg = Debugger(g);
g.eval(`
async function * f() {
debugger;
yield 42 ;
debugger;
return 50
}
`);
let frame;
const promises = [];
dbg.onEnterFrame = function (f) {
frame = f;
promises.push(["enter" , frame.asyncPromise]);
frame.onPop = function () {
promises.push(["leave" , frame.asyncPromise]);
};
dbg.onDebuggerStatement = function (f) {
assertEq(f, frame);
promises.push(["dbg" , frame.asyncPromise]);
};
};
(async () => {
const it = g.f();
// Promise is null until initial iteration.
assertEq(frame.asyncPromise, null );
assertEq(promises.length, 2 );
assertEq(promises[0 ][0 ], "enter" );
assertEq(promises[0 ][1 ], null );
assertEq(promises[1 ][0 ], "leave" );
assertEq(promises[1 ][1 ], null );
const result1Promise = it.next();
const frameIt1Promise = frame.asyncPromise;
assertEq(frameIt1Promise instanceof Debugger.Object, true );
assertEq(frameIt1Promise.unsafeDereference(), result1Promise);
assertEq(promises.length, 5 );
assertEq(promises[2 ][0 ], "enter" );
assertEq(promises[2 ][1 ], frameIt1Promise);
assertEq(promises[3 ][0 ], "dbg" );
assertEq(promises[3 ][1 ], frameIt1Promise);
assertEq(promises[4 ][0 ], "leave" );
assertEq(promises[4 ][1 ], frameIt1Promise);
await result1Promise;
// Iteration step has fully completed, so promise state has been cleared.
assertEq(frame.asyncPromise, null );
assertEq(promises.length, 7 );
assertEq(promises[5 ][0 ], "enter" );
assertEq(promises[5 ][1 ], frameIt1Promise);
assertEq(promises[6 ][0 ], "leave" );
assertEq(promises[6 ][1 ], frameIt1Promise);
const result2Promise = it.next();
const frameIt2Promise = frame.asyncPromise;
assertEq(frameIt2Promise instanceof Debugger.Object, true );
assertEq(frameIt2Promise.unsafeDereference(), result2Promise);
assertEq(frameIt1Promise !== frameIt2Promise, true );
assertEq(promises.length, 10 );
assertEq(promises[7 ][0 ], "enter" );
assertEq(promises[7 ][1 ], frameIt2Promise);
assertEq(promises[8 ][0 ], "dbg" );
assertEq(promises[8 ][1 ], frameIt2Promise);
assertEq(promises[9 ][0 ], "leave" );
assertEq(promises[9 ][1 ], frameIt2Promise);
await result2Promise;
// Frame has terminated, so accessing the property throws.
assertThrowsInstanceOf(() => frame.asyncPromise, Error);
assertEq(promises.length, 12 );
assertEq(promises[10 ][0 ], "enter" );
assertEq(promises[10 ][1 ], frameIt2Promise);
assertEq(promises[11 ][0 ], "leave" );
assertEq(promises[11 ][1 ], frameIt2Promise);
})();
Messung V0.5 in Prozent C=95 H=86 G=90
¤ Dauer der Verarbeitung: 0.2 Sekunden
¤
*© Formatika GbR, Deutschland