Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: test/mjsunit/harmony/reflect-define-property.js

Issue 1421033002: [es6] Partially implement Reflect.defineProperty. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Address a comment and rebase. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « test/mjsunit/harmony/reflect.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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);
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
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
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
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
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);
OLDNEW
« no previous file with comments | « test/mjsunit/harmony/reflect.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698