// Debugger.Environment.prototype.callee reveals the callee of environments // that have them. var g = newGlobal(); var dbg = new Debugger; var gw = dbg.addDebuggee(g); function check(code, expectedType, expectedCallee) { print("check(" + uneval(code) + ")"); var hits; dbg.onDebuggerStatement = function (frame) { hits++; var env = frame.environment; assertEq(env.type, expectedType); assertEq(env.callee, expectedCallee); }; hits = 0; g.eval(code); assertEq(hits, 1); } check('debugger;', 'declarative', null); check('with({}) { debugger; };', 'with', null); check('{ let x=1; debugger; };', 'declarative', null); g.eval('function f() { debugger; }'); check('f()', 'declarative', gw.makeDebuggeeValue(g.f)); g.eval('function g() { h(); }'); g.eval('function h() { debugger; }'); check('g()', 'declarative', gw.makeDebuggeeValue(g.h)); // All evals get a lexical scope. check('"use strict"; eval("debugger");', 'declarative', null); g.eval('function j() { "use strict"; eval("debugger;"); }'); check('j()', 'declarative', null); // All evals get a lexical scope. check('eval("debugger");', 'declarative', null); g.eval('function m() { debugger; yield true; }'); check('m().next();', 'declarative', gw.makeDebuggeeValue(g.m)); g.eval('function n() { { let x = 1; debugger; } }'); check('n()', 'declarative', null); g.eval('function* o() { debugger; yield true; }'); check('o().next();', 'declarative', gw.makeDebuggeeValue(g.o));