blob: 2ba46b06b32047eb1da3bbb50641b7468ee5a22a (
plain)
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
|
// setVariable works on non-innermost environments.
// (The debuggee code here is a bit convoluted to defeat optimizations that
// could make obj.b a null closure or obj.i a flat closure--that is, a function
// that gets a frozen copy of i instead of a reference to the runtime
// environment that contains it. setVariable does not currently detect this
// flat closure case.)
var g = newGlobal({newCompartment: true});
g.eval("function d() { debugger; }\n" +
"var i = 'FAIL';\n" +
"function a() {\n" +
" var obj = {b: function (i) { d(obj); return i; },\n" +
" i: function () { return i; }};\n" +
" var i = 'FAIL2';\n" +
" return obj;\n" +
"}\n");
var dbg = Debugger(g);
dbg.onDebuggerStatement = function (frame) {
var x = 0;
for (var env = frame.older.environment; env; env = env.parent) {
if (env.getVariable("i") !== undefined)
env.setVariable("i", x++);
}
};
var obj = g.a();
var r = obj.b('FAIL3');
assertEq(r, 0);
assertEq(obj.i(), 1);
assertEq(g.i, 2);
|