Environment-setVariable-10.js (1070B)
1 // setVariable works on non-innermost environments. 2 3 // (The debuggee code here is a bit convoluted to defeat optimizations that 4 // could make obj.b a null closure or obj.i a flat closure--that is, a function 5 // that gets a frozen copy of i instead of a reference to the runtime 6 // environment that contains it. setVariable does not currently detect this 7 // flat closure case.) 8 9 var g = newGlobal({newCompartment: true}); 10 g.eval("function d() { debugger; }\n" + 11 "var i = 'FAIL';\n" + 12 "function a() {\n" + 13 " var obj = {b: function (i) { d(obj); return i; },\n" + 14 " i: function () { return i; }};\n" + 15 " var i = 'FAIL2';\n" + 16 " return obj;\n" + 17 "}\n"); 18 19 var dbg = Debugger(g); 20 dbg.onDebuggerStatement = function (frame) { 21 var x = 0; 22 for (var env = frame.older.environment; env; env = env.parent) { 23 if (env.getVariable("i") !== undefined) 24 env.setVariable("i", x++); 25 } 26 }; 27 28 var obj = g.a(); 29 var r = obj.b('FAIL3'); 30 assertEq(r, 0); 31 assertEq(obj.i(), 1); 32 assertEq(g.i, 2);