|
1 // Any copyright is dedicated to the Public Domain. |
|
2 // http://creativecommons.org/licenses/publicdomain/ |
|
3 |
|
4 //----------------------------------------------------------------------------- |
|
5 var BUGNUMBER = 616294; |
|
6 var summary = |
|
7 "|delete x| inside a function in eval code, where that eval code includes " + |
|
8 "|var x| at top level, actually does delete the binding for x"; |
|
9 |
|
10 print(BUGNUMBER + ": " + summary); |
|
11 |
|
12 /************** |
|
13 * BEGIN TEST * |
|
14 **************/ |
|
15 |
|
16 var f; |
|
17 |
|
18 function testOuterVar() |
|
19 { |
|
20 return eval("var x; (function() { return delete x; })"); |
|
21 } |
|
22 |
|
23 f = testOuterVar(); |
|
24 |
|
25 assertEq(f(), true); // configurable, so remove => true |
|
26 assertEq(f(), true); // not there => true (only non-configurable => false) |
|
27 |
|
28 |
|
29 function testOuterFunction() |
|
30 { |
|
31 return eval("function x() { } (function() { return delete x; })"); |
|
32 } |
|
33 |
|
34 f = testOuterFunction(); |
|
35 |
|
36 assertEq(f(), true); // configurable, so remove => true |
|
37 assertEq(f(), true); // not there => true (only non-configurable => false) |
|
38 |
|
39 |
|
40 function testOuterForVar() |
|
41 { |
|
42 return eval("for (var x; false; ); (function() { return delete x; })"); |
|
43 } |
|
44 |
|
45 f = testOuterForVar(); |
|
46 |
|
47 assertEq(f(), true); // configurable, so remove => true |
|
48 assertEq(f(), true); // not there => true (only non-configurable => false) |
|
49 |
|
50 |
|
51 function testOuterForInVar() |
|
52 { |
|
53 return eval("for (var x in {}); (function() { return delete x; })"); |
|
54 } |
|
55 |
|
56 f = testOuterForInVar(); |
|
57 |
|
58 assertEq(f(), true); // configurable, so remove => true |
|
59 assertEq(f(), true); // not there => true (only non-configurable => false) |
|
60 |
|
61 |
|
62 function testOuterNestedVar() |
|
63 { |
|
64 return eval("for (var q = 0; q < 5; q++) { var x; } (function() { return delete x; })"); |
|
65 } |
|
66 |
|
67 f = testOuterNestedVar(); |
|
68 |
|
69 assertEq(f(), true); // configurable, so remove => true |
|
70 assertEq(f(), true); // not there => true (only non-configurable => false) |
|
71 |
|
72 |
|
73 function testOuterNestedConditionalVar() |
|
74 { |
|
75 return eval("for (var q = 0; q < 5; q++) { if (false) { var x; } } (function() { return delete x; })"); |
|
76 } |
|
77 |
|
78 f = testOuterNestedConditionalVar(); |
|
79 |
|
80 assertEq(f(), true); // configurable, so remove => true |
|
81 assertEq(f(), true); // not there => true (only non-configurable => false) |
|
82 |
|
83 |
|
84 function testVarInWith() |
|
85 { |
|
86 return eval("with ({}) { var x; } (function() { return delete x; })"); |
|
87 } |
|
88 |
|
89 f = testVarInWith(); |
|
90 |
|
91 assertEq(f(), true); // configurable, so remove => true |
|
92 assertEq(f(), true); // not there => true (only non-configurable => false) |
|
93 |
|
94 |
|
95 function testForVarInWith() |
|
96 { |
|
97 return eval("with ({}) { for (var x = 0; x < 5; x++); } (function() { return delete x; })"); |
|
98 } |
|
99 |
|
100 f = testForVarInWith(); |
|
101 |
|
102 assertEq(f(), true); // configurable, so remove => true |
|
103 assertEq(f(), true); // not there => true (only non-configurable => false) |
|
104 |
|
105 |
|
106 function testForInVarInWith() |
|
107 { |
|
108 return eval("with ({}) { for (var x in {}); } (function() { return delete x; })"); |
|
109 } |
|
110 |
|
111 f = testForInVarInWith(); |
|
112 |
|
113 assertEq(f(), true); // configurable, so remove => true |
|
114 assertEq(f(), true); // not there => true (only non-configurable => false) |
|
115 |
|
116 |
|
117 function testUnknown() |
|
118 { |
|
119 return eval("nameToDelete = 17; (function() { return delete nameToDelete; })"); |
|
120 } |
|
121 |
|
122 f = testUnknown(); |
|
123 |
|
124 assertEq(f(), true); // configurable global property, so remove => true |
|
125 assertEq(f(), true); // not there => true (only non-configurable => false) |
|
126 |
|
127 |
|
128 function testArgumentShadow() |
|
129 { |
|
130 return eval("var x; (function(x) { return delete x; })"); |
|
131 } |
|
132 |
|
133 f = testArgumentShadow(); |
|
134 |
|
135 assertEq(f(), false); // non-configurable argument => false |
|
136 |
|
137 |
|
138 function testArgument() |
|
139 { |
|
140 return eval("(function(x) { return delete x; })"); |
|
141 } |
|
142 |
|
143 f = testArgument(); |
|
144 |
|
145 assertEq(f(), false); // non-configurable argument => false |
|
146 |
|
147 |
|
148 function testFunctionLocal() |
|
149 { |
|
150 return eval("(function() { var x; return delete x; })"); |
|
151 } |
|
152 |
|
153 f = testFunctionLocal(); |
|
154 |
|
155 assertEq(f(), false); // defined by function code => not configurable => false |
|
156 |
|
157 |
|
158 /******************************************************************************/ |
|
159 |
|
160 if (typeof reportCompare === "function") |
|
161 reportCompare(true, true); |
|
162 |
|
163 print("All tests passed!"); |