2 * Any copyright is dedicated to the Public Domain.
3 * http://creativecommons.org/licenses/publicdomain/
6 //-----------------------------------------------------------------------------
7 var BUGNUMBER = 577325;
8 var summary = 'Implement the ES5 algorithm for processing function statements';
10 print(BUGNUMBER + ": " + summary);
18 ///////////////////////////////////////////////////
19 // Function definitions over accessor properties //
20 ///////////////////////////////////////////////////
22 var getCalled, setCalled;
24 // configurable properties get blown away
26 getCalled = false, setCalled = false;
27 Object.defineProperty(this, "acc1",
29 get: function() { getCalled = true; throw "FAIL get 1"; },
30 set: function(v) { setCalled = true; throw "FAIL set 1 " + v; },
37 eval("function acc1() { throw 'FAIL redefined 1'; } outer = acc1;");
38 assertEq(getCalled, false);
39 assertEq(setCalled, false);
40 assertEq(typeof acc1, "function");
41 assertEq(acc1, outer);
42 desc = Object.getOwnPropertyDescriptor(this, "acc1");
43 assertEq(desc.value, acc1);
44 assertEq(desc.writable, true);
45 assertEq(desc.enumerable, true);
46 assertEq(desc.configurable, true);
49 getCalled = false, setCalled = false;
50 Object.defineProperty(this, "acc2",
52 get: function() { getCalled = true; throw "FAIL get 2"; },
53 set: function(v) { setCalled = true; throw "FAIL set 2 " + v; },
60 eval("function acc2() { throw 'FAIL redefined 2'; } outer = acc2;");
61 assertEq(getCalled, false);
62 assertEq(setCalled, false);
63 assertEq(typeof acc2, "function");
64 assertEq(acc2, outer);
65 desc = Object.getOwnPropertyDescriptor(this, "acc2");
66 assertEq(desc.value, acc2);
67 assertEq(desc.writable, true);
68 assertEq(desc.enumerable, true);
69 assertEq(desc.configurable, true);
72 // non-configurable properties produce a TypeError
74 getCalled = false, setCalled = false;
75 Object.defineProperty(this, "acc3",
77 get: function() { getCalled = true; throw "FAIL get 3"; },
78 set: function(v) { setCalled = true; throw "FAIL set 3 " + v; },
86 eval("function acc3() { throw 'FAIL redefined 3'; }; outer = acc3");
87 throw new Error("should have thrown trying to redefine global function " +
88 "over a non-configurable, enumerable accessor");
92 assertEq(e instanceof TypeError, true,
93 "global function definition, when that function would overwrite " +
94 "a non-configurable, enumerable accessor, must throw a TypeError " +
95 "per ES5+errata: " + e);
96 desc = Object.getOwnPropertyDescriptor(this, "acc3");
97 assertEq(typeof desc.get, "function");
98 assertEq(typeof desc.set, "function");
99 assertEq(desc.enumerable, true);
100 assertEq(desc.configurable, false);
101 assertEq(outer, undefined);
102 assertEq(getCalled, false);
103 assertEq(setCalled, false);
107 getCalled = false, setCalled = false;
108 Object.defineProperty(this, "acc4",
110 get: function() { getCalled = true; throw "FAIL get 4"; },
111 set: function(v) { setCalled = true; throw "FAIL set 4 " + v; },
119 eval("function acc4() { throw 'FAIL redefined 4'; }; outer = acc4");
120 throw new Error("should have thrown trying to redefine global function " +
121 "over a non-configurable, non-enumerable accessor");
125 assertEq(e instanceof TypeError, true,
126 "global function definition, when that function would overwrite " +
127 "a non-configurable, non-enumerable accessor, must throw a " +
128 "TypeError per ES5+errata: " + e);
129 desc = Object.getOwnPropertyDescriptor(this, "acc4");
130 assertEq(typeof desc.get, "function");
131 assertEq(typeof desc.set, "function");
132 assertEq(desc.enumerable, false);
133 assertEq(desc.configurable, false);
134 assertEq(outer, undefined);
135 assertEq(getCalled, false);
136 assertEq(setCalled, false);
140 ///////////////////////////////////////////////
141 // Function definitions over data properties //
142 ///////////////////////////////////////////////
145 // configurable properties, regardless of other attributes, get blown away
147 Object.defineProperty(this, "data1",
156 eval("function data1() { return 'data1 function'; } outer = data1;");
157 assertEq(typeof data1, "function");
158 assertEq(data1, outer);
159 desc = Object.getOwnPropertyDescriptor(this, "data1");
160 assertEq(desc.configurable, true);
161 assertEq(desc.enumerable, true);
162 assertEq(desc.writable, true);
163 assertEq(desc.value, data1);
166 Object.defineProperty(this, "data2",
175 eval("function data2() { return 'data2 function'; } outer = data2;");
176 assertEq(typeof data2, "function");
177 assertEq(data2, outer);
178 desc = Object.getOwnPropertyDescriptor(this, "data2");
179 assertEq(desc.configurable, true);
180 assertEq(desc.enumerable, true);
181 assertEq(desc.writable, true);
182 assertEq(desc.value, data2);
185 Object.defineProperty(this, "data3",
194 eval("function data3() { return 'data3 function'; } outer = data3;");
195 assertEq(typeof data3, "function");
196 assertEq(data3, outer);
197 desc = Object.getOwnPropertyDescriptor(this, "data3");
198 assertEq(desc.configurable, true);
199 assertEq(desc.enumerable, true);
200 assertEq(desc.writable, true);
201 assertEq(desc.value, data3);
204 Object.defineProperty(this, "data4",
213 eval("function data4() { return 'data4 function'; } outer = data4;");
214 assertEq(typeof data4, "function");
215 assertEq(data4, outer);
216 desc = Object.getOwnPropertyDescriptor(this, "data4");
217 assertEq(desc.value, data4);
218 assertEq(desc.writable, true);
219 assertEq(desc.enumerable, true);
220 assertEq(desc.configurable, true);
223 // non-configurable data properties are trickier
225 Object.defineProperty(this, "data5",
234 eval("function data5() { return 'data5 function'; } outer = data5;");
235 assertEq(typeof data5, "function");
236 assertEq(data5, outer);
237 desc = Object.getOwnPropertyDescriptor(this, "data5");
238 assertEq(desc.configurable, false);
239 assertEq(desc.enumerable, true);
240 assertEq(desc.writable, true);
241 assertEq(desc.value, data5);
244 Object.defineProperty(this, "data6",
255 eval("function data6() { return 'data6 function'; } outer = data6;");
256 throw new Error("should have thrown trying to redefine global function " +
257 "over a non-configurable, enumerable, non-writable accessor");
261 assertEq(e instanceof TypeError, true,
262 "global function definition, when that function would overwrite " +
263 "a non-configurable, enumerable, non-writable data property, must " +
264 "throw a TypeError per ES5+errata: " + e);
265 assertEq(data6, "data6");
266 assertEq(outer, undefined);
267 desc = Object.getOwnPropertyDescriptor(this, "data6");
268 assertEq(desc.configurable, false);
269 assertEq(desc.enumerable, true);
270 assertEq(desc.writable, false);
271 assertEq(desc.value, "data6");
275 Object.defineProperty(this, "data7",
286 eval("function data7() { return 'data7 function'; } outer = data7;");
287 throw new Error("should have thrown trying to redefine global function " +
288 "over a non-configurable, non-enumerable, writable data" +
293 assertEq(e instanceof TypeError, true,
294 "global function definition, when that function would overwrite " +
295 "a non-configurable, non-enumerable, writable data property, must " +
296 "throw a TypeError per ES5+errata: " + e);
297 assertEq(data7, "data7");
298 assertEq(outer, undefined);
299 desc = Object.getOwnPropertyDescriptor(this, "data7");
300 assertEq(desc.configurable, false);
301 assertEq(desc.enumerable, false);
302 assertEq(desc.writable, true);
303 assertEq(desc.value, "data7");
307 Object.defineProperty(this, "data8",
318 eval("function data8() { return 'data8 function'; } outer = data8;");
319 throw new Error("should have thrown trying to redefine global function " +
320 "over a non-configurable, non-enumerable, non-writable data" +
325 assertEq(e instanceof TypeError, true,
326 "global function definition, when that function would overwrite " +
327 "a non-configurable, non-enumerable, non-writable data property, " +
328 "must throw a TypeError per ES5+errata: " + e);
329 assertEq(data8, "data8");
330 assertEq(outer, undefined);
331 desc = Object.getOwnPropertyDescriptor(this, "data8");
332 assertEq(desc.configurable, false);
333 assertEq(desc.enumerable, false);
334 assertEq(desc.writable, false);
335 assertEq(desc.value, "data8");
338 /******************************************************************************/
340 if (typeof reportCompare === "function")
341 reportCompare(true, true);
343 print("All tests passed!");