michael@0: // Test .type and .generator fields of topmost stack frame passed to onDebuggerStatement. michael@0: michael@0: var g = newGlobal(); michael@0: var dbg = Debugger(g); michael@0: var expected, hits; michael@0: dbg.onDebuggerStatement = function (f) { michael@0: assertEq(Object.getPrototypeOf(f), Debugger.Frame.prototype); michael@0: assertEq(f.type, expected.type); michael@0: assertEq(f.generator, expected.generator); michael@0: assertEq(f.constructing, expected.constructing); michael@0: hits++; michael@0: }; michael@0: michael@0: function test(code, expectobj, expectedHits) { michael@0: expected = expectobj; michael@0: hits = 0; michael@0: g.evaluate(code); michael@0: assertEq(hits, arguments.length < 3 ? 1 : expectedHits); michael@0: } michael@0: michael@0: test("debugger;", {type: "global", generator: false, constructing: false}); michael@0: test("(function () { debugger; })();", {type: "call", generator: false, constructing: false}); michael@0: test("new function() { debugger; };", {type: "call", generator: false, constructing: true}); michael@0: test("new function () { (function() { debugger; })(); }", {type: "call", generator: false, constructing: false}); michael@0: test("eval('debugger;');", {type: "eval", generator: false, constructing: false}); michael@0: test("this.eval('debugger;'); // indirect eval", {type: "eval", generator: false, constructing: false}); michael@0: test("(function () { eval('debugger;'); })();", {type: "eval", generator: false, constructing: false}); michael@0: test("new function () { eval('debugger'); }", {type: "eval", generator: false, constructing: false}); michael@0: test("function gen() { debugger; yield 1; debugger; }\n" + michael@0: "for (var x in gen()) {}\n", michael@0: {type: "call", generator: true, constructing: false}, 2); michael@0: test("var iter = (function* stargen() { debugger; yield 1; debugger; })();\n" + michael@0: "iter.next(); iter.next();", michael@0: {type: "call", generator: true, constructing: false}, 2);