1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
// 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));
|