Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
1 // tests calling script functions via Debugger.Object.prototype.apply/call
3 load(libdir + "asserts.js");
5 var g = newGlobal();
6 g.eval("function f() { debugger; }");
7 var dbg = new Debugger(g);
9 var hits = 0;
10 function test(usingApply) {
11 dbg.onDebuggerStatement = function (frame) {
12 var fn = frame.arguments[0];
13 var cv = usingApply ? fn.apply(null, [9, 16]) : fn.call(null, 9, 16);
14 assertEq(Object.keys(cv).join(","), "return");
15 assertEq(Object.getPrototypeOf(cv), Object.prototype);
16 assertEq(cv.return, 25);
18 cv = usingApply ? fn.apply(null, ["hello ", "world"]) : fn.call(null, "hello ", "world");
19 assertEq(Object.keys(cv).join(","), "return");
20 assertEq(cv.return, "hello world");
22 // Handle more or less arguments.
23 assertEq((usingApply ? fn.apply(null, [1, 5, 100]) : fn.call(null, 1, 5, 100)).return, 6);
24 assertEq((usingApply ? fn.apply(null, []) : fn.call(null)).return, NaN);
25 assertEq((usingApply ? fn.apply() : fn.call()).return, NaN);
27 // Throw if a this-value or argument is an object but not a Debugger.Object.
28 assertThrowsInstanceOf(function () { usingApply ? fn.apply({}, []) : fn.call({}); },
29 TypeError);
30 assertThrowsInstanceOf(function () { usingApply ? fn.apply(null, [{}]) : fn.call(null, {}); },
31 TypeError);
32 hits++;
33 };
34 g.eval("f(function (a, b) { return a + b; });");
36 // The callee receives the right arguments even if more arguments are provided
37 // than the callee's .length.
38 dbg.onDebuggerStatement = function (frame) {
39 assertEq((usingApply ? frame.arguments[0].apply(null, ['one', 'two'])
40 : frame.arguments[0].call(null, 'one', 'two')).return,
41 2);
42 hits++;
43 };
44 g.eval("f(function () { return arguments.length; });");
46 // Exceptions are reported as {throw:} completion values.
47 dbg.onDebuggerStatement = function (frame) {
48 var lose = frame.arguments[0];
49 var cv = usingApply ? lose.apply(null, []) : lose.call(null);
50 assertEq(Object.keys(cv).join(","), "throw");
51 assertEq(cv.throw, frame.callee);
52 hits++;
53 };
54 g.eval("f(function lose() { throw f; });");
55 }
57 test(true);
58 test(false);
59 assertEq(hits, 6);