2008-06-08 Cameron Zwarich <cwzwarich@uwaterloo.ca>
[WebKit-https.git] / LayoutTests / fast / js / function-dot-arguments-and-caller.html
1 <p>This page tests function.caller and function.arguments in interesting nested scopes.
2 </p>
3 <p>If the test passes, you'll see a series of PASS messages below.
4 </p>
5 <pre id="console"></pre>
6
7 <script>
8 function log(s)
9 {
10     document.getElementById("console").appendChild(document.createTextNode(s + "\n"));
11 }
12
13 if (window.layoutTestController)
14     layoutTestController.dumpAsText();
15
16 function f() { return this.eval('f.arguments instanceof Object ? "PASS" : "FAIL"'); }
17
18 var resultArray = [
19 // ----- arguments -----
20
21 // function scope inside global eval scope, uncalled function
22 (function g() { return this.eval('f.arguments instanceof Object ? "FAIL" : "PASS"'); })(),
23
24 // function scope inside local eval scope, uncalled function
25 (function g() { return eval('f.arguments instanceof Object ? "FAIL" : "PASS"'); })(),
26
27 // global eval scope, called function
28 f(),
29
30 // local eval scope, called function
31 (function f() { return eval('f.arguments instanceof Object ? "PASS" : "FAIL"'); })(),
32
33 // eval scope, uncalled function
34 eval('(function () { }).arguments instanceof Object ? "FAIL" : "PASS"'),
35
36 // re-entrant function scope, outer called function
37 (function f() {
38     return String({ toString: function g() { return f.arguments instanceof Object ? "PASS" : "FAIL"; } });
39 })(),
40
41 // re-entrant function scope, inner called function
42 (function f() {
43     return String({ toString: function g() { return g.arguments instanceof Object ? "PASS" : "FAIL"; } });
44 })(),
45
46 // function scope, outer called function
47 (function f() {
48     return (function g() {
49         return f.arguments instanceof Object ? "PASS" : "FAIL";
50     })();
51 })(),
52
53 // function scope, inner called function
54 (function f() {
55     return (function g() {
56         return g.arguments instanceof Object ? "PASS" : "FAIL";
57     })();
58 })(),
59
60 // function scope, uncalled function
61 (function f() {
62     return (function g() { }).arguments instanceof Object ? "FAIL" : "PASS";
63 })(),
64
65 // global scope, uncalled function
66 (function () { }).arguments instanceof Object ? "FAIL" : "PASS",
67
68 // ----- caller -----
69
70 (function f() {
71     return (function g() {
72         return g.caller instanceof Object ? "PASS" : "FAIL";
73     })();
74 })(),
75
76 (function f() { return f.caller instanceof Object ? "FAIL" : "PASS"; })(),
77
78 (function () { }).caller instanceof Object ? "FAIL" : "PASS",
79
80 eval('(function f() { return f.caller instanceof Object ? "FAIL" : "PASS"; })()'),
81
82 (function f() {
83     return String({ toString: function g() { return g.caller instanceof Object ? "FAIL" : "PASS"; } });
84 })(),
85
86 (function f() {
87     function g() { return h.apply(this); }
88     function h() { return k(); }
89     function k() { return k.caller instanceof Object ? "PASS" : "FAIL"; }
90     
91     return g();
92 })()
93 ];
94
95 log(resultArray);
96 </script>