]>
Commit | Line | Data |
---|---|---|
b37bf2e1 A |
1 | /* |
2 | * The contents of this file are subject to the Netscape Public | |
3 | * License Version 1.1 (the "License"); you may not use this file | |
4 | * except in compliance with the License. You may obtain a copy of | |
5 | * the License at http://www.mozilla.org/NPL/ | |
6 | * | |
7 | * Software distributed under the License is distributed on an "AS | |
8 | * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | |
9 | * implied. See the License for the specific language governing | |
10 | * rights and limitations under the License. | |
11 | * | |
12 | * The Original Code is mozilla.org code. | |
13 | * | |
14 | * The Initial Developer of the Original Code is Netscape | |
15 | * Communications Corporation. Portions created by Netscape are | |
16 | * Copyright (C) 1998 Netscape Communications Corporation. All | |
17 | * Rights Reserved. | |
18 | * | |
19 | * Contributor(s): brendan@mozilla.org, pschwartau@netscape.com | |
20 | * Date: 15 Feb 2001 | |
21 | * | |
22 | * SUMMARY: self.eval(str) inside a function | |
23 | * NOTE: 'self' is just a variable used to capture the global JS object. | |
24 | * | |
25 | * See http://bugzilla.mozilla.org/show_bug.cgi?id=68498 | |
26 | * See http://bugzilla.mozilla.org/showattachment.cgi?attach_id=25251 | |
27 | * See http://bugzilla.mozilla.org/show_bug.cgi?id=69441 (!!!) | |
28 | * | |
29 | * Brendan: | |
30 | * | |
31 | * "ECMA-262 Edition 3, 10.1.3 requires a FunctionDeclaration parsed as part | |
32 | * of a Program by eval to create a property of eval's caller's variable object. | |
33 | * This test evals in the body of a with statement, whose scope chain *is* | |
34 | * relevant to the effect of parsing the FunctionDeclaration." | |
35 | */ | |
36 | //------------------------------------------------------------------------------------------------- | |
37 | var bug = 68498; | |
38 | var summary = 'Testing self.eval(str) inside a function'; | |
39 | var statprefix = '; currently at expect['; | |
40 | var statsuffix = '] within test -'; | |
41 | var sToEval=''; | |
42 | var actual=[ ]; | |
43 | var expect=[ ]; | |
44 | ||
45 | ||
46 | // Capture a reference to the global object - | |
47 | var self = this; | |
48 | ||
49 | // You shouldn't see this global variable's value in any printout - | |
50 | var x = 'outer'; | |
51 | ||
52 | // This function is the heart of the test - | |
53 | function f(o,s,x) {with(o) eval(s); return z;}; | |
54 | ||
55 | // Run-time statements to pass to the eval inside f | |
56 | sToEval += 'actual[0] = typeof g;' | |
57 | sToEval += 'function g(){actual[1]=(typeof w == "undefined" || w); return x};' | |
58 | sToEval += 'actual[2] = w;' | |
59 | sToEval += 'actual[3] = typeof g;' | |
60 | sToEval += 'var z=g();' | |
61 | ||
62 | // Set the actual-results array. The next line will set actual[0] - actual[4] in one shot | |
63 | actual[4] = f({w:44}, sToEval, 'inner'); | |
64 | actual[5] = 'z' in self && z; | |
65 | ||
66 | ||
67 | /* Set the expected-results array. | |
68 | * | |
69 | * Sample issue: why do we set expect[4] = 'inner'? Look at actual[4]... | |
70 | * 1. The return value of f equals z, which is not defined at compile-time | |
71 | * 2. At run-time (via with(o) eval(s) inside f), z is defined as the return value of g | |
72 | * 3. At run-time (via with(o) eval(s) inside f), g is defined to return x | |
73 | * 4. In the scope of with(o), x is undefined | |
74 | * 5. Farther up the scope chain, x can be located as an argument of f | |
75 | * 6. The value of this argument at run-time is 'inner' | |
76 | * 7. Even farther up the scope chain, the name x can be found as a global variable | |
77 | * 8. The value of this global variable is 'outer', but we should NOT have gone | |
78 | * this far up the scope chain to find x...therefore we expect 'inner' | |
79 | */ | |
80 | expect[0] = 'function'; | |
81 | expect[1] = 44; | |
82 | expect[2] = 44; | |
83 | expect[3] = 'function'; | |
84 | expect[4] = 'inner'; | |
85 | expect[5] = false; | |
86 | ||
87 | ||
88 | ||
89 | //------------------------------------------------------------------------------------------------ | |
90 | test(); | |
91 | //------------------------------------------------------------------------------------------------- | |
92 | ||
93 | ||
94 | function test() | |
95 | { | |
96 | enterFunc ('test'); | |
97 | printBugNumber (bug); | |
98 | printStatus (summary); | |
99 | ||
100 | for (var i in expect) | |
101 | { | |
102 | reportCompare(expect[i], actual[i], getStatus(i)); | |
103 | } | |
104 | ||
105 | exitFunc ('test'); | |
106 | } | |
107 | ||
108 | ||
109 | function getStatus(i) | |
110 | { | |
111 | return (summary + statprefix + i + statsuffix); | |
112 | } |