michael@0: // Debugger.Environment.prototype.callee reveals the callee of environments michael@0: // that have them. michael@0: michael@0: var g = newGlobal(); michael@0: var dbg = new Debugger; michael@0: var gw = dbg.addDebuggee(g); michael@0: michael@0: function check(code, expectedType, expectedCallee) { michael@0: print("check(" + uneval(code) + ")"); michael@0: var hits; michael@0: dbg.onDebuggerStatement = function (frame) { michael@0: hits++; michael@0: var env = frame.environment; michael@0: assertEq(env.type, expectedType); michael@0: assertEq(env.callee, expectedCallee); michael@0: }; michael@0: hits = 0; michael@0: g.eval(code); michael@0: assertEq(hits, 1); michael@0: } michael@0: michael@0: check('debugger;', 'object', null); michael@0: check('with({}) { debugger; };', 'with', null); michael@0: check('let (x=1) { debugger; };', 'declarative', null); michael@0: michael@0: g.eval('function f() { debugger; }'); michael@0: check('f()', 'declarative', gw.makeDebuggeeValue(g.f)); michael@0: michael@0: g.eval('function g() { h(); }'); michael@0: g.eval('function h() { debugger; }'); michael@0: check('g()', 'declarative', gw.makeDebuggeeValue(g.h)); michael@0: michael@0: // Strict direct eval gets its own environment. michael@0: check('"use strict"; eval("debugger");', 'declarative', null); michael@0: g.eval('function j() { "use strict"; eval("debugger;"); }'); michael@0: check('j()', 'declarative', null); michael@0: michael@0: // Lenient direct eval shares eval's caller's environment, michael@0: // although this is a great evil. michael@0: check('eval("debugger");', 'object', null); michael@0: g.eval('function k() { eval("debugger;"); }'); michael@0: check('k()', 'declarative', gw.makeDebuggeeValue(g.k)); michael@0: michael@0: g.eval('function m() { debugger; yield true; }'); michael@0: check('m().next();', 'declarative', gw.makeDebuggeeValue(g.m)); michael@0: michael@0: g.eval('function n() { let (x = 1) { debugger; } }'); michael@0: check('n()', 'declarative', null); michael@0: michael@0: g.eval('function* o() { debugger; yield true; }'); michael@0: check('o().next();', 'declarative', gw.makeDebuggeeValue(g.o));