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");