Source code

Revision control

Copy as Markdown

Other Tools

var g = newGlobal({newCompartment: true});
var dbg = new Debugger(g);
g.eval(`
function f() {
// |this| in arrow-functions refers to the |this| binding in outer functions.
// So when |frame.eval("this")| is executed, the outer |this| binding should
// be returned, unless it has been optimised out.
(() => {})();
// Ensure a |this| binding is created for |f|.
return this;
}
`);
var errors = [];
function enterFrame(frame) {
// Disable the handler so we don't call it recursively through |frame.eval|.
dbg.onEnterFrame = undefined;
// Store the error when resolving |this| was unsuccessful.
var r = frame.eval("this");
if (r.throw) {
errors.push(r.throw);
}
// Re-enable the handler.
dbg.onEnterFrame = enterFrame;
};
dbg.onEnterFrame = enterFrame;
g.f();
assertEq(errors.length, 1);
assertEq(errors[0].unsafeDereference().toString(),
"Error: variable 'this' has been optimized out");