Environment-inspectable-01.js (2271B)
1 // Environments are only inspectable while their globals are debuggees. 2 3 load(libdir + 'asserts.js'); 4 5 var g1 = newGlobal({newCompartment: true}); 6 var g2 = newGlobal({newCompartment: true}); 7 g2.g1 = g1; 8 g1.g2 = g2; 9 10 g1.eval('function f(xf) { return function h(xh) { eval(""); debugger; } }'); 11 g1.eval('var h = f("value of xf");'); 12 13 // To ensure that xk gets located on the heap, and thus outlives its stack frame, we 14 // store a function that captures it here. Kind of a kludge. 15 g2.eval('var capture;'); 16 g2.eval('function k(xk) { capture = function () { return xk; }; g1.h("value of xh"); }'); 17 18 var dbg = new Debugger; 19 dbg.addDebuggee(g1); 20 dbg.addDebuggee(g2); 21 22 dbg.onDebuggerStatement = debuggerHandler; 23 24 var log = ''; 25 26 g1.eval('g2.k("value of xk");'); 27 28 var he, ke, ee; 29 30 function debuggerHandler(frame) { 31 log += 'd'; 32 33 assertEq(frame.type, 'call'); 34 he = frame.environment; 35 36 assertEq(frame.older.type, 'call'); 37 ke = frame.older.environment; 38 39 assertEq(frame.older.older.type, 'eval'); 40 ee = frame.older.older.environment; 41 42 assertEq(he.inspectable, true); 43 assertEq(he.getVariable('xh'), 'value of xh'); 44 assertEq(he.parent.parent.getVariable('xf'), 'value of xf'); 45 assertEq(ke.inspectable, true); 46 assertEq(ke.getVariable('xk'), 'value of xk'); 47 assertEq(ee.inspectable, true); 48 assertEq(ee.type, 'declarative'); 49 assertEq(ee.parent.type, 'object'); 50 51 dbg.removeDebuggee(g2); 52 53 assertEq(he.inspectable, true); 54 assertEq(he.type, 'declarative'); 55 assertEq(ke.inspectable, false); 56 assertThrowsInstanceOf(() => ke.getVariable('xk'), Error); 57 assertEq(ee.inspectable, true); 58 assertEq(ee.type, 'declarative'); 59 assertEq(ee.parent.type, 'object'); 60 61 dbg.removeDebuggee(g1); 62 63 assertEq(he.inspectable, false); 64 assertThrowsInstanceOf(() => he.getVariable('xh'), Error); 65 assertEq(ke.inspectable, false); 66 assertThrowsInstanceOf(() => ke.getVariable('xk'), Error); 67 assertEq(ee.inspectable, false); 68 assertThrowsInstanceOf(() => ee.type, Error); 69 } 70 71 assertEq(log, 'd'); 72 73 dbg.addDebuggee(g2); 74 75 assertEq(he.inspectable, false); 76 assertThrowsInstanceOf(() => he.getVariable('xh'), Error); 77 assertEq(ke.inspectable, true); 78 assertEq(ke.getVariable('xk'), 'value of xk'); 79 assertEq(ee.inspectable, false); 80 assertThrowsInstanceOf(() => ee.type, Error);