OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012-2015 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
11 // with the distribution. | 11 // with the distribution. |
12 // * Neither the name of Google Inc. nor the names of its | 12 // * Neither the name of Google Inc. nor the names of its |
13 // contributors may be used to endorse or promote products derived | 13 // contributors may be used to endorse or promote products derived |
14 // from this software without specific prior written permission. | 14 // from this software without specific prior written permission. |
15 // | 15 // |
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
28 // Tests the object.defineProperty method - ES 15.2.3.6 | 28 // Tests the Reflect.defineProperty method - ES6 26.1.3 |
29 // This is adapted from mjsunit/object-define-property.js. | |
29 | 30 |
30 // Flags: --allow-natives-syntax | 31 // Flags: --allow-natives-syntax --harmony-reflect |
32 | |
31 | 33 |
32 // Check that an exception is thrown when null is passed as object. | 34 // Check that an exception is thrown when null is passed as object. |
33 var exception = false; | 35 var exception = false; |
34 try { | 36 try { |
35 Object.defineProperty(null, null, null); | 37 Reflect.defineProperty(null, null, null); |
36 } catch (e) { | 38 } catch (e) { |
37 exception = true; | 39 exception = true; |
38 assertTrue(/called on non-object/.test(e)); | 40 assertTrue(/called on non-object/.test(e)); |
39 } | 41 } |
40 assertTrue(exception); | 42 assertTrue(exception); |
41 | 43 |
42 // Check that an exception is thrown when undefined is passed as object. | 44 // Check that an exception is thrown when undefined is passed as object. |
43 exception = false; | 45 exception = false; |
44 try { | 46 try { |
45 Object.defineProperty(undefined, undefined, undefined); | 47 Reflect.defineProperty(undefined, undefined, undefined); |
46 } catch (e) { | 48 } catch (e) { |
47 exception = true; | 49 exception = true; |
48 assertTrue(/called on non-object/.test(e)); | 50 assertTrue(/called on non-object/.test(e)); |
49 } | 51 } |
50 assertTrue(exception); | 52 assertTrue(exception); |
51 | 53 |
52 // Check that an exception is thrown when non-object is passed as object. | 54 // Check that an exception is thrown when non-object is passed as object. |
53 exception = false; | 55 exception = false; |
54 try { | 56 try { |
55 Object.defineProperty(0, "foo", undefined); | 57 Reflect.defineProperty(0, "foo", undefined); |
56 } catch (e) { | 58 } catch (e) { |
57 exception = true; | 59 exception = true; |
58 assertTrue(/called on non-object/.test(e)); | 60 assertTrue(/called on non-object/.test(e)); |
59 } | 61 } |
60 assertTrue(exception); | 62 assertTrue(exception); |
61 | 63 |
62 // Object. | 64 // Object. |
63 var obj1 = {}; | 65 var obj1 = {}; |
64 | 66 |
65 // Values. | 67 // Values. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
105 var accessorDefault = {set: function(){} }; | 107 var accessorDefault = {set: function(){} }; |
106 | 108 |
107 var dataConfigurable = { value: 1000, configurable: true }; | 109 var dataConfigurable = { value: 1000, configurable: true }; |
108 | 110 |
109 var dataNoConfigurable = { value: 2000, configurable: false }; | 111 var dataNoConfigurable = { value: 2000, configurable: false }; |
110 | 112 |
111 var dataWritable = { value: 3000, writable: true}; | 113 var dataWritable = { value: 3000, writable: true}; |
112 | 114 |
113 | 115 |
114 // Check that we can't add property with undefined attributes. | 116 // Check that we can't add property with undefined attributes. |
115 try { | 117 assertThrows(function() { Reflect.defineProperty(obj1, "foo", undefined) }, |
116 Object.defineProperty(obj1, "foo", undefined); | 118 TypeError); |
Jakob Kummerow
2015/10/23 12:03:43
nit: indentation (4 spaces for broken lines, or ev
neis
2015/10/29 15:17:25
Done.
| |
117 assertTrue(false); | |
118 } catch (e) { | |
119 assertTrue(/must be an object/.test(e)); | |
120 } | |
121 | 119 |
122 // Make sure that we can add a property with an empty descriptor and | 120 // Make sure that we can add a property with an empty descriptor and |
123 // that it has the default descriptor values. | 121 // that it has the default descriptor values. |
124 Object.defineProperty(obj1, "foo", emptyDesc); | 122 assertTrue(Reflect.defineProperty(obj1, "foo", emptyDesc)); |
125 | 123 |
126 // foo should be undefined as it has no get, set or value | 124 // foo should be undefined as it has no get, set or value |
127 assertEquals(undefined, obj1.foo); | 125 assertEquals(undefined, obj1.foo); |
128 | 126 |
129 // We should, however, be able to retrieve the propertydescriptor which should | 127 // We should, however, be able to retrieve the propertydescriptor which should |
130 // have all default values (according to 8.6.1). | 128 // have all default values (according to 8.6.1). |
131 var desc = Object.getOwnPropertyDescriptor(obj1, "foo"); | 129 var desc = Object.getOwnPropertyDescriptor(obj1, "foo"); |
132 assertFalse(desc.configurable); | 130 assertFalse(desc.configurable); |
133 assertFalse(desc.enumerable); | 131 assertFalse(desc.enumerable); |
134 assertFalse(desc.writable); | 132 assertFalse(desc.writable); |
135 assertEquals(desc.get, undefined); | 133 assertEquals(desc.get, undefined); |
136 assertEquals(desc.set, undefined); | 134 assertEquals(desc.set, undefined); |
137 assertEquals(desc.value, undefined); | 135 assertEquals(desc.value, undefined); |
138 | 136 |
139 // Make sure that getOwnPropertyDescriptor does not return a descriptor | 137 // Make sure that getOwnPropertyDescriptor does not return a descriptor |
140 // with default values if called with non existing property (otherwise | 138 // with default values if called with non existing property (otherwise |
141 // the test above is invalid). | 139 // the test above is invalid). |
142 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); | 140 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); |
143 assertEquals(desc, undefined); | 141 assertEquals(desc, undefined); |
144 | 142 |
145 // Make sure that foo can't be reset (as configurable is false). | 143 // Make sure that foo can't be reset (as configurable is false). |
146 try { | 144 assertFalse(Reflect.defineProperty(obj1, "foo", accessorConfigurable)); |
147 Object.defineProperty(obj1, "foo", accessorConfigurable); | |
148 } catch (e) { | |
149 assertTrue(/Cannot redefine property/.test(e)); | |
150 } | |
151 | 145 |
152 | 146 |
153 // Accessor properties | 147 // Accessor properties |
154 | 148 |
155 Object.defineProperty(obj1, "bar", accessorConfigurable); | 149 assertTrue(Reflect.defineProperty(obj1, "bar", accessorConfigurable)); |
156 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); | 150 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); |
157 assertTrue(desc.configurable); | 151 assertTrue(desc.configurable); |
158 assertFalse(desc.enumerable); | 152 assertFalse(desc.enumerable); |
159 assertEquals(desc.writable, undefined); | 153 assertEquals(desc.writable, undefined); |
160 assertEquals(desc.get, accessorConfigurable.get); | 154 assertEquals(desc.get, accessorConfigurable.get); |
161 assertEquals(desc.set, accessorConfigurable.set); | 155 assertEquals(desc.set, accessorConfigurable.set); |
162 assertEquals(desc.value, undefined); | 156 assertEquals(desc.value, undefined); |
163 assertEquals(1, obj1.bar = 1); | 157 assertEquals(1, obj1.bar = 1); |
164 assertEquals(1, val1); | 158 assertEquals(1, val1); |
165 assertEquals(1, obj1.bar = 1); | 159 assertEquals(1, obj1.bar = 1); |
166 assertEquals(2, val1); | 160 assertEquals(2, val1); |
167 assertEquals(2, obj1.bar); | 161 assertEquals(2, obj1.bar); |
168 | 162 |
169 // Redefine bar with non configurable test | 163 // Redefine bar with non configurable test |
170 Object.defineProperty(obj1, "bar", accessorNoConfigurable); | 164 assertTrue(Reflect.defineProperty(obj1, "bar", accessorNoConfigurable)); |
171 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); | 165 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); |
172 assertFalse(desc.configurable); | 166 assertFalse(desc.configurable); |
173 assertFalse(desc.enumerable); | 167 assertFalse(desc.enumerable); |
174 assertEquals(desc.writable, undefined); | 168 assertEquals(desc.writable, undefined); |
175 assertEquals(desc.get, accessorNoConfigurable.get); | 169 assertEquals(desc.get, accessorNoConfigurable.get); |
176 assertEquals(desc.set, accessorNoConfigurable.set); | 170 assertEquals(desc.set, accessorNoConfigurable.set); |
177 assertEquals(desc.value, undefined); | 171 assertEquals(desc.value, undefined); |
178 assertEquals(1, obj1.bar = 1); | 172 assertEquals(1, obj1.bar = 1); |
179 assertEquals(2, val1); | 173 assertEquals(2, val1); |
180 assertEquals(1, val2); | 174 assertEquals(1, val2); |
181 assertEquals(1, obj1.bar = 1) | 175 assertEquals(1, obj1.bar = 1) |
182 assertEquals(2, val1); | 176 assertEquals(2, val1); |
183 assertEquals(2, val2); | 177 assertEquals(2, val2); |
184 assertEquals(2, obj1.bar); | 178 assertEquals(2, obj1.bar); |
185 | 179 |
186 // Try to redefine bar again - should fail as configurable is false. | 180 // Try to redefine bar again - should fail as configurable is false. |
187 try { | 181 assertFalse(Reflect.defineProperty(obj1, "bar", accessorConfigurable)); |
188 Object.defineProperty(obj1, "bar", accessorConfigurable); | |
189 assertTrue(false); | |
190 } catch(e) { | |
191 assertTrue(/Cannot redefine property/.test(e)); | |
192 } | |
193 | 182 |
194 // Try to redefine bar again using the data descriptor - should fail. | 183 // Try to redefine bar again using the data descriptor - should fail. |
195 try { | 184 assertFalse(Reflect.defineProperty(obj1, "bar", dataConfigurable)); |
196 Object.defineProperty(obj1, "bar", dataConfigurable); | |
197 assertTrue(false); | |
198 } catch(e) { | |
199 assertTrue(/Cannot redefine property/.test(e)); | |
200 } | |
201 | 185 |
202 // Redefine using same descriptor - should succeed. | 186 // Redefine using same descriptor - should succeed. |
203 Object.defineProperty(obj1, "bar", accessorNoConfigurable); | 187 assertTrue(Reflect.defineProperty(obj1, "bar", accessorNoConfigurable)); |
204 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); | 188 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); |
205 assertFalse(desc.configurable); | 189 assertFalse(desc.configurable); |
206 assertFalse(desc.enumerable); | 190 assertFalse(desc.enumerable); |
207 assertEquals(desc.writable, undefined); | 191 assertEquals(desc.writable, undefined); |
208 assertEquals(desc.get, accessorNoConfigurable.get); | 192 assertEquals(desc.get, accessorNoConfigurable.get); |
209 assertEquals(desc.set, accessorNoConfigurable.set); | 193 assertEquals(desc.set, accessorNoConfigurable.set); |
210 assertEquals(desc.value, undefined); | 194 assertEquals(desc.value, undefined); |
211 assertEquals(1, obj1.bar = 1); | 195 assertEquals(1, obj1.bar = 1); |
212 assertEquals(2, val1); | 196 assertEquals(2, val1); |
213 assertEquals(3, val2); | 197 assertEquals(3, val2); |
214 assertEquals(1, obj1.bar = 1) | 198 assertEquals(1, obj1.bar = 1) |
215 assertEquals(2, val1); | 199 assertEquals(2, val1); |
216 assertEquals(4, val2); | 200 assertEquals(4, val2); |
217 assertEquals(4, obj1.bar); | 201 assertEquals(4, obj1.bar); |
218 | 202 |
219 // Define an accessor that has only a setter. | 203 // Define an accessor that has only a setter. |
220 Object.defineProperty(obj1, "setOnly", accessorOnlySet); | 204 assertTrue(Reflect.defineProperty(obj1, "setOnly", accessorOnlySet)); |
221 desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); | 205 desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); |
222 assertTrue(desc.configurable); | 206 assertTrue(desc.configurable); |
223 assertFalse(desc.enumerable); | 207 assertFalse(desc.enumerable); |
224 assertEquals(desc.set, accessorOnlySet.set); | 208 assertEquals(desc.set, accessorOnlySet.set); |
225 assertEquals(desc.writable, undefined); | 209 assertEquals(desc.writable, undefined); |
226 assertEquals(desc.value, undefined); | 210 assertEquals(desc.value, undefined); |
227 assertEquals(desc.get, undefined); | 211 assertEquals(desc.get, undefined); |
228 assertEquals(1, obj1.setOnly = 1); | 212 assertEquals(1, obj1.setOnly = 1); |
229 assertEquals(1, val3); | 213 assertEquals(1, val3); |
230 | 214 |
231 // Add a getter - should not touch the setter. | 215 // Add a getter - should not touch the setter. |
232 Object.defineProperty(obj1, "setOnly", accessorOnlyGet); | 216 assertTrue(Reflect.defineProperty(obj1, "setOnly", accessorOnlyGet)); |
233 desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); | 217 desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); |
234 assertTrue(desc.configurable); | 218 assertTrue(desc.configurable); |
235 assertFalse(desc.enumerable); | 219 assertFalse(desc.enumerable); |
236 assertEquals(desc.get, accessorOnlyGet.get); | 220 assertEquals(desc.get, accessorOnlyGet.get); |
237 assertEquals(desc.set, accessorOnlySet.set); | 221 assertEquals(desc.set, accessorOnlySet.set); |
238 assertEquals(desc.writable, undefined); | 222 assertEquals(desc.writable, undefined); |
239 assertEquals(desc.value, undefined); | 223 assertEquals(desc.value, undefined); |
240 assertEquals(1, obj1.setOnly = 1); | 224 assertEquals(1, obj1.setOnly = 1); |
241 assertEquals(2, val3); | 225 assertEquals(2, val3); |
242 | 226 |
243 // The above should also work if redefining just a getter or setter on | 227 // The above should also work if redefining just a getter or setter on |
244 // an existing property with both a getter and a setter. | 228 // an existing property with both a getter and a setter. |
245 Object.defineProperty(obj1, "both", accessorConfigurable); | 229 assertTrue(Reflect.defineProperty(obj1, "both", accessorConfigurable)); |
246 | 230 |
247 Object.defineProperty(obj1, "both", accessorOnlySet); | 231 assertTrue(Reflect.defineProperty(obj1, "both", accessorOnlySet)); |
248 desc = Object.getOwnPropertyDescriptor(obj1, "both"); | 232 desc = Object.getOwnPropertyDescriptor(obj1, "both"); |
249 assertTrue(desc.configurable); | 233 assertTrue(desc.configurable); |
250 assertFalse(desc.enumerable); | 234 assertFalse(desc.enumerable); |
251 assertEquals(desc.set, accessorOnlySet.set); | 235 assertEquals(desc.set, accessorOnlySet.set); |
252 assertEquals(desc.get, accessorConfigurable.get); | 236 assertEquals(desc.get, accessorConfigurable.get); |
253 assertEquals(desc.writable, undefined); | 237 assertEquals(desc.writable, undefined); |
254 assertEquals(desc.value, undefined); | 238 assertEquals(desc.value, undefined); |
255 assertEquals(1, obj1.both = 1); | 239 assertEquals(1, obj1.both = 1); |
256 assertEquals(3, val3); | 240 assertEquals(3, val3); |
257 | 241 |
258 | 242 |
259 // Data properties | 243 // Data properties |
260 | 244 |
261 Object.defineProperty(obj1, "foobar", dataConfigurable); | 245 assertTrue(Reflect.defineProperty(obj1, "foobar", dataConfigurable)); |
262 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); | 246 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); |
263 assertEquals(obj1.foobar, 1000); | 247 assertEquals(obj1.foobar, 1000); |
264 assertEquals(desc.value, 1000); | 248 assertEquals(desc.value, 1000); |
265 assertTrue(desc.configurable); | 249 assertTrue(desc.configurable); |
266 assertFalse(desc.writable); | 250 assertFalse(desc.writable); |
267 assertFalse(desc.enumerable); | 251 assertFalse(desc.enumerable); |
268 assertEquals(desc.get, undefined); | 252 assertEquals(desc.get, undefined); |
269 assertEquals(desc.set, undefined); | 253 assertEquals(desc.set, undefined); |
270 //Try writing to non writable attribute - should remain 1000 | 254 //Try writing to non writable attribute - should remain 1000 |
271 obj1.foobar = 1001; | 255 obj1.foobar = 1001; |
272 assertEquals(obj1.foobar, 1000); | 256 assertEquals(obj1.foobar, 1000); |
273 | 257 |
274 | 258 |
275 // Redefine to writable descriptor - now writing to foobar should be allowed. | 259 // Redefine to writable descriptor - now writing to foobar should be allowed. |
276 Object.defineProperty(obj1, "foobar", dataWritable); | 260 assertTrue(Reflect.defineProperty(obj1, "foobar", dataWritable)); |
277 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); | 261 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); |
278 assertEquals(obj1.foobar, 3000); | 262 assertEquals(obj1.foobar, 3000); |
279 assertEquals(desc.value, 3000); | 263 assertEquals(desc.value, 3000); |
280 // Note that since dataWritable does not define configurable the configurable | 264 // Note that since dataWritable does not define configurable the configurable |
281 // setting from the redefined property (in this case true) is used. | 265 // setting from the redefined property (in this case true) is used. |
282 assertTrue(desc.configurable); | 266 assertTrue(desc.configurable); |
283 assertTrue(desc.writable); | 267 assertTrue(desc.writable); |
284 assertFalse(desc.enumerable); | 268 assertFalse(desc.enumerable); |
285 assertEquals(desc.get, undefined); | 269 assertEquals(desc.get, undefined); |
286 assertEquals(desc.set, undefined); | 270 assertEquals(desc.set, undefined); |
287 // Writing to the property should now be allowed | 271 // Writing to the property should now be allowed |
288 obj1.foobar = 1001; | 272 obj1.foobar = 1001; |
289 assertEquals(obj1.foobar, 1001); | 273 assertEquals(obj1.foobar, 1001); |
290 | 274 |
291 | 275 |
292 // Redefine with non configurable data property. | 276 // Redefine with non configurable data property. |
293 Object.defineProperty(obj1, "foobar", dataNoConfigurable); | 277 assertTrue(Reflect.defineProperty(obj1, "foobar", dataNoConfigurable)); |
294 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); | 278 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); |
295 assertEquals(obj1.foobar, 2000); | 279 assertEquals(obj1.foobar, 2000); |
296 assertEquals(desc.value, 2000); | 280 assertEquals(desc.value, 2000); |
297 assertFalse(desc.configurable); | 281 assertFalse(desc.configurable); |
298 assertTrue(desc.writable); | 282 assertTrue(desc.writable); |
299 assertFalse(desc.enumerable); | 283 assertFalse(desc.enumerable); |
300 assertEquals(desc.get, undefined); | 284 assertEquals(desc.get, undefined); |
301 assertEquals(desc.set, undefined); | 285 assertEquals(desc.set, undefined); |
302 | 286 |
303 // Try redefine again - shold fail because configurable is now false. | 287 // Try redefine again - shold fail because configurable is now false. |
304 try { | 288 assertFalse(Reflect.defineProperty(obj1, "foobar", dataConfigurable)); |
305 Object.defineProperty(obj1, "foobar", dataConfigurable); | |
306 assertTrue(false); | |
307 } catch (e) { | |
308 assertTrue(/Cannot redefine property/.test(e)); | |
309 } | |
310 | 289 |
311 // Try redefine again with accessor property - shold also fail. | 290 // Try redefine again with accessor property - shold also fail. |
312 try { | 291 assertFalse(Reflect.defineProperty(obj1, "foobar", dataConfigurable)); |
313 Object.defineProperty(obj1, "foobar", dataConfigurable); | |
314 assertTrue(false); | |
315 } catch (e) { | |
316 assertTrue(/Cannot redefine property/.test(e)); | |
317 } | |
318 | 292 |
319 | 293 |
320 // Redifine with the same descriptor - should succeed (step 6). | 294 // Redifine with the same descriptor - should succeed (step 6). |
321 Object.defineProperty(obj1, "foobar", dataNoConfigurable); | 295 assertTrue(Reflect.defineProperty(obj1, "foobar", dataNoConfigurable)); |
322 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); | 296 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); |
323 assertEquals(obj1.foobar, 2000); | 297 assertEquals(obj1.foobar, 2000); |
324 assertEquals(desc.value, 2000); | 298 assertEquals(desc.value, 2000); |
325 assertFalse(desc.configurable); | 299 assertFalse(desc.configurable); |
326 assertTrue(desc.writable); | 300 assertTrue(desc.writable); |
327 assertFalse(desc.enumerable); | 301 assertFalse(desc.enumerable); |
328 assertEquals(desc.get, undefined); | 302 assertEquals(desc.get, undefined); |
329 assertEquals(desc.set, undefined); | 303 assertEquals(desc.set, undefined); |
330 | 304 |
331 | 305 |
332 // New object | 306 // New object |
333 var obj2 = {}; | 307 var obj2 = {}; |
334 | 308 |
335 // Make accessor - redefine to data | 309 // Make accessor - redefine to data |
336 Object.defineProperty(obj2, "foo", accessorConfigurable); | 310 assertTrue(Reflect.defineProperty(obj2, "foo", accessorConfigurable)); |
337 | 311 |
338 // Redefine to data property | 312 // Redefine to data property |
339 Object.defineProperty(obj2, "foo", dataConfigurable); | 313 assertTrue(Reflect.defineProperty(obj2, "foo", dataConfigurable)); |
340 desc = Object.getOwnPropertyDescriptor(obj2, "foo"); | 314 desc = Object.getOwnPropertyDescriptor(obj2, "foo"); |
341 assertEquals(obj2.foo, 1000); | 315 assertEquals(obj2.foo, 1000); |
342 assertEquals(desc.value, 1000); | 316 assertEquals(desc.value, 1000); |
343 assertTrue(desc.configurable); | 317 assertTrue(desc.configurable); |
344 assertFalse(desc.writable); | 318 assertFalse(desc.writable); |
345 assertFalse(desc.enumerable); | 319 assertFalse(desc.enumerable); |
346 assertEquals(desc.get, undefined); | 320 assertEquals(desc.get, undefined); |
347 assertEquals(desc.set, undefined); | 321 assertEquals(desc.set, undefined); |
348 | 322 |
349 | 323 |
350 // Redefine back to accessor | 324 // Redefine back to accessor |
351 Object.defineProperty(obj2, "foo", accessorConfigurable); | 325 assertTrue(Reflect.defineProperty(obj2, "foo", accessorConfigurable)); |
352 desc = Object.getOwnPropertyDescriptor(obj2, "foo"); | 326 desc = Object.getOwnPropertyDescriptor(obj2, "foo"); |
353 assertTrue(desc.configurable); | 327 assertTrue(desc.configurable); |
354 assertFalse(desc.enumerable); | 328 assertFalse(desc.enumerable); |
355 assertEquals(desc.writable, undefined); | 329 assertEquals(desc.writable, undefined); |
356 assertEquals(desc.get, accessorConfigurable.get); | 330 assertEquals(desc.get, accessorConfigurable.get); |
357 assertEquals(desc.set, accessorConfigurable.set); | 331 assertEquals(desc.set, accessorConfigurable.set); |
358 assertEquals(desc.value, undefined); | 332 assertEquals(desc.value, undefined); |
359 assertEquals(1, obj2.foo = 1); | 333 assertEquals(1, obj2.foo = 1); |
360 assertEquals(3, val1); | 334 assertEquals(3, val1); |
361 assertEquals(4, val2); | 335 assertEquals(4, val2); |
362 assertEquals(3, obj2.foo); | 336 assertEquals(3, obj2.foo); |
363 | 337 |
364 // Make data - redefine to accessor | 338 // Make data - redefine to accessor |
365 Object.defineProperty(obj2, "bar", dataConfigurable) | 339 assertTrue(Reflect.defineProperty(obj2, "bar", dataConfigurable)) |
366 | 340 |
367 // Redefine to accessor property | 341 // Redefine to accessor property |
368 Object.defineProperty(obj2, "bar", accessorConfigurable); | 342 assertTrue(Reflect.defineProperty(obj2, "bar", accessorConfigurable)); |
369 desc = Object.getOwnPropertyDescriptor(obj2, "bar"); | 343 desc = Object.getOwnPropertyDescriptor(obj2, "bar"); |
370 assertTrue(desc.configurable); | 344 assertTrue(desc.configurable); |
371 assertFalse(desc.enumerable); | 345 assertFalse(desc.enumerable); |
372 assertEquals(desc.writable, undefined); | 346 assertEquals(desc.writable, undefined); |
373 assertEquals(desc.get, accessorConfigurable.get); | 347 assertEquals(desc.get, accessorConfigurable.get); |
374 assertEquals(desc.set, accessorConfigurable.set); | 348 assertEquals(desc.set, accessorConfigurable.set); |
375 assertEquals(desc.value, undefined); | 349 assertEquals(desc.value, undefined); |
376 assertEquals(1, obj2.bar = 1); | 350 assertEquals(1, obj2.bar = 1); |
377 assertEquals(4, val1); | 351 assertEquals(4, val1); |
378 assertEquals(4, val2); | 352 assertEquals(4, val2); |
379 assertEquals(4, obj2.foo); | 353 assertEquals(4, obj2.foo); |
380 | 354 |
381 // Redefine back to data property | 355 // Redefine back to data property |
382 Object.defineProperty(obj2, "bar", dataConfigurable); | 356 assertTrue(Reflect.defineProperty(obj2, "bar", dataConfigurable)); |
383 desc = Object.getOwnPropertyDescriptor(obj2, "bar"); | 357 desc = Object.getOwnPropertyDescriptor(obj2, "bar"); |
384 assertEquals(obj2.bar, 1000); | 358 assertEquals(obj2.bar, 1000); |
385 assertEquals(desc.value, 1000); | 359 assertEquals(desc.value, 1000); |
386 assertTrue(desc.configurable); | 360 assertTrue(desc.configurable); |
387 assertFalse(desc.writable); | 361 assertFalse(desc.writable); |
388 assertFalse(desc.enumerable); | 362 assertFalse(desc.enumerable); |
389 assertEquals(desc.get, undefined); | 363 assertEquals(desc.get, undefined); |
390 assertEquals(desc.set, undefined); | 364 assertEquals(desc.set, undefined); |
391 | 365 |
392 | 366 |
(...skipping 12 matching lines...) Expand all Loading... | |
405 assertEquals(desc.writable, undefined); | 379 assertEquals(desc.writable, undefined); |
406 assertEquals(desc.get, get); | 380 assertEquals(desc.get, get); |
407 assertEquals(desc.set, set); | 381 assertEquals(desc.set, set); |
408 assertEquals(desc.value, undefined); | 382 assertEquals(desc.value, undefined); |
409 assertEquals(1, obj3.foo = 1); | 383 assertEquals(1, obj3.foo = 1); |
410 assertEquals(1, obj3.x); | 384 assertEquals(1, obj3.x); |
411 assertEquals(1, obj3.foo); | 385 assertEquals(1, obj3.foo); |
412 | 386 |
413 // Redefine to accessor property (non configurable) - note that enumerable | 387 // Redefine to accessor property (non configurable) - note that enumerable |
414 // which we do not redefine should remain the same (true). | 388 // which we do not redefine should remain the same (true). |
415 Object.defineProperty(obj3, "foo", accessorNoConfigurable); | 389 assertTrue(Reflect.defineProperty(obj3, "foo", accessorNoConfigurable)); |
416 desc = Object.getOwnPropertyDescriptor(obj3, "foo"); | 390 desc = Object.getOwnPropertyDescriptor(obj3, "foo"); |
417 assertFalse(desc.configurable); | 391 assertFalse(desc.configurable); |
418 assertTrue(desc.enumerable); | 392 assertTrue(desc.enumerable); |
419 assertEquals(desc.writable, undefined); | 393 assertEquals(desc.writable, undefined); |
420 assertEquals(desc.get, accessorNoConfigurable.get); | 394 assertEquals(desc.get, accessorNoConfigurable.get); |
421 assertEquals(desc.set, accessorNoConfigurable.set); | 395 assertEquals(desc.set, accessorNoConfigurable.set); |
422 assertEquals(desc.value, undefined); | 396 assertEquals(desc.value, undefined); |
423 assertEquals(1, obj3.foo = 1); | 397 assertEquals(1, obj3.foo = 1); |
424 assertEquals(5, val2); | 398 assertEquals(5, val2); |
425 assertEquals(5, obj3.foo); | 399 assertEquals(5, obj3.foo); |
426 | 400 |
427 | 401 |
428 obj3.__defineGetter__("bar", get); | 402 obj3.__defineGetter__("bar", get); |
429 obj3.__defineSetter__("bar", set); | 403 obj3.__defineSetter__("bar", set); |
430 | 404 |
431 | 405 |
432 // Redefine back to data property | 406 // Redefine back to data property |
433 Object.defineProperty(obj3, "bar", dataConfigurable); | 407 assertTrue(Reflect.defineProperty(obj3, "bar", dataConfigurable)); |
434 desc = Object.getOwnPropertyDescriptor(obj3, "bar"); | 408 desc = Object.getOwnPropertyDescriptor(obj3, "bar"); |
435 assertEquals(obj3.bar, 1000); | 409 assertEquals(obj3.bar, 1000); |
436 assertEquals(desc.value, 1000); | 410 assertEquals(desc.value, 1000); |
437 assertTrue(desc.configurable); | 411 assertTrue(desc.configurable); |
438 assertFalse(desc.writable); | 412 assertFalse(desc.writable); |
439 assertTrue(desc.enumerable); | 413 assertTrue(desc.enumerable); |
440 assertEquals(desc.get, undefined); | 414 assertEquals(desc.get, undefined); |
441 assertEquals(desc.set, undefined); | 415 assertEquals(desc.set, undefined); |
442 | 416 |
443 | 417 |
444 var obj4 = {}; | 418 var obj4 = {}; |
445 var func = function (){return 42;}; | 419 var func = function (){return 42;}; |
446 obj4.bar = func; | 420 obj4.bar = func; |
447 assertEquals(42, obj4.bar()); | 421 assertEquals(42, obj4.bar()); |
448 | 422 |
449 Object.defineProperty(obj4, "bar", accessorConfigurable); | 423 assertTrue(Reflect.defineProperty(obj4, "bar", accessorConfigurable)); |
450 desc = Object.getOwnPropertyDescriptor(obj4, "bar"); | 424 desc = Object.getOwnPropertyDescriptor(obj4, "bar"); |
451 assertTrue(desc.configurable); | 425 assertTrue(desc.configurable); |
452 assertTrue(desc.enumerable); | 426 assertTrue(desc.enumerable); |
453 assertEquals(desc.writable, undefined); | 427 assertEquals(desc.writable, undefined); |
454 assertEquals(desc.get, accessorConfigurable.get); | 428 assertEquals(desc.get, accessorConfigurable.get); |
455 assertEquals(desc.set, accessorConfigurable.set); | 429 assertEquals(desc.set, accessorConfigurable.set); |
456 assertEquals(desc.value, undefined); | 430 assertEquals(desc.value, undefined); |
457 assertEquals(1, obj4.bar = 1); | 431 assertEquals(1, obj4.bar = 1); |
458 assertEquals(5, val1); | 432 assertEquals(5, val1); |
459 assertEquals(5, obj4.bar); | 433 assertEquals(5, obj4.bar); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
514 assertTrue(/illegal access/.test(e)); | 488 assertTrue(/illegal access/.test(e)); |
515 } | 489 } |
516 | 490 |
517 // Test that all possible differences in step 6 in DefineOwnProperty are | 491 // Test that all possible differences in step 6 in DefineOwnProperty are |
518 // exercised, i.e., any difference in the given property descriptor and the | 492 // exercised, i.e., any difference in the given property descriptor and the |
519 // existing properties should not return true, but throw an error if the | 493 // existing properties should not return true, but throw an error if the |
520 // existing configurable property is false. | 494 // existing configurable property is false. |
521 | 495 |
522 var obj5 = {}; | 496 var obj5 = {}; |
523 // Enumerable will default to false. | 497 // Enumerable will default to false. |
524 Object.defineProperty(obj5, 'foo', accessorNoConfigurable); | 498 assertTrue(Reflect.defineProperty(obj5, 'foo', accessorNoConfigurable)); |
525 desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); | 499 desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); |
526 // First, test that we are actually allowed to set the accessor if all | 500 // First, test that we are actually allowed to set the accessor if all |
527 // values are of the descriptor are the same as the existing one. | 501 // values are of the descriptor are the same as the existing one. |
528 Object.defineProperty(obj5, 'foo', accessorNoConfigurable); | 502 assertTrue(Reflect.defineProperty(obj5, 'foo', accessorNoConfigurable)); |
529 | 503 |
530 // Different setter. | 504 // Different setter. |
531 var descDifferent = { | 505 var descDifferent = { |
532 configurable:false, | 506 configurable:false, |
533 enumerable:false, | 507 enumerable:false, |
534 set: setter1, | 508 set: setter1, |
535 get: getter2 | 509 get: getter2 |
536 }; | 510 }; |
537 | 511 |
538 try { | 512 assertFalse(Reflect.defineProperty(obj5, 'foo', descDifferent)); |
539 Object.defineProperty(obj5, 'foo', descDifferent); | |
540 assertTrue(false); | |
541 } catch (e) { | |
542 assertTrue(/Cannot redefine property/.test(e)); | |
543 } | |
544 | 513 |
545 // Different getter. | 514 // Different getter. |
546 descDifferent = { | 515 descDifferent = { |
547 configurable:false, | 516 configurable:false, |
548 enumerable:false, | 517 enumerable:false, |
549 set: setter2, | 518 set: setter2, |
550 get: getter1 | 519 get: getter1 |
551 }; | 520 }; |
552 | 521 |
553 try { | 522 assertFalse(Reflect.defineProperty(obj5, 'foo', descDifferent)); |
554 Object.defineProperty(obj5, 'foo', descDifferent); | |
555 assertTrue(false); | |
556 } catch (e) { | |
557 assertTrue(/Cannot redefine property/.test(e)); | |
558 } | |
559 | 523 |
560 // Different enumerable. | 524 // Different enumerable. |
561 descDifferent = { | 525 descDifferent = { |
562 configurable:false, | 526 configurable:false, |
563 enumerable:true, | 527 enumerable:true, |
564 set: setter2, | 528 set: setter2, |
565 get: getter2 | 529 get: getter2 |
566 }; | 530 }; |
567 | 531 |
568 try { | 532 assertFalse(Reflect.defineProperty(obj5, 'foo', descDifferent)); |
569 Object.defineProperty(obj5, 'foo', descDifferent); | |
570 assertTrue(false); | |
571 } catch (e) { | |
572 assertTrue(/Cannot redefine property/.test(e)); | |
573 } | |
574 | 533 |
575 // Different configurable. | 534 // Different configurable. |
576 descDifferent = { | 535 descDifferent = { |
577 configurable:false, | 536 configurable:false, |
578 enumerable:true, | 537 enumerable:true, |
579 set: setter2, | 538 set: setter2, |
580 get: getter2 | 539 get: getter2 |
581 }; | 540 }; |
582 | 541 |
583 try { | 542 assertFalse(Reflect.defineProperty(obj5, 'foo', descDifferent)); |
584 Object.defineProperty(obj5, 'foo', descDifferent); | |
585 assertTrue(false); | |
586 } catch (e) { | |
587 assertTrue(/Cannot redefine property/.test(e)); | |
588 } | |
589 | 543 |
590 // No difference. | 544 // No difference. |
591 descDifferent = { | 545 descDifferent = { |
592 configurable:false, | 546 configurable:false, |
593 enumerable:false, | 547 enumerable:false, |
594 set: setter2, | 548 set: setter2, |
595 get: getter2 | 549 get: getter2 |
596 }; | 550 }; |
597 // Make sure we can still redefine if all properties are the same. | 551 // Make sure we can still redefine if all properties are the same. |
598 Object.defineProperty(obj5, 'foo', descDifferent); | 552 assertTrue(Reflect.defineProperty(obj5, 'foo', descDifferent)); |
599 | 553 |
600 // Make sure that obj5 still holds the original values. | 554 // Make sure that obj5 still holds the original values. |
601 desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); | 555 desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); |
602 assertEquals(desc.get, getter2); | 556 assertEquals(desc.get, getter2); |
603 assertEquals(desc.set, setter2); | 557 assertEquals(desc.set, setter2); |
604 assertFalse(desc.enumerable); | 558 assertFalse(desc.enumerable); |
605 assertFalse(desc.configurable); | 559 assertFalse(desc.configurable); |
606 | 560 |
607 | 561 |
608 // Also exercise step 6 on data property, writable and enumerable | 562 // Also exercise step 6 on data property, writable and enumerable |
609 // defaults to false. | 563 // defaults to false. |
610 Object.defineProperty(obj5, 'bar', dataNoConfigurable); | 564 assertTrue(Reflect.defineProperty(obj5, 'bar', dataNoConfigurable)); |
611 | 565 |
612 // Test that redefinition with the same property descriptor is possible | 566 // Test that redefinition with the same property descriptor is possible |
613 Object.defineProperty(obj5, 'bar', dataNoConfigurable); | 567 assertTrue(Reflect.defineProperty(obj5, 'bar', dataNoConfigurable)); |
614 | 568 |
615 // Different value. | 569 // Different value. |
616 descDifferent = { | 570 descDifferent = { |
617 configurable:false, | 571 configurable:false, |
618 enumerable:false, | 572 enumerable:false, |
619 writable: false, | 573 writable: false, |
620 value: 1999 | 574 value: 1999 |
621 }; | 575 }; |
622 | 576 |
623 try { | 577 assertFalse(Reflect.defineProperty(obj5, 'bar', descDifferent)); |
624 Object.defineProperty(obj5, 'bar', descDifferent); | |
625 assertTrue(false); | |
626 } catch (e) { | |
627 assertTrue(/Cannot redefine property/.test(e)); | |
628 } | |
629 | 578 |
630 // Different writable. | 579 // Different writable. |
631 descDifferent = { | 580 descDifferent = { |
632 configurable:false, | 581 configurable:false, |
633 enumerable:false, | 582 enumerable:false, |
634 writable: true, | 583 writable: true, |
635 value: 2000 | 584 value: 2000 |
636 }; | 585 }; |
637 | 586 |
638 try { | 587 assertFalse(Reflect.defineProperty(obj5, 'bar', descDifferent)); |
639 Object.defineProperty(obj5, 'bar', descDifferent); | |
640 assertTrue(false); | |
641 } catch (e) { | |
642 assertTrue(/Cannot redefine property/.test(e)); | |
643 } | |
644 | 588 |
645 | 589 |
646 // Different enumerable. | 590 // Different enumerable. |
647 descDifferent = { | 591 descDifferent = { |
648 configurable:false, | 592 configurable:false, |
649 enumerable:true , | 593 enumerable:true , |
650 writable:false, | 594 writable:false, |
651 value: 2000 | 595 value: 2000 |
652 }; | 596 }; |
653 | 597 |
654 try { | 598 assertFalse(Reflect.defineProperty(obj5, 'bar', descDifferent)); |
655 Object.defineProperty(obj5, 'bar', descDifferent); | |
656 assertTrue(false); | |
657 } catch (e) { | |
658 assertTrue(/Cannot redefine property/.test(e)); | |
659 } | |
660 | 599 |
661 | 600 |
662 // Different configurable. | 601 // Different configurable. |
663 descDifferent = { | 602 descDifferent = { |
664 configurable:true, | 603 configurable:true, |
665 enumerable:false, | 604 enumerable:false, |
666 writable:false, | 605 writable:false, |
667 value: 2000 | 606 value: 2000 |
668 }; | 607 }; |
669 | 608 |
670 try { | 609 assertFalse(Reflect.defineProperty(obj5, 'bar', descDifferent)); |
671 Object.defineProperty(obj5, 'bar', descDifferent); | |
672 assertTrue(false); | |
673 } catch (e) { | |
674 assertTrue(/Cannot redefine property/.test(e)); | |
675 } | |
676 | 610 |
677 // No difference. | 611 // No difference. |
678 descDifferent = { | 612 descDifferent = { |
679 configurable:false, | 613 configurable:false, |
680 enumerable:false, | 614 enumerable:false, |
681 writable:false, | 615 writable:false, |
682 value:2000 | 616 value:2000 |
683 }; | 617 }; |
684 // Make sure we can still redefine if all properties are the same. | 618 // Make sure we can still redefine if all properties are the same. |
685 Object.defineProperty(obj5, 'bar', descDifferent); | 619 assertTrue(Reflect.defineProperty(obj5, 'bar', descDifferent)); |
686 | 620 |
687 // Make sure that obj5 still holds the original values. | 621 // Make sure that obj5 still holds the original values. |
688 desc = Object.getOwnPropertyDescriptor(obj5, 'bar'); | 622 desc = Object.getOwnPropertyDescriptor(obj5, 'bar'); |
689 assertEquals(desc.value, 2000); | 623 assertEquals(desc.value, 2000); |
690 assertFalse(desc.writable); | 624 assertFalse(desc.writable); |
691 assertFalse(desc.enumerable); | 625 assertFalse(desc.enumerable); |
692 assertFalse(desc.configurable); | 626 assertFalse(desc.configurable); |
693 | 627 |
694 | 628 |
695 // Make sure that we can't overwrite +0 with -0 and vice versa. | 629 // Make sure that we can't overwrite +0 with -0 and vice versa. |
696 var descMinusZero = {value: -0, configurable: false}; | 630 var descMinusZero = {value: -0, configurable: false}; |
697 var descPlusZero = {value: +0, configurable: false}; | 631 var descPlusZero = {value: +0, configurable: false}; |
698 | 632 |
699 Object.defineProperty(obj5, 'minuszero', descMinusZero); | 633 assertTrue(Reflect.defineProperty(obj5, 'minuszero', descMinusZero)); |
700 | 634 |
701 // Make sure we can redefine with -0. | 635 // Make sure we can redefine with -0. |
702 Object.defineProperty(obj5, 'minuszero', descMinusZero); | 636 assertTrue(Reflect.defineProperty(obj5, 'minuszero', descMinusZero)); |
703 | 637 |
704 exception = false; | 638 assertFalse(Reflect.defineProperty(obj5, 'minuszero', descPlusZero)); |
705 try { | |
706 Object.defineProperty(obj5, 'minuszero', descPlusZero); | |
707 } catch (e) { | |
708 exception = true; | |
709 assertTrue(/Cannot redefine property/.test(e)); | |
710 } | |
711 assertTrue(exception); | |
712 | 639 |
713 | 640 |
714 Object.defineProperty(obj5, 'pluszero', descPlusZero); | 641 assertTrue(Reflect.defineProperty(obj5, 'pluszero', descPlusZero)); |
715 | 642 |
716 // Make sure we can redefine with +0. | 643 // Make sure we can redefine with +0. |
717 Object.defineProperty(obj5, 'pluszero', descPlusZero); | 644 assertTrue(Reflect.defineProperty(obj5, 'pluszero', descPlusZero)); |
718 | 645 |
719 exception = false; | 646 assertFalse(Reflect.defineProperty(obj5, 'pluszero', descMinusZero)); |
720 try { | |
721 Object.defineProperty(obj5, 'pluszero', descMinusZero); | |
722 } catch (e) { | |
723 exception = true; | |
724 assertTrue(/Cannot redefine property/.test(e)); | |
725 } | |
726 assertTrue(exception); | |
727 | 647 |
728 | 648 |
729 var obj6 = {}; | 649 var obj6 = {}; |
730 obj6[1] = 'foo'; | 650 obj6[1] = 'foo'; |
731 obj6[2] = 'bar'; | 651 obj6[2] = 'bar'; |
732 obj6[3] = '42'; | 652 obj6[3] = '42'; |
733 obj6[4] = '43'; | 653 obj6[4] = '43'; |
734 obj6[5] = '44'; | 654 obj6[5] = '44'; |
735 | 655 |
736 var descElement = { value: 'foobar' }; | 656 var descElement = { value: 'foobar' }; |
737 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; | 657 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; |
738 var descElementNonWritable = { value: 'foofoo', writable: false }; | 658 var descElementNonWritable = { value: 'foofoo', writable: false }; |
739 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; | 659 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; |
740 var descElementAllFalse = { value: 'foofalse', | 660 var descElementAllFalse = { value: 'foofalse', |
741 configurable: false, | 661 configurable: false, |
742 writable: false, | 662 writable: false, |
743 enumerable: false }; | 663 enumerable: false }; |
744 | 664 |
745 | 665 |
746 // Redefine existing property. | 666 // Redefine existing property. |
747 Object.defineProperty(obj6, '1', descElement); | 667 assertTrue(Reflect.defineProperty(obj6, '1', descElement)); |
748 desc = Object.getOwnPropertyDescriptor(obj6, '1'); | 668 desc = Object.getOwnPropertyDescriptor(obj6, '1'); |
749 assertEquals(desc.value, 'foobar'); | 669 assertEquals(desc.value, 'foobar'); |
750 assertTrue(desc.writable); | 670 assertTrue(desc.writable); |
751 assertTrue(desc.enumerable); | 671 assertTrue(desc.enumerable); |
752 assertTrue(desc.configurable); | 672 assertTrue(desc.configurable); |
753 | 673 |
754 // Redefine existing property with configurable: false. | 674 // Redefine existing property with configurable: false. |
755 Object.defineProperty(obj6, '2', descElementNonConfigurable); | 675 assertTrue(Reflect.defineProperty(obj6, '2', descElementNonConfigurable)); |
756 desc = Object.getOwnPropertyDescriptor(obj6, '2'); | 676 desc = Object.getOwnPropertyDescriptor(obj6, '2'); |
757 assertEquals(desc.value, 'barfoo'); | 677 assertEquals(desc.value, 'barfoo'); |
758 assertTrue(desc.writable); | 678 assertTrue(desc.writable); |
759 assertTrue(desc.enumerable); | 679 assertTrue(desc.enumerable); |
760 assertFalse(desc.configurable); | 680 assertFalse(desc.configurable); |
761 | 681 |
762 // Can use defineProperty to change the value of a non | 682 // Can use defineProperty to change the value of a non |
763 // configurable property. | 683 // configurable property. |
764 try { | 684 try { |
765 Object.defineProperty(obj6, '2', descElement); | 685 assertTrue(Reflect.defineProperty(obj6, '2', descElement)); |
766 desc = Object.getOwnPropertyDescriptor(obj6, '2'); | 686 desc = Object.getOwnPropertyDescriptor(obj6, '2'); |
767 assertEquals(desc.value, 'foobar'); | 687 assertEquals(desc.value, 'foobar'); |
768 } catch (e) { | 688 } catch (e) { |
769 assertUnreachable(); | 689 assertUnreachable(); |
770 } | 690 } |
771 | 691 |
772 // Ensure that we can't change the descriptor of a | 692 // Ensure that we can't change the descriptor of a |
773 // non configurable property. | 693 // non configurable property. |
774 exception = false; | 694 var descAccessor = { get: function() { return 0; } }; |
775 try { | 695 assertFalse(Reflect.defineProperty(obj6, '2', descAccessor)); |
776 var descAccessor = { get: function() { return 0; } }; | |
777 Object.defineProperty(obj6, '2', descAccessor); | |
778 } catch (e) { | |
779 exception = true; | |
780 assertTrue(/Cannot redefine property/.test(e)); | |
781 } | |
782 assertTrue(exception); | |
783 | 696 |
784 Object.defineProperty(obj6, '2', descElementNonWritable); | 697 assertTrue(Reflect.defineProperty(obj6, '2', descElementNonWritable)); |
785 desc = Object.getOwnPropertyDescriptor(obj6, '2'); | 698 desc = Object.getOwnPropertyDescriptor(obj6, '2'); |
786 assertEquals(desc.value, 'foofoo'); | 699 assertEquals(desc.value, 'foofoo'); |
787 assertFalse(desc.writable); | 700 assertFalse(desc.writable); |
788 assertTrue(desc.enumerable); | 701 assertTrue(desc.enumerable); |
789 assertFalse(desc.configurable); | 702 assertFalse(desc.configurable); |
790 | 703 |
791 Object.defineProperty(obj6, '3', descElementNonWritable); | 704 assertTrue(Reflect.defineProperty(obj6, '3', descElementNonWritable)); |
792 desc = Object.getOwnPropertyDescriptor(obj6, '3'); | 705 desc = Object.getOwnPropertyDescriptor(obj6, '3'); |
793 assertEquals(desc.value, 'foofoo'); | 706 assertEquals(desc.value, 'foofoo'); |
794 assertFalse(desc.writable); | 707 assertFalse(desc.writable); |
795 assertTrue(desc.enumerable); | 708 assertTrue(desc.enumerable); |
796 assertTrue(desc.configurable); | 709 assertTrue(desc.configurable); |
797 | 710 |
798 // Redefine existing property with configurable: false. | 711 // Redefine existing property with configurable: false. |
799 Object.defineProperty(obj6, '4', descElementNonEnumerable); | 712 assertTrue(Reflect.defineProperty(obj6, '4', descElementNonEnumerable)); |
800 desc = Object.getOwnPropertyDescriptor(obj6, '4'); | 713 desc = Object.getOwnPropertyDescriptor(obj6, '4'); |
801 assertEquals(desc.value, 'barbar'); | 714 assertEquals(desc.value, 'barbar'); |
802 assertTrue(desc.writable); | 715 assertTrue(desc.writable); |
803 assertFalse(desc.enumerable); | 716 assertFalse(desc.enumerable); |
804 assertTrue(desc.configurable); | 717 assertTrue(desc.configurable); |
805 | 718 |
806 // Redefine existing property with configurable: false. | 719 // Redefine existing property with configurable: false. |
807 Object.defineProperty(obj6, '5', descElementAllFalse); | 720 assertTrue(Reflect.defineProperty(obj6, '5', descElementAllFalse)); |
808 desc = Object.getOwnPropertyDescriptor(obj6, '5'); | 721 desc = Object.getOwnPropertyDescriptor(obj6, '5'); |
809 assertEquals(desc.value, 'foofalse'); | 722 assertEquals(desc.value, 'foofalse'); |
810 assertFalse(desc.writable); | 723 assertFalse(desc.writable); |
811 assertFalse(desc.enumerable); | 724 assertFalse(desc.enumerable); |
812 assertFalse(desc.configurable); | 725 assertFalse(desc.configurable); |
813 | 726 |
814 // Define non existing property - all attributes should default to false. | 727 // Define non existing property - all attributes should default to false. |
815 Object.defineProperty(obj6, '15', descElement); | 728 assertTrue(Reflect.defineProperty(obj6, '15', descElement)); |
816 desc = Object.getOwnPropertyDescriptor(obj6, '15'); | 729 desc = Object.getOwnPropertyDescriptor(obj6, '15'); |
817 assertEquals(desc.value, 'foobar'); | 730 assertEquals(desc.value, 'foobar'); |
818 assertFalse(desc.writable); | 731 assertFalse(desc.writable); |
819 assertFalse(desc.enumerable); | 732 assertFalse(desc.enumerable); |
820 assertFalse(desc.configurable); | 733 assertFalse(desc.configurable); |
821 | 734 |
822 // Make sure that we can't redefine using direct access. | 735 // Make sure that we can't redefine using direct access. |
823 obj6[15] ='overwrite'; | 736 obj6[15] ='overwrite'; |
824 assertEquals(obj6[15],'foobar'); | 737 assertEquals(obj6[15],'foobar'); |
825 | 738 |
(...skipping 10 matching lines...) Expand all Loading... | |
836 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; | 749 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; |
837 var descElementNonWritable = { value: 'foofoo', writable: false }; | 750 var descElementNonWritable = { value: 'foofoo', writable: false }; |
838 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; | 751 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; |
839 var descElementAllFalse = { value: 'foofalse', | 752 var descElementAllFalse = { value: 'foofalse', |
840 configurable: false, | 753 configurable: false, |
841 writable: false, | 754 writable: false, |
842 enumerable: false }; | 755 enumerable: false }; |
843 | 756 |
844 | 757 |
845 // Redefine existing property. | 758 // Redefine existing property. |
846 Object.defineProperty(arr, '1', descElement); | 759 assertTrue(Reflect.defineProperty(arr, '1', descElement)); |
847 desc = Object.getOwnPropertyDescriptor(arr, '1'); | 760 desc = Object.getOwnPropertyDescriptor(arr, '1'); |
848 assertEquals(desc.value, 'foobar'); | 761 assertEquals(desc.value, 'foobar'); |
849 assertTrue(desc.writable); | 762 assertTrue(desc.writable); |
850 assertTrue(desc.enumerable); | 763 assertTrue(desc.enumerable); |
851 assertTrue(desc.configurable); | 764 assertTrue(desc.configurable); |
852 | 765 |
853 // Redefine existing property with configurable: false. | 766 // Redefine existing property with configurable: false. |
854 Object.defineProperty(arr, '2', descElementNonConfigurable); | 767 assertTrue(Reflect.defineProperty(arr, '2', descElementNonConfigurable)); |
855 desc = Object.getOwnPropertyDescriptor(arr, '2'); | 768 desc = Object.getOwnPropertyDescriptor(arr, '2'); |
856 assertEquals(desc.value, 'barfoo'); | 769 assertEquals(desc.value, 'barfoo'); |
857 assertTrue(desc.writable); | 770 assertTrue(desc.writable); |
858 assertTrue(desc.enumerable); | 771 assertTrue(desc.enumerable); |
859 assertFalse(desc.configurable); | 772 assertFalse(desc.configurable); |
860 | 773 |
861 // Can use defineProperty to change the value of a non | 774 // Can use defineProperty to change the value of a non |
862 // configurable property of an array. | 775 // configurable property of an array. |
863 try { | 776 try { |
864 Object.defineProperty(arr, '2', descElement); | 777 assertTrue(Reflect.defineProperty(arr, '2', descElement)); |
865 desc = Object.getOwnPropertyDescriptor(arr, '2'); | 778 desc = Object.getOwnPropertyDescriptor(arr, '2'); |
866 assertEquals(desc.value, 'foobar'); | 779 assertEquals(desc.value, 'foobar'); |
867 } catch (e) { | 780 } catch (e) { |
868 assertUnreachable(); | 781 assertUnreachable(); |
869 } | 782 } |
870 | 783 |
871 // Ensure that we can't change the descriptor of a | 784 // Ensure that we can't change the descriptor of a |
872 // non configurable property. | 785 // non configurable property. |
873 exception = false; | 786 var descAccessor = { get: function() { return 0; } }; |
874 try { | 787 assertFalse(Reflect.defineProperty(arr, '2', descAccessor)); |
875 var descAccessor = { get: function() { return 0; } }; | |
876 Object.defineProperty(arr, '2', descAccessor); | |
877 } catch (e) { | |
878 exception = true; | |
879 assertTrue(/Cannot redefine property/.test(e)); | |
880 } | |
881 assertTrue(exception); | |
882 | 788 |
883 Object.defineProperty(arr, '2', descElementNonWritable); | 789 assertTrue(Reflect.defineProperty(arr, '2', descElementNonWritable)); |
884 desc = Object.getOwnPropertyDescriptor(arr, '2'); | 790 desc = Object.getOwnPropertyDescriptor(arr, '2'); |
885 assertEquals(desc.value, 'foofoo'); | 791 assertEquals(desc.value, 'foofoo'); |
886 assertFalse(desc.writable); | 792 assertFalse(desc.writable); |
887 assertTrue(desc.enumerable); | 793 assertTrue(desc.enumerable); |
888 assertFalse(desc.configurable); | 794 assertFalse(desc.configurable); |
889 | 795 |
890 Object.defineProperty(arr, '3', descElementNonWritable); | 796 assertTrue(Reflect.defineProperty(arr, '3', descElementNonWritable)); |
891 desc = Object.getOwnPropertyDescriptor(arr, '3'); | 797 desc = Object.getOwnPropertyDescriptor(arr, '3'); |
892 assertEquals(desc.value, 'foofoo'); | 798 assertEquals(desc.value, 'foofoo'); |
893 assertFalse(desc.writable); | 799 assertFalse(desc.writable); |
894 assertTrue(desc.enumerable); | 800 assertTrue(desc.enumerable); |
895 assertTrue(desc.configurable); | 801 assertTrue(desc.configurable); |
896 | 802 |
897 // Redefine existing property with configurable: false. | 803 // Redefine existing property with configurable: false. |
898 Object.defineProperty(arr, '4', descElementNonEnumerable); | 804 assertTrue(Reflect.defineProperty(arr, '4', descElementNonEnumerable)); |
899 desc = Object.getOwnPropertyDescriptor(arr, '4'); | 805 desc = Object.getOwnPropertyDescriptor(arr, '4'); |
900 assertEquals(desc.value, 'barbar'); | 806 assertEquals(desc.value, 'barbar'); |
901 assertTrue(desc.writable); | 807 assertTrue(desc.writable); |
902 assertFalse(desc.enumerable); | 808 assertFalse(desc.enumerable); |
903 assertTrue(desc.configurable); | 809 assertTrue(desc.configurable); |
904 | 810 |
905 // Redefine existing property with configurable: false. | 811 // Redefine existing property with configurable: false. |
906 Object.defineProperty(arr, '5', descElementAllFalse); | 812 assertTrue(Reflect.defineProperty(arr, '5', descElementAllFalse)); |
907 desc = Object.getOwnPropertyDescriptor(arr, '5'); | 813 desc = Object.getOwnPropertyDescriptor(arr, '5'); |
908 assertEquals(desc.value, 'foofalse'); | 814 assertEquals(desc.value, 'foofalse'); |
909 assertFalse(desc.writable); | 815 assertFalse(desc.writable); |
910 assertFalse(desc.enumerable); | 816 assertFalse(desc.enumerable); |
911 assertFalse(desc.configurable); | 817 assertFalse(desc.configurable); |
912 | 818 |
913 // Define non existing property - all attributes should default to false. | 819 // Define non existing property - all attributes should default to false. |
914 Object.defineProperty(arr, '15', descElement); | 820 assertTrue(Reflect.defineProperty(arr, '15', descElement)); |
915 desc = Object.getOwnPropertyDescriptor(arr, '15'); | 821 desc = Object.getOwnPropertyDescriptor(arr, '15'); |
916 assertEquals(desc.value, 'foobar'); | 822 assertEquals(desc.value, 'foobar'); |
917 assertFalse(desc.writable); | 823 assertFalse(desc.writable); |
918 assertFalse(desc.enumerable); | 824 assertFalse(desc.enumerable); |
919 assertFalse(desc.configurable); | 825 assertFalse(desc.configurable); |
920 | 826 |
921 // Define non-array property, check that .length is unaffected. | 827 // Define non-array property, check that .length is unaffected. |
922 assertEquals(16, arr.length); | 828 assertEquals(16, arr.length); |
923 Object.defineProperty(arr, '0x20', descElement); | 829 assertTrue(Reflect.defineProperty(arr, '0x20', descElement)); |
924 assertEquals(16, arr.length); | 830 assertEquals(16, arr.length); |
925 | 831 |
926 // See issue 968: http://code.google.com/p/v8/issues/detail?id=968 | 832 // See issue 968: http://code.google.com/p/v8/issues/detail?id=968 |
927 var o = { x : 42 }; | 833 var o = { x : 42 }; |
928 Object.defineProperty(o, "x", { writable: false }); | 834 assertTrue(Reflect.defineProperty(o, "x", { writable: false })); |
929 assertEquals(42, o.x); | 835 assertEquals(42, o.x); |
930 o.x = 37; | 836 o.x = 37; |
931 assertEquals(42, o.x); | 837 assertEquals(42, o.x); |
932 | 838 |
933 o = { x : 42 }; | 839 o = { x : 42 }; |
934 Object.defineProperty(o, "x", {}); | 840 assertTrue(Reflect.defineProperty(o, "x", {})); |
935 assertEquals(42, o.x); | 841 assertEquals(42, o.x); |
936 o.x = 37; | 842 o.x = 37; |
937 // Writability is preserved. | 843 // Writability is preserved. |
938 assertEquals(37, o.x); | 844 assertEquals(37, o.x); |
939 | 845 |
940 var o = { }; | 846 var o = { }; |
941 Object.defineProperty(o, "x", { writable: false }); | 847 assertTrue(Reflect.defineProperty(o, "x", { writable: false })); |
942 assertEquals(undefined, o.x); | 848 assertEquals(undefined, o.x); |
943 o.x = 37; | 849 o.x = 37; |
944 assertEquals(undefined, o.x); | 850 assertEquals(undefined, o.x); |
945 | 851 |
946 o = { get x() { return 87; } }; | 852 o = { get x() { return 87; } }; |
947 Object.defineProperty(o, "x", { writable: false }); | 853 assertTrue(Reflect.defineProperty(o, "x", { writable: false })); |
948 assertEquals(undefined, o.x); | 854 assertEquals(undefined, o.x); |
949 o.x = 37; | 855 o.x = 37; |
950 assertEquals(undefined, o.x); | 856 assertEquals(undefined, o.x); |
951 | 857 |
952 // Ignore inherited properties. | 858 // Ignore inherited properties. |
953 o = { __proto__ : { x : 87 } }; | 859 o = { __proto__ : { x : 87 } }; |
954 Object.defineProperty(o, "x", { writable: false }); | 860 assertTrue(Reflect.defineProperty(o, "x", { writable: false })); |
955 assertEquals(undefined, o.x); | 861 assertEquals(undefined, o.x); |
956 o.x = 37; | 862 o.x = 37; |
957 assertEquals(undefined, o.x); | 863 assertEquals(undefined, o.x); |
958 | 864 |
959 function testDefineProperty(obj, propertyName, desc, resultDesc) { | 865 function testDefineProperty(obj, propertyName, desc, resultDesc) { |
960 Object.defineProperty(obj, propertyName, desc); | 866 assertTrue(Reflect.defineProperty(obj, propertyName, desc)); |
961 var actualDesc = Object.getOwnPropertyDescriptor(obj, propertyName); | 867 var actualDesc = Object.getOwnPropertyDescriptor(obj, propertyName); |
962 assertEquals(resultDesc.enumerable, actualDesc.enumerable); | 868 assertEquals(resultDesc.enumerable, actualDesc.enumerable); |
963 assertEquals(resultDesc.configurable, actualDesc.configurable); | 869 assertEquals(resultDesc.configurable, actualDesc.configurable); |
964 if (resultDesc.hasOwnProperty('value')) { | 870 if (resultDesc.hasOwnProperty('value')) { |
965 assertEquals(resultDesc.value, actualDesc.value); | 871 assertEquals(resultDesc.value, actualDesc.value); |
966 assertEquals(resultDesc.writable, actualDesc.writable); | 872 assertEquals(resultDesc.writable, actualDesc.writable); |
967 assertFalse(resultDesc.hasOwnProperty('get')); | 873 assertFalse(resultDesc.hasOwnProperty('get')); |
968 assertFalse(resultDesc.hasOwnProperty('set')); | 874 assertFalse(resultDesc.hasOwnProperty('set')); |
969 } else { | 875 } else { |
970 assertEquals(resultDesc.get, actualDesc.get); | 876 assertEquals(resultDesc.get, actualDesc.get); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1015 { enumerable : true, configurable : false }, | 921 { enumerable : true, configurable : false }, |
1016 { value : 42, writable : true, enumerable : true, configurable : false }); | 922 { value : 42, writable : true, enumerable : true, configurable : false }); |
1017 | 923 |
1018 o = { p : 42 }; | 924 o = { p : 42 }; |
1019 testDefineProperty(o, 'p', | 925 testDefineProperty(o, 'p', |
1020 { enumerable : false, configurable : false }, | 926 { enumerable : false, configurable : false }, |
1021 { value : 42, writable : true, enumerable : false, configurable : false }); | 927 { value : 42, writable : true, enumerable : false, configurable : false }); |
1022 | 928 |
1023 // can make a writable, non-configurable field non-writable | 929 // can make a writable, non-configurable field non-writable |
1024 o = { p : 42 }; | 930 o = { p : 42 }; |
1025 Object.defineProperty(o, 'p', { configurable: false }); | 931 assertTrue(Reflect.defineProperty(o, 'p', { configurable: false })); |
1026 testDefineProperty(o, 'p', | 932 testDefineProperty(o, 'p', |
1027 { writable: false }, | 933 { writable: false }, |
1028 { value : 42, writable : false, enumerable : true, configurable : false }); | 934 { value : 42, writable : false, enumerable : true, configurable : false }); |
1029 | 935 |
1030 // redefine of get only property with generic descriptor | 936 // redefine of get only property with generic descriptor |
1031 o = {}; | 937 o = {}; |
1032 Object.defineProperty(o, 'p', | 938 assertTrue(Reflect.defineProperty(o, 'p', |
1033 { get : getter1, enumerable: true, configurable: true }); | 939 { get : getter1, enumerable: true, configurable: true })); |
1034 testDefineProperty(o, 'p', | 940 testDefineProperty(o, 'p', |
1035 { enumerable : false, configurable : false }, | 941 { enumerable : false, configurable : false }, |
1036 { get: getter1, set: undefined, enumerable : false, configurable : false }); | 942 { get: getter1, set: undefined, enumerable : false, configurable : false }); |
1037 | 943 |
1038 // redefine of get/set only property with generic descriptor | 944 // redefine of get/set only property with generic descriptor |
1039 o = {}; | 945 o = {}; |
1040 Object.defineProperty(o, 'p', | 946 assertTrue(Reflect.defineProperty(o, 'p', |
1041 { get: getter1, set: setter1, enumerable: true, configurable: true }); | 947 { get: getter1, set: setter1, enumerable: true, configurable: true })); |
1042 testDefineProperty(o, 'p', | 948 testDefineProperty(o, 'p', |
1043 { enumerable : false, configurable : false }, | 949 { enumerable : false, configurable : false }, |
1044 { get: getter1, set: setter1, enumerable : false, configurable : false }); | 950 { get: getter1, set: setter1, enumerable : false, configurable : false }); |
1045 | 951 |
1046 // redefine of set only property with generic descriptor | 952 // redefine of set only property with generic descriptor |
1047 o = {}; | 953 o = {}; |
1048 Object.defineProperty(o, 'p', | 954 assertTrue(Reflect.defineProperty(o, 'p', |
1049 { set : setter1, enumerable: true, configurable: true }); | 955 { set : setter1, enumerable: true, configurable: true })); |
1050 testDefineProperty(o, 'p', | 956 testDefineProperty(o, 'p', |
1051 { enumerable : false, configurable : false }, | 957 { enumerable : false, configurable : false }, |
1052 { get: undefined, set: setter1, enumerable : false, configurable : false }); | 958 { get: undefined, set: setter1, enumerable : false, configurable : false }); |
1053 | 959 |
1054 | 960 |
1055 // Regression test: Ensure that growing dictionaries are not ignored. | 961 // Regression test: Ensure that growing dictionaries are not ignored. |
1056 o = {}; | 962 o = {}; |
1057 for (var i = 0; i < 1000; i++) { | 963 for (var i = 0; i < 1000; i++) { |
1058 // Non-enumerable property forces dictionary mode. | 964 // Non-enumerable property forces dictionary mode. |
1059 Object.defineProperty(o, i, {value: i, enumerable: false}); | 965 assertTrue(Reflect.defineProperty(o, i, {value: i, enumerable: false})); |
1060 } | 966 } |
1061 assertEquals(999, o[999]); | 967 assertEquals(999, o[999]); |
1062 | 968 |
1063 | 969 |
1064 // Regression test: Bizzare behavior on non-strict arguments object. | 970 // Regression test: Bizzare behavior on non-strict arguments object. |
1065 // TODO(yangguo): Tests disabled, needs investigation! | 971 // TODO(yangguo): Tests disabled, needs investigation! |
1066 /* | 972 /* |
1067 (function test(arg0) { | 973 (function test(arg0) { |
1068 // Here arguments[0] is a fast alias on arg0. | 974 // Here arguments[0] is a fast alias on arg0. |
1069 Object.defineProperty(arguments, "0", { | 975 Reflect.defineProperty(arguments, "0", { |
1070 value:1, | 976 value:1, |
1071 enumerable:false | 977 enumerable:false |
1072 }); | 978 }); |
1073 // Here arguments[0] is a slow alias on arg0. | 979 // Here arguments[0] is a slow alias on arg0. |
1074 Object.defineProperty(arguments, "0", { | 980 Reflect.defineProperty(arguments, "0", { |
1075 value:2, | 981 value:2, |
1076 writable:false | 982 writable:false |
1077 }); | 983 }); |
1078 // Here arguments[0] is no alias at all. | 984 // Here arguments[0] is no alias at all. |
1079 Object.defineProperty(arguments, "0", { | 985 Reflect.defineProperty(arguments, "0", { |
1080 value:3 | 986 value:3 |
1081 }); | 987 }); |
1082 assertEquals(2, arg0); | 988 assertEquals(2, arg0); |
1083 assertEquals(3, arguments[0]); | 989 assertEquals(3, arguments[0]); |
1084 })(0); | 990 })(0); |
1085 */ | 991 */ |
1086 | 992 |
1087 // Regression test: We should never observe the hole value. | 993 // Regression test: We should never observe the hole value. |
1088 var objectWithGetter = {}; | 994 var objectWithGetter = {}; |
1089 objectWithGetter.__defineGetter__('foo', function() {}); | 995 objectWithGetter.__defineGetter__('foo', function() {}); |
1090 assertEquals(undefined, objectWithGetter.__lookupSetter__('foo')); | 996 assertEquals(undefined, objectWithGetter.__lookupSetter__('foo')); |
1091 | 997 |
1092 var objectWithSetter = {}; | 998 var objectWithSetter = {}; |
1093 objectWithSetter.__defineSetter__('foo', function(x) {}); | 999 objectWithSetter.__defineSetter__('foo', function(x) {}); |
1094 assertEquals(undefined, objectWithSetter.__lookupGetter__('foo')); | 1000 assertEquals(undefined, objectWithSetter.__lookupGetter__('foo')); |
1095 | 1001 |
1096 // An object with a getter on the prototype chain. | 1002 // An object with a getter on the prototype chain. |
1097 function getter() { return 111; } | 1003 function getter() { return 111; } |
1098 function anotherGetter() { return 222; } | 1004 function anotherGetter() { return 222; } |
1099 | 1005 |
1100 function testGetterOnProto(expected, o) { | 1006 function testGetterOnProto(expected, o) { |
1101 assertEquals(expected, o.quebec); | 1007 assertEquals(expected, o.quebec); |
1102 } | 1008 } |
1103 | 1009 |
1104 obj1 = {}; | 1010 obj1 = {}; |
1105 Object.defineProperty(obj1, "quebec", { get: getter, configurable: true }); | 1011 assertTrue( |
1012 Reflect.defineProperty(obj1, "quebec", { get: getter, configurable: true })); | |
1106 obj2 = Object.create(obj1); | 1013 obj2 = Object.create(obj1); |
1107 obj3 = Object.create(obj2); | 1014 obj3 = Object.create(obj2); |
1108 | 1015 |
1109 testGetterOnProto(111, obj3); | 1016 testGetterOnProto(111, obj3); |
1110 testGetterOnProto(111, obj3); | 1017 testGetterOnProto(111, obj3); |
1111 %OptimizeFunctionOnNextCall(testGetterOnProto); | 1018 %OptimizeFunctionOnNextCall(testGetterOnProto); |
1112 testGetterOnProto(111, obj3); | 1019 testGetterOnProto(111, obj3); |
1113 testGetterOnProto(111, obj3); | 1020 testGetterOnProto(111, obj3); |
1114 | 1021 |
1115 Object.defineProperty(obj1, "quebec", { get: anotherGetter }); | 1022 assertTrue(Reflect.defineProperty(obj1, "quebec", { get: anotherGetter })); |
1116 | 1023 |
1117 testGetterOnProto(222, obj3); | 1024 testGetterOnProto(222, obj3); |
1118 testGetterOnProto(222, obj3); | 1025 testGetterOnProto(222, obj3); |
1119 %OptimizeFunctionOnNextCall(testGetterOnProto); | 1026 %OptimizeFunctionOnNextCall(testGetterOnProto); |
1120 testGetterOnProto(222, obj3); | 1027 testGetterOnProto(222, obj3); |
1121 testGetterOnProto(222, obj3); | 1028 testGetterOnProto(222, obj3); |
1122 | 1029 |
1123 // An object with a setter on the prototype chain. | 1030 // An object with a setter on the prototype chain. |
1124 var modifyMe; | 1031 var modifyMe; |
1125 function setter(x) { modifyMe = x+1; } | 1032 function setter(x) { modifyMe = x+1; } |
1126 function anotherSetter(x) { modifyMe = x+2; } | 1033 function anotherSetter(x) { modifyMe = x+2; } |
1127 | 1034 |
1128 function testSetterOnProto(expected, o) { | 1035 function testSetterOnProto(expected, o) { |
1129 modifyMe = 333; | 1036 modifyMe = 333; |
1130 o.romeo = 444; | 1037 o.romeo = 444; |
1131 assertEquals(expected, modifyMe); | 1038 assertEquals(expected, modifyMe); |
1132 } | 1039 } |
1133 | 1040 |
1134 obj1 = {}; | 1041 obj1 = {}; |
1135 Object.defineProperty(obj1, "romeo", { set: setter, configurable: true }); | 1042 assertTrue( |
1043 Reflect.defineProperty(obj1, "romeo", { set: setter, configurable: true })); | |
1136 obj2 = Object.create(obj1); | 1044 obj2 = Object.create(obj1); |
1137 obj3 = Object.create(obj2); | 1045 obj3 = Object.create(obj2); |
1138 | 1046 |
1139 testSetterOnProto(445, obj3); | 1047 testSetterOnProto(445, obj3); |
1140 testSetterOnProto(445, obj3); | 1048 testSetterOnProto(445, obj3); |
1141 %OptimizeFunctionOnNextCall(testSetterOnProto); | 1049 %OptimizeFunctionOnNextCall(testSetterOnProto); |
1142 testSetterOnProto(445, obj3); | 1050 testSetterOnProto(445, obj3); |
1143 testSetterOnProto(445, obj3); | 1051 testSetterOnProto(445, obj3); |
1144 | 1052 |
1145 Object.defineProperty(obj1, "romeo", { set: anotherSetter }); | 1053 assertTrue(Reflect.defineProperty(obj1, "romeo", { set: anotherSetter })); |
1146 | 1054 |
1147 testSetterOnProto(446, obj3); | 1055 testSetterOnProto(446, obj3); |
1148 testSetterOnProto(446, obj3); | 1056 testSetterOnProto(446, obj3); |
1149 %OptimizeFunctionOnNextCall(testSetterOnProto); | 1057 %OptimizeFunctionOnNextCall(testSetterOnProto); |
1150 testSetterOnProto(446, obj3); | 1058 testSetterOnProto(446, obj3); |
1151 testSetterOnProto(446, obj3); | 1059 testSetterOnProto(446, obj3); |
1152 | 1060 |
1153 // Removing a setter on the prototype chain. | 1061 // Removing a setter on the prototype chain. |
1154 function testSetterOnProtoStrict(o) { | 1062 function testSetterOnProtoStrict(o) { |
1155 "use strict"; | 1063 "use strict"; |
1156 o.sierra = 12345; | 1064 o.sierra = 12345; |
1157 } | 1065 } |
1158 | 1066 |
1159 obj1 = {}; | 1067 obj1 = {}; |
1160 Object.defineProperty(obj1, "sierra", | 1068 assertTrue(Reflect.defineProperty(obj1, "sierra", |
1161 { get: getter, set: setter, configurable: true }); | 1069 { get: getter, set: setter, configurable: true })); |
1162 obj2 = Object.create(obj1); | 1070 obj2 = Object.create(obj1); |
1163 obj3 = Object.create(obj2); | 1071 obj3 = Object.create(obj2); |
1164 | 1072 |
1165 testSetterOnProtoStrict(obj3); | 1073 testSetterOnProtoStrict(obj3); |
1166 testSetterOnProtoStrict(obj3); | 1074 testSetterOnProtoStrict(obj3); |
1167 %OptimizeFunctionOnNextCall(testSetterOnProtoStrict); | 1075 %OptimizeFunctionOnNextCall(testSetterOnProtoStrict); |
1168 testSetterOnProtoStrict(obj3); | 1076 testSetterOnProtoStrict(obj3); |
1169 testSetterOnProtoStrict(obj3); | 1077 testSetterOnProtoStrict(obj3); |
1170 | 1078 |
1171 Object.defineProperty(obj1, "sierra", | 1079 assertTrue(Reflect.defineProperty(obj1, "sierra", |
1172 { get: getter, set: undefined, configurable: true }); | 1080 { get: getter, set: undefined, configurable: true })); |
1173 | 1081 |
1174 exception = false; | 1082 exception = false; |
1175 try { | 1083 try { |
1176 testSetterOnProtoStrict(obj3); | 1084 testSetterOnProtoStrict(obj3); |
1177 } catch (e) { | 1085 } catch (e) { |
1178 exception = true; | 1086 exception = true; |
1179 assertTrue(/which has only a getter/.test(e)); | 1087 assertTrue(/which has only a getter/.test(e)); |
1180 } | 1088 } |
1181 assertTrue(exception); | 1089 assertTrue(exception); |
1182 | 1090 |
1183 // Test assignment to a getter-only property on the prototype chain. This makes | 1091 // Test assignment to a getter-only property on the prototype chain. This makes |
1184 // sure that crankshaft re-checks its assumptions and doesn't rely only on type | 1092 // sure that crankshaft re-checks its assumptions and doesn't rely only on type |
1185 // feedback (which would be monomorphic here). | 1093 // feedback (which would be monomorphic here). |
1186 | 1094 |
1187 function Assign(o) { | 1095 function Assign(o) { |
1188 o.blubb = 123; | 1096 o.blubb = 123; |
1189 } | 1097 } |
1190 | 1098 |
1191 function C() {} | 1099 function C() {} |
1192 | 1100 |
1193 Assign(new C); | 1101 Assign(new C); |
1194 Assign(new C); | 1102 Assign(new C); |
1195 %OptimizeFunctionOnNextCall(Assign); | 1103 %OptimizeFunctionOnNextCall(Assign); |
1196 Object.defineProperty(C.prototype, "blubb", {get: function() { return -42; }}); | 1104 assertTrue( |
1105 Reflect.defineProperty(C.prototype, "blubb", {get: function() {return -42}})); | |
1197 Assign(new C); | 1106 Assign(new C); |
1198 | 1107 |
1199 // Test that changes to the prototype of a simple constructor are not ignored, | 1108 // Test that changes to the prototype of a simple constructor are not ignored, |
1200 // even after creating initial instances. | 1109 // even after creating initial instances. |
1201 function C() { | 1110 function C() { |
1202 this.x = 23; | 1111 this.x = 23; |
1203 } | 1112 } |
1204 assertEquals(23, new C().x); | 1113 assertEquals(23, new C().x); |
1205 C.prototype.__defineSetter__('x', function(value) { this.y = 23; }); | 1114 C.prototype.__defineSetter__('x', function(value) { this.y = 23; }); |
1206 assertEquals(void 0, new C().x); | 1115 assertEquals(void 0, new C().x); |
OLD | NEW |