michael@0: // |jit-test| debug michael@0: // The onExceptionUnwind hook is called multiple times as the stack unwinds. michael@0: michael@0: var g = newGlobal(); michael@0: g.debuggeeGlobal = this; michael@0: g.dbg = null; michael@0: g.eval("(" + function () { michael@0: dbg = new Debugger(debuggeeGlobal); michael@0: dbg.onExceptionUnwind = function (frame, exc) { michael@0: assertEq(frame instanceof Debugger.Frame, true); michael@0: assertEq(exc instanceof Debugger.Object, true); michael@0: var s = '!'; michael@0: for (var f = frame; f; f = f.older) michael@0: if (f.type === "call") michael@0: s += f.callee.name; michael@0: s += ', '; michael@0: debuggeeGlobal.log += s; michael@0: }; michael@0: } + ")();"); michael@0: michael@0: var log; michael@0: michael@0: function k() { michael@0: try { michael@0: throw new Error("oops"); // hook call 1 michael@0: } finally { michael@0: log += 'k-finally, '; michael@0: } // hook call 2 michael@0: } michael@0: michael@0: function j() { michael@0: k(); // hook call 3 michael@0: log += 'j-unreached, '; michael@0: } michael@0: michael@0: function h() { michael@0: try { michael@0: j(); // hook call 4 michael@0: log += 'h-unreached, '; michael@0: } catch (exc) { michael@0: log += 'h-catch, '; michael@0: throw exc; // hook call 5 michael@0: } michael@0: } michael@0: michael@0: function f() { michael@0: try { michael@0: h(); // hook call 6 michael@0: } catch (exc) { michael@0: log += 'f-catch, '; michael@0: } michael@0: log += 'f-after, '; michael@0: } michael@0: michael@0: log = ''; michael@0: f(); michael@0: g.dbg.enabled = false; michael@0: assertEq(log, '!kjhf, k-finally, !kjhf, !jhf, !hf, h-catch, !hf, !f, f-catch, f-after, ');