michael@0: // Calls to 'eval', etc. by JS primitives get attributed to the point of michael@0: // the primitive's call. michael@0: michael@0: var g = newGlobal(); michael@0: var dbg = new Debugger; michael@0: var gDO = dbg.addDebuggee(g); michael@0: var log = ''; michael@0: michael@0: function outerHandler(frame) { michael@0: log += 'o'; michael@0: var outerScript = frame.script; michael@0: michael@0: dbg.onDebuggerStatement = function (frame) { michael@0: log += 'i'; michael@0: var source = frame.script.source; michael@0: var introScript = source.introductionScript; michael@0: assertEq(introScript, outerScript); michael@0: assertEq(introScript.getOffsetLine(source.introductionOffset), 1234); michael@0: }; michael@0: }; michael@0: michael@0: log = ''; michael@0: dbg.onDebuggerStatement = outerHandler; michael@0: g.evaluate('debugger; ["debugger;"].map(eval)', { lineNumber: 1234 }); michael@0: assertEq(log, 'oi'); michael@0: michael@0: log = ''; michael@0: dbg.onDebuggerStatement = outerHandler; michael@0: g.evaluate('debugger; "debugger;".replace(/.*/, eval);', michael@0: { lineNumber: 1234 }); michael@0: assertEq(log, 'oi'); michael@0: michael@0: michael@0: // If the call takes place in another global, however, we don't record the michael@0: // introduction script. michael@0: log = ''; michael@0: dbg.onDebuggerStatement = function (frame) { michael@0: log += 'd'; michael@0: assertEq(frame.script.source.introductionScript, undefined); michael@0: assertEq(frame.script.source.introductionOffset, undefined); michael@0: }; michael@0: ["debugger;"].map(g.eval); michael@0: "debugger;".replace(/.*/, g.eval); michael@0: assertEq(log, 'dd');