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

Side by Side Diff: test/mjsunit/harmony/proxies.js

Issue 7623013: Test (and fix) all exception paths that can occur with proxies. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 4 months 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 | Annotate | Revision Log
« no previous file with comments | « src/objects.cc ('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 2008 the V8 project authors. All rights reserved. 1 // Copyright 2008 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
(...skipping 10 matching lines...) Expand all
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 // Flags: --harmony-proxies 28 // Flags: --harmony-proxies
29 29
30 30
31 // TODO(rossberg): test exception cases.
32 // TODO(rossberg): test proxies as prototypes.
33 // TODO(rossberg): for-in for proxies not implemented. 31 // TODO(rossberg): for-in for proxies not implemented.
32 // TODO(rossberg): inheritance from proxies not implemented.
34 // TODO(rossberg): function proxies as constructors not implemented. 33 // TODO(rossberg): function proxies as constructors not implemented.
35 34
36 35
37 // Helper. 36 // Helper.
38 37
39 function TestWithProxies(test, handler) { 38 function TestWithProxies(test, handler) {
40 test(handler, Proxy.create) 39 test(handler, Proxy.create)
41 test(handler, function(h) {return Proxy.createFunction(h, function() {})}) 40 test(handler, function(h) {return Proxy.createFunction(h, function() {})})
42 } 41 }
43 42
44 43
45 // Getters. 44 // Getters.
46 45
47 function TestGet(handler) { 46 function TestGet(handler) {
48 TestWithProxies(TestGet2, handler) 47 TestWithProxies(TestGet2, handler)
49 } 48 }
50 49
51 function TestGet2(handler, create) { 50 function TestGet2(handler, create) {
52 var o = create(handler) 51 var p = create(handler)
53 assertEquals(42, o.a) 52 assertEquals(42, p.a)
54 assertEquals(42, o["b"]) 53 assertEquals(42, p["b"])
54
55 // TODO(rossberg): inheritance from proxies not yet implemented.
56 // var o = Object.create(p, {x: {value: 88}})
57 // assertEquals(42, o.a)
58 // assertEquals(42, o["b"])
59 // assertEquals(88, o.x)
60 // assertEquals(88, o["x"])
55 } 61 }
56 62
57 TestGet({ 63 TestGet({
58 get: function(r, k) { return 42 } 64 get: function(r, k) { return 42 }
59 }) 65 })
60 66
61 TestGet({ 67 TestGet({
62 get: function(r, k) { return this.get2(r, k) }, 68 get: function(r, k) { return this.get2(r, k) },
63 get2: function(r, k) { return 42 } 69 get2: function(r, k) { return 42 }
64 }) 70 })
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 } 157 }
152 }) 158 })
153 159
154 TestGetCall(Proxy.create({ 160 TestGetCall(Proxy.create({
155 get: function(pr, pk) { 161 get: function(pr, pk) {
156 return function(r, k) { return function() { return 55 } } 162 return function(r, k) { return function() { return 55 } }
157 } 163 }
158 })) 164 }))
159 165
160 166
167 function TestGetThrow(handler) {
168 TestWithProxies(TestGetThrow2, handler)
Kevin Millikin (Chromium) 2011/09/07 12:51:36 This is impressively indirect.
rossberg 2011/09/07 14:59:34 And still there is far too much duplication in the
169 }
170
171 function TestGetThrow2(handler, create) {
172 var p = create(handler)
173 assertThrows(function(){ p.a }, "myexn")
174 assertThrows(function(){ p["b"] }, "myexn")
175 }
176
177 TestGetThrow({
178 get: function(r, k) { throw "myexn" }
179 })
180
181 TestGetThrow({
182 get: function(r, k) { return this.get2(r, k) },
183 get2: function(r, k) { throw "myexn" }
184 })
185
186 TestGetThrow({
187 getPropertyDescriptor: function(k) { throw "myexn" }
188 })
189
190 TestGetThrow({
191 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) },
192 getPropertyDescriptor2: function(k) { throw "myexn" }
193 })
194
195 TestGetThrow({
196 getPropertyDescriptor: function(k) {
197 return {get value() { throw "myexn" }}
198 }
199 })
200
201 TestGetThrow({
202 get: undefined,
203 getPropertyDescriptor: function(k) { throw "myexn" }
204 })
205
206 TestGetThrow(Proxy.create({
207 get: function(pr, pk) { throw "myexn" }
208 }))
209
210 TestGetThrow(Proxy.create({
211 get: function(pr, pk) {
212 return function(r, k) { throw "myexn" }
213 }
214 }))
215
216
161 217
162 // Setters. 218 // Setters.
163 219
164 var key 220 var key
165 var val 221 var val
166 222
167 function TestSet(handler, create) { 223 function TestSet(handler, create) {
168 TestWithProxies(TestSet2, handler) 224 TestWithProxies(TestSet2, handler)
169 } 225 }
170 226
171 function TestSet2(handler, create) { 227 function TestSet2(handler, create) {
172 var o = create(handler) 228 var p = create(handler)
173 assertEquals(42, o.a = 42) 229 assertEquals(42, p.a = 42)
174 assertEquals("a", key) 230 assertEquals("a", key)
175 assertEquals(42, val) 231 assertEquals(42, val)
176 assertEquals(43, o["b"] = 43) 232 assertEquals(43, p["b"] = 43)
177 assertEquals("b", key) 233 assertEquals("b", key)
178 assertEquals(43, val) 234 assertEquals(43, val)
179 } 235 }
180 236
181 TestSet({ 237 TestSet({
182 set: function(r, k, v) { key = k; val = v; return true } 238 set: function(r, k, v) { key = k; val = v; return true }
183 }) 239 })
184 240
185 TestSet({ 241 TestSet({
186 set: function(r, k, v) { return this.set2(r, k, v) }, 242 set: function(r, k, v) { return this.set2(r, k, v) },
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 }) 298 })
243 299
244 TestSet(Proxy.create({ 300 TestSet(Proxy.create({
245 get: function(pr, pk) { 301 get: function(pr, pk) {
246 return function(r, k, v) { key = k; val = v; return true } 302 return function(r, k, v) { key = k; val = v; return true }
247 } 303 }
248 })) 304 }))
249 305
250 306
251 307
308 function TestSetThrow(handler, create) {
309 TestWithProxies(TestSetThrow2, handler)
310 }
311
312 function TestSetThrow2(handler, create) {
313 var p = create(handler)
314 assertThrows(function(){ p.a = 42 }, "myexn")
315 assertThrows(function(){ p["b"] = 42 }, "myexn")
316 }
317
318 TestSetThrow({
319 set: function(r, k, v) { throw "myexn" }
320 })
321
322 TestSetThrow({
323 set: function(r, k, v) { return this.set2(r, k, v) },
324 set2: function(r, k, v) { throw "myexn" }
325 })
326
327 TestSetThrow({
328 getOwnPropertyDescriptor: function(k) { throw "myexn" },
329 defineProperty: function(k, desc) { key = k; val = desc.value }
330 })
331
332 TestSetThrow({
333 getOwnPropertyDescriptor: function(k) { return {writable: true} },
334 defineProperty: function(k, desc) { throw "myexn" }
335 })
336
337 TestSetThrow({
338 getOwnPropertyDescriptor: function(k) {
339 return this.getOwnPropertyDescriptor2(k)
340 },
341 getOwnPropertyDescriptor2: function(k) { throw "myexn" },
342 defineProperty: function(k, desc) { this.defineProperty2(k, desc) },
343 defineProperty2: function(k, desc) { key = k; val = desc.value }
344 })
345
346 TestSetThrow({
347 getOwnPropertyDescriptor: function(k) {
348 return this.getOwnPropertyDescriptor2(k)
349 },
350 getOwnPropertyDescriptor2: function(k) { return {writable: true} },
351 defineProperty: function(k, desc) { this.defineProperty2(k, desc) },
352 defineProperty2: function(k, desc) { throw "myexn" }
353 })
354
355 TestSetThrow({
356 getOwnPropertyDescriptor: function(k) { throw "myexn" },
357 defineProperty: function(k, desc) { key = k; val = desc.value }
358 })
359
360 TestSetThrow({
361 getOwnPropertyDescriptor: function(k) {
362 return {get writable() { return true }}
363 },
364 defineProperty: function(k, desc) { throw "myexn" }
365 })
366
367 TestSetThrow({
368 getOwnPropertyDescriptor: function(k) { throw "myexn" }
369 })
370
371 TestSetThrow({
372 getOwnPropertyDescriptor: function(k) {
373 return {set: function(v) { throw "myexn" }}
374 }
375 })
376
377 TestSetThrow({
378 getOwnPropertyDescriptor: function(k) { throw "myexn" },
379 getPropertyDescriptor: function(k) { return {writable: true} },
380 defineProperty: function(k, desc) { key = k; val = desc.value }
381 })
382
383 TestSetThrow({
384 getOwnPropertyDescriptor: function(k) { return null },
385 getPropertyDescriptor: function(k) { throw "myexn" },
386 defineProperty: function(k, desc) { key = k; val = desc.value }
387 })
388
389 TestSetThrow({
390 getOwnPropertyDescriptor: function(k) { return null },
391 getPropertyDescriptor: function(k) { return {writable: true} },
392 defineProperty: function(k, desc) { throw "myexn" }
393 })
394
395 TestSetThrow({
396 getOwnPropertyDescriptor: function(k) { return null },
397 getPropertyDescriptor: function(k) {
398 return {get writable() { throw "myexn" }}
399 },
400 defineProperty: function(k, desc) { key = k; val = desc.value }
401 })
402
403 TestSetThrow({
404 getOwnPropertyDescriptor: function(k) { return null },
405 getPropertyDescriptor: function(k) {
406 return {set: function(v) { throw "myexn" }}
407 }
408 })
409
410 TestSetThrow({
411 getOwnPropertyDescriptor: function(k) { return null },
412 getPropertyDescriptor: function(k) { return null },
413 defineProperty: function(k, desc) { throw "myexn" }
414 })
415
416 TestSetThrow(Proxy.create({
417 get: function(pr, pk) { throw "myexn" }
418 }))
419
420 TestSetThrow(Proxy.create({
421 get: function(pr, pk) {
422 return function(r, k, v) { throw "myexn" }
423 }
424 }))
425
426
427
252 // Property definition (Object.defineProperty and Object.defineProperties). 428 // Property definition (Object.defineProperty and Object.defineProperties).
253 429
254 var key 430 var key
255 var desc 431 var desc
256 432
257 function TestDefine(handler) { 433 function TestDefine(handler) {
258 TestWithProxies(TestDefine2, handler) 434 TestWithProxies(TestDefine2, handler)
259 } 435 }
260 436
261 function TestDefine2(handler, create) { 437 function TestDefine2(handler, create) {
262 var o = create(handler) 438 var p = create(handler)
263 assertEquals(o, Object.defineProperty(o, "a", {value: 44})) 439 assertEquals(p, Object.defineProperty(p, "a", {value: 44}))
264 assertEquals("a", key) 440 assertEquals("a", key)
265 assertEquals(1, Object.getOwnPropertyNames(desc).length) 441 assertEquals(1, Object.getOwnPropertyNames(desc).length)
266 assertEquals(44, desc.value) 442 assertEquals(44, desc.value)
267 443
268 assertEquals(o, Object.defineProperty(o, "b", {value: 45, writable: false})) 444 assertEquals(p, Object.defineProperty(p, "b", {value: 45, writable: false}))
269 assertEquals("b", key) 445 assertEquals("b", key)
270 assertEquals(2, Object.getOwnPropertyNames(desc).length) 446 assertEquals(2, Object.getOwnPropertyNames(desc).length)
271 assertEquals(45, desc.value) 447 assertEquals(45, desc.value)
272 assertEquals(false, desc.writable) 448 assertEquals(false, desc.writable)
273 449
274 assertEquals(o, Object.defineProperty(o, "c", {value: 46, enumerable: false})) 450 assertEquals(p, Object.defineProperty(p, "c", {value: 46, enumerable: false}))
275 assertEquals("c", key) 451 assertEquals("c", key)
276 assertEquals(2, Object.getOwnPropertyNames(desc).length) 452 assertEquals(2, Object.getOwnPropertyNames(desc).length)
277 assertEquals(46, desc.value) 453 assertEquals(46, desc.value)
278 assertEquals(false, desc.enumerable) 454 assertEquals(false, desc.enumerable)
279 455
280 var attributes = {configurable: true, mine: 66, minetoo: 23} 456 var attributes = {configurable: true, mine: 66, minetoo: 23}
281 assertEquals(o, Object.defineProperty(o, "d", attributes)) 457 assertEquals(p, Object.defineProperty(p, "d", attributes))
282 assertEquals("d", key) 458 assertEquals("d", key)
283 // Modifying the attributes object after the fact should have no effect. 459 // Modifying the attributes object after the fact should have no effect.
284 attributes.configurable = false 460 attributes.configurable = false
285 attributes.mine = 77 461 attributes.mine = 77
286 delete attributes.minetoo 462 delete attributes.minetoo
287 assertEquals(3, Object.getOwnPropertyNames(desc).length) 463 assertEquals(3, Object.getOwnPropertyNames(desc).length)
288 assertEquals(true, desc.configurable) 464 assertEquals(true, desc.configurable)
289 assertEquals(66, desc.mine) 465 assertEquals(66, desc.mine)
290 assertEquals(23, desc.minetoo) 466 assertEquals(23, desc.minetoo)
291 467
292 assertEquals(o, Object.defineProperty(o, "e", {get: function(){ return 5 }})) 468 assertEquals(p, Object.defineProperty(p, "e", {get: function(){ return 5 }}))
293 assertEquals("e", key) 469 assertEquals("e", key)
294 assertEquals(1, Object.getOwnPropertyNames(desc).length) 470 assertEquals(1, Object.getOwnPropertyNames(desc).length)
295 assertEquals(5, desc.get()) 471 assertEquals(5, desc.get())
296 472
297 assertEquals(o, Object.defineProperty(o, "zzz", {})) 473 assertEquals(p, Object.defineProperty(p, "zzz", {}))
298 assertEquals("zzz", key) 474 assertEquals("zzz", key)
299 assertEquals(0, Object.getOwnPropertyNames(desc).length) 475 assertEquals(0, Object.getOwnPropertyNames(desc).length)
300 476
301 // TODO(rossberg): This test requires for-in on proxies. 477 // TODO(rossberg): This test requires for-in on proxies.
302 // var d = create({ 478 // var d = create({
303 // get: function(r, k) { return (k === "value") ? 77 : void 0 }, 479 // get: function(r, k) { return (k === "value") ? 77 : void 0 },
304 // getOwnPropertyNames: function() { return ["value"] } 480 // getOwnPropertyNames: function() { return ["value"] }
305 // }) 481 // })
306 // assertEquals(1, Object.getOwnPropertyNames(d).length) 482 // assertEquals(1, Object.getOwnPropertyNames(d).length)
307 // assertEquals(77, d.value) 483 // assertEquals(77, d.value)
308 // assertEquals(o, Object.defineProperty(o, "p", d)) 484 // assertEquals(p, Object.defineProperty(p, "p", d))
309 // assertEquals("p", key) 485 // assertEquals("p", key)
310 // assertEquals(1, Object.getOwnPropertyNames(desc).length) 486 // assertEquals(1, Object.getOwnPropertyNames(desc).length)
311 // assertEquals(77, desc.value) 487 // assertEquals(77, desc.value)
312 488
313 var props = { 489 var props = {
314 'bla': {}, 490 'bla': {},
315 blub: {get: function() { return true }}, 491 blub: {get: function() { return true }},
316 '': {get value() { return 20 }}, 492 '': {get value() { return 20 }},
317 last: {value: 21, configurable: true, mine: "eyes"} 493 last: {value: 21, configurable: true, mine: "eyes"}
318 } 494 }
319 Object.defineProperty(props, "hidden", {value: "hidden", enumerable: false}) 495 Object.defineProperty(props, "hidden", {value: "hidden", enumerable: false})
320 assertEquals(o, Object.defineProperties(o, props)) 496 assertEquals(p, Object.defineProperties(p, props))
321 assertEquals("last", key) 497 assertEquals("last", key)
322 assertEquals(2, Object.getOwnPropertyNames(desc).length) 498 assertEquals(2, Object.getOwnPropertyNames(desc).length)
323 assertEquals(21, desc.value) 499 assertEquals(21, desc.value)
324 assertEquals(true, desc.configurable) 500 assertEquals(true, desc.configurable)
325 assertEquals(undefined, desc.mine) // Arguably a bug in the spec... 501 assertEquals(undefined, desc.mine) // Arguably a bug in the spec...
502
503 var props = {bla: {get value() { throw "myexn" }}}
504 assertThrows(function(){ Object.defineProperties(p, props) }, "myexn")
326 } 505 }
327 506
328 TestDefine({ 507 TestDefine({
329 defineProperty: function(k, d) { key = k; desc = d; return true } 508 defineProperty: function(k, d) { key = k; desc = d; return true }
330 }) 509 })
331 510
332 TestDefine({ 511 TestDefine({
333 defineProperty: function(k, d) { return this.defineProperty2(k, d) }, 512 defineProperty: function(k, d) { return this.defineProperty2(k, d) },
334 defineProperty2: function(k, d) { key = k; desc = d; return true } 513 defineProperty2: function(k, d) { key = k; desc = d; return true }
335 }) 514 })
336 515
337 TestDefine(Proxy.create({ 516 TestDefine(Proxy.create({
338 get: function(pr, pk) { 517 get: function(pr, pk) {
339 return function(k, d) { key = k; desc = d; return true } 518 return function(k, d) { key = k; desc = d; return true }
340 } 519 }
341 })) 520 }))
342 521
343 522
523 function TestDefineThrow(handler) {
524 TestWithProxies(TestDefineThrow2, handler)
525 }
526
527 function TestDefineThrow2(handler, create) {
528 var p = create(handler)
529 assertThrows(function(){ Object.defineProperty(p, "a", {value: 44})}, "myexn")
530
531 // TODO(rossberg): These tests require for-in on proxies.
532 // var d1 = create({
533 // get: function(r, k) { throw "myexn" },
534 // getOwnPropertyNames: function() { return ["value"] }
535 // })
536 // assertThrows(function(){ Object.defineProperty(p, "p", d1) }, "myexn")
537 // var d2 = create({
538 // get: function(r, k) { return 77 },
539 // getOwnPropertyNames: function() { throw "myexn" }
540 // })
541 // assertThrows(function(){ Object.defineProperty(p, "p", d2) }, "myexn")
542
543 var props = {bla: {get value() { throw "otherexn" }}}
544 assertThrows(function(){ Object.defineProperties(p, props) }, "otherexn")
545 }
546
547 TestDefineThrow({
548 defineProperty: function(k, d) { throw "myexn" }
549 })
550
551 TestDefineThrow({
552 defineProperty: function(k, d) { return this.defineProperty2(k, d) },
553 defineProperty2: function(k, d) { throw "myexn" }
554 })
555
556 TestDefineThrow(Proxy.create({
557 get: function(pr, pk) { throw "myexn" }
558 }))
559
560 TestDefineThrow(Proxy.create({
561 get: function(pr, pk) {
562 return function(k, d) { throw "myexn" }
563 }
564 }))
565
566
344 567
345 // Property deletion (delete). 568 // Property deletion (delete).
346 569
347 var key 570 var key
348 571
349 function TestDelete(handler) { 572 function TestDelete(handler) {
350 TestWithProxies(TestDelete2, handler) 573 TestWithProxies(TestDelete2, handler)
351 } 574 }
352 575
353 function TestDelete2(handler, create) { 576 function TestDelete2(handler, create) {
354 var o = create(handler) 577 var p = create(handler)
355 assertEquals(true, delete o.a) 578 assertEquals(true, delete p.a)
356 assertEquals("a", key) 579 assertEquals("a", key)
357 assertEquals(true, delete o["b"]) 580 assertEquals(true, delete p["b"])
358 assertEquals("b", key) 581 assertEquals("b", key)
359 582
360 assertEquals(false, delete o.z1) 583 assertEquals(false, delete p.z1)
361 assertEquals("z1", key) 584 assertEquals("z1", key)
362 assertEquals(false, delete o["z2"]) 585 assertEquals(false, delete p["z2"])
363 assertEquals("z2", key); 586 assertEquals("z2", key);
364 587
365 (function() { 588 (function() {
366 "use strict" 589 "use strict"
367 assertEquals(true, delete o.c) 590 assertEquals(true, delete p.c)
368 assertEquals("c", key) 591 assertEquals("c", key)
369 assertEquals(true, delete o["d"]) 592 assertEquals(true, delete p["d"])
370 assertEquals("d", key) 593 assertEquals("d", key)
371 594
372 assertThrows(function() { delete o.z3 }, TypeError) 595 assertThrows(function(){ delete p.z3 }, TypeError)
373 assertEquals("z3", key) 596 assertEquals("z3", key)
374 assertThrows(function() { delete o["z4"] }, TypeError) 597 assertThrows(function(){ delete p["z4"] }, TypeError)
375 assertEquals("z4", key) 598 assertEquals("z4", key)
376 })() 599 })()
377 } 600 }
378 601
379 TestDelete({ 602 TestDelete({
380 'delete': function(k) { key = k; return k < "z" } 603 delete: function(k) { key = k; return k < "z" }
381 }) 604 })
382 605
383 TestDelete({ 606 TestDelete({
384 'delete': function(k) { return this.delete2(k) }, 607 delete: function(k) { return this.delete2(k) },
385 delete2: function(k) { key = k; return k < "z" } 608 delete2: function(k) { key = k; return k < "z" }
386 }) 609 })
387 610
388 TestDelete(Proxy.create({ 611 TestDelete(Proxy.create({
389 get: function(pr, pk) { 612 get: function(pr, pk) {
390 return function(k) { key = k; return k < "z" } 613 return function(k) { key = k; return k < "z" }
391 } 614 }
392 })) 615 }))
393 616
394 617
618 function TestDeleteThrow(handler) {
619 TestWithProxies(TestDeleteThrow2, handler)
620 }
621
622 function TestDeleteThrow2(handler, create) {
623 var p = create(handler)
624 assertThrows(function(){ delete p.a }, "myexn")
625 assertThrows(function(){ delete p["b"] }, "myexn");
626
627 (function() {
628 "use strict"
629 assertThrows(function(){ delete p.c }, "myexn")
630 assertThrows(function(){ delete p["d"] }, "myexn")
631 })()
632 }
633
634 TestDeleteThrow({
635 delete: function(k) { throw "myexn" }
636 })
637
638 TestDeleteThrow({
639 delete: function(k) { return this.delete2(k) },
640 delete2: function(k) { throw "myexn" }
641 })
642
643 TestDeleteThrow(Proxy.create({
644 get: function(pr, pk) { throw "myexn" }
645 }))
646
647 TestDeleteThrow(Proxy.create({
648 get: function(pr, pk) {
649 return function(k) { throw "myexn" }
650 }
651 }))
652
653
395 654
396 // Property descriptors (Object.getOwnPropertyDescriptor). 655 // Property descriptors (Object.getOwnPropertyDescriptor).
397 656
398 function TestDescriptor(handler) { 657 function TestDescriptor(handler) {
399 TestWithProxies(TestDescriptor2, handler) 658 TestWithProxies(TestDescriptor2, handler)
400 } 659 }
401 660
402 function TestDescriptor2(handler, create) { 661 function TestDescriptor2(handler, create) {
403 var o = create(handler) 662 var p = create(handler)
404 var descs = [ 663 var descs = [
405 {configurable: true}, 664 {configurable: true},
406 {value: 34, enumerable: true, configurable: true}, 665 {value: 34, enumerable: true, configurable: true},
407 {value: 3, writable: false, mine: "eyes", configurable: true}, 666 {value: 3, writable: false, mine: "eyes", configurable: true},
408 {get value() { return 20 }, get configurable() { return true }}, 667 {get value() { return 20 }, get configurable() { return true }},
409 {get: function() { "get" }, set: function() { "set" }, configurable: true} 668 {get: function() { "get" }, set: function() { "set" }, configurable: true}
410 ] 669 ]
411 for (var i = 0; i < descs.length; ++i) { 670 for (var i = 0; i < descs.length; ++i) {
412 assertEquals(o, Object.defineProperty(o, i, descs[i])) 671 assertEquals(p, Object.defineProperty(p, i, descs[i]))
413 var desc = Object.getOwnPropertyDescriptor(o, i) 672 var desc = Object.getOwnPropertyDescriptor(p, i)
414 for (p in descs[i]) { 673 for (prop in descs[i]) {
415 // TODO(rossberg): Ignore user attributes as long as the spec isn't 674 // TODO(rossberg): Ignore user attributes as long as the spec isn't
416 // fixed suitably. 675 // fixed suitably.
417 if (p != "mine") assertEquals(descs[i][p], desc[p]) 676 if (prop != "mine") assertEquals(descs[i][prop], desc[prop])
418 } 677 }
419 assertEquals(undefined, Object.getOwnPropertyDescriptor(o, "absent")) 678 assertEquals(undefined, Object.getOwnPropertyDescriptor(p, "absent"))
420 } 679 }
421 } 680 }
422 681
423 TestDescriptor({ 682 TestDescriptor({
424 defineProperty: function(k, d) { this["__" + k] = d; return true }, 683 defineProperty: function(k, d) { this["__" + k] = d; return true },
425 getOwnPropertyDescriptor: function(k) { return this["__" + k] } 684 getOwnPropertyDescriptor: function(k) { return this["__" + k] }
426 }) 685 })
427 686
428 TestDescriptor({ 687 TestDescriptor({
429 defineProperty: function(k, d) { this["__" + k] = d; return true }, 688 defineProperty: function(k, d) { this["__" + k] = d; return true },
430 getOwnPropertyDescriptor: function(k) { 689 getOwnPropertyDescriptor: function(k) {
431 return this.getOwnPropertyDescriptor2(k) 690 return this.getOwnPropertyDescriptor2(k)
432 }, 691 },
433 getOwnPropertyDescriptor2: function(k) { return this["__" + k] } 692 getOwnPropertyDescriptor2: function(k) { return this["__" + k] }
434 }) 693 })
435 694
436 695
696 function TestDescriptorThrow(handler) {
697 TestWithProxies(TestDescriptorThrow2, handler)
698 }
699
700 function TestDescriptorThrow2(handler, create) {
701 var p = create(handler)
702 assertThrows(function(){ Object.getOwnPropertyDescriptor(p, "a") }, "myexn")
703 }
704
705 TestDescriptorThrow({
706 getOwnPropertyDescriptor: function(k) { throw "myexn" }
707 })
708
709 TestDescriptorThrow({
710 getOwnPropertyDescriptor: function(k) {
711 return this.getOwnPropertyDescriptor2(k)
712 },
713 getOwnPropertyDescriptor2: function(k) { throw "myexn" }
714 })
715
716
437 717
438 // Comparison. 718 // Comparison.
439 719
440 function TestComparison(eq) { 720 function TestComparison(eq) {
441 TestWithProxies(TestComparison2, eq) 721 TestWithProxies(TestComparison2, eq)
442 } 722 }
443 723
444 function TestComparison2(eq, create) { 724 function TestComparison2(eq, create) {
445 var o1 = create({}) 725 var p1 = create({})
446 var o2 = create({}) 726 var p2 = create({})
447 727
448 assertTrue(eq(o1, o1)) 728 assertTrue(eq(p1, p1))
449 assertTrue(eq(o2, o2)) 729 assertTrue(eq(p2, p2))
450 assertTrue(!eq(o1, o2)) 730 assertTrue(!eq(p1, p2))
451 assertTrue(!eq(o1, {})) 731 assertTrue(!eq(p1, {}))
452 assertTrue(!eq({}, o2)) 732 assertTrue(!eq({}, p2))
453 assertTrue(!eq({}, {})) 733 assertTrue(!eq({}, {}))
454 } 734 }
455 735
456 TestComparison(function(o1, o2) { return o1 == o2 }) 736 TestComparison(function(o1, o2) { return o1 == o2 })
457 TestComparison(function(o1, o2) { return o1 === o2 }) 737 TestComparison(function(o1, o2) { return o1 === o2 })
458 TestComparison(function(o1, o2) { return !(o1 != o2) }) 738 TestComparison(function(o1, o2) { return !(o1 != o2) })
459 TestComparison(function(o1, o2) { return !(o1 !== o2) }) 739 TestComparison(function(o1, o2) { return !(o1 !== o2) })
460 740
461 741
462 742
(...skipping 15 matching lines...) Expand all
478 758
479 // Membership test (in). 759 // Membership test (in).
480 760
481 var key 761 var key
482 762
483 function TestIn(handler) { 763 function TestIn(handler) {
484 TestWithProxies(TestIn2, handler) 764 TestWithProxies(TestIn2, handler)
485 } 765 }
486 766
487 function TestIn2(handler, create) { 767 function TestIn2(handler, create) {
488 var o = create(handler) 768 var p = create(handler)
489 assertTrue("a" in o) 769 assertTrue("a" in p)
490 assertEquals("a", key) 770 assertEquals("a", key)
491 assertTrue(99 in o) 771 assertTrue(99 in p)
492 assertEquals("99", key) 772 assertEquals("99", key)
493 assertFalse("z" in o) 773 assertFalse("z" in p)
494 assertEquals("z", key) 774 assertEquals("z", key)
495 775
496 if ("b" in o) { 776 assertEquals(2, ("a" in p) ? 2 : 0)
777 assertEquals(0, !("a" in p) ? 2 : 0)
778 assertEquals(0, ("zzz" in p) ? 2 : 0)
779 assertEquals(2, !("zzz" in p) ? 2 : 0)
780
781 if ("b" in p) {
497 } else { 782 } else {
498 assertTrue(false) 783 assertTrue(false)
499 } 784 }
500 assertEquals("b", key) 785 assertEquals("b", key)
501 786
502 if ("zz" in o) { 787 if ("zz" in p) {
503 assertTrue(false) 788 assertTrue(false)
504 } 789 }
505 assertEquals("zz", key) 790 assertEquals("zz", key)
506 791
507 if (!("c" in o)) { 792 if (!("c" in p)) {
508 assertTrue(false) 793 assertTrue(false)
509 } 794 }
510 assertEquals("c", key) 795 assertEquals("c", key)
511 796
512 if (!("zzz" in o)) { 797 if (!("zzz" in p)) {
513 } else { 798 } else {
514 assertTrue(false) 799 assertTrue(false)
515 } 800 }
516 assertEquals("zzz", key) 801 assertEquals("zzz", key)
517 } 802 }
518 803
519 TestIn({ 804 TestIn({
520 has: function(k) { key = k; return k < "z" } 805 has: function(k) { key = k; return k < "z" }
521 }) 806 })
522 807
(...skipping 28 matching lines...) Expand all
551 } 836 }
552 }) 837 })
553 838
554 TestIn(Proxy.create({ 839 TestIn(Proxy.create({
555 get: function(pr, pk) { 840 get: function(pr, pk) {
556 return function(k) { key = k; return k < "z" } 841 return function(k) { key = k; return k < "z" }
557 } 842 }
558 })) 843 }))
559 844
560 845
846 function TestInThrow(handler) {
847 TestWithProxies(TestInThrow2, handler)
848 }
849
850 function TestInThrow2(handler, create) {
851 var p = create(handler)
852 assertThrows(function(){ return "a" in o }, "myexn")
853 assertThrows(function(){ return !("a" in o) }, "myexn")
854 assertThrows(function(){ return ("a" in o) ? 2 : 3 }, "myexn")
855 assertThrows(function(){ if ("b" in o) {} }, "myexn")
856 assertThrows(function(){ if (!("b" in o)) {} }, "myexn")
857 assertThrows(function(){ if ("zzz" in o) {} }, "myexn")
858 }
859
860 TestInThrow({
861 has: function(k) { throw "myexn" }
862 })
863
864 TestInThrow({
865 has: function(k) { return this.has2(k) },
866 has2: function(k) { throw "myexn" }
867 })
868
869 TestInThrow({
870 getPropertyDescriptor: function(k) { throw "myexn" }
871 })
872
873 TestInThrow({
874 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) },
875 getPropertyDescriptor2: function(k) { throw "myexn" }
876 })
877
878 TestInThrow({
879 get: undefined,
880 getPropertyDescriptor: function(k) { throw "myexn" }
881 })
882
883 TestInThrow(Proxy.create({
884 get: function(pr, pk) { throw "myexn" }
885 }))
886
887 TestInThrow(Proxy.create({
888 get: function(pr, pk) {
889 return function(k) { throw "myexn" }
890 }
891 }))
892
893
561 894
562 // Own Properties (Object.prototype.hasOwnProperty). 895 // Own Properties (Object.prototype.hasOwnProperty).
563 896
564 var key 897 var key
565 898
566 function TestHasOwn(handler) { 899 function TestHasOwn(handler) {
567 TestWithProxies(TestHasOwn2, handler) 900 TestWithProxies(TestHasOwn2, handler)
568 } 901 }
569 902
570 function TestHasOwn2(handler, create) { 903 function TestHasOwn2(handler, create) {
571 var o = create(handler) 904 var p = create(handler)
572 assertTrue(Object.prototype.hasOwnProperty.call(o, "a")) 905 assertTrue(Object.prototype.hasOwnProperty.call(p, "a"))
573 assertEquals("a", key) 906 assertEquals("a", key)
574 assertTrue(Object.prototype.hasOwnProperty.call(o, 99)) 907 assertTrue(Object.prototype.hasOwnProperty.call(p, 99))
575 assertEquals("99", key) 908 assertEquals("99", key)
576 assertFalse(Object.prototype.hasOwnProperty.call(o, "z")) 909 assertFalse(Object.prototype.hasOwnProperty.call(p, "z"))
577 assertEquals("z", key) 910 assertEquals("z", key)
578 } 911 }
579 912
580 TestHasOwn({ 913 TestHasOwn({
581 hasOwn: function(k) { key = k; return k < "z" } 914 hasOwn: function(k) { key = k; return k < "z" }
582 }) 915 })
583 916
584 TestHasOwn({ 917 TestHasOwn({
585 hasOwn: function(k) { return this.hasOwn2(k) }, 918 hasOwn: function(k) { return this.hasOwn2(k) },
586 hasOwn2: function(k) { key = k; return k < "z" } 919 hasOwn2: function(k) { key = k; return k < "z" }
(...skipping 27 matching lines...) Expand all
614 } 947 }
615 }) 948 })
616 949
617 TestHasOwn(Proxy.create({ 950 TestHasOwn(Proxy.create({
618 get: function(pr, pk) { 951 get: function(pr, pk) {
619 return function(k) { key = k; return k < "z" } 952 return function(k) { key = k; return k < "z" }
620 } 953 }
621 })) 954 }))
622 955
623 956
957 function TestHasOwnThrow(handler) {
958 TestWithProxies(TestHasOwnThrow2, handler)
959 }
960
961 function TestHasOwnThrow2(handler, create) {
962 var p = create(handler)
963 assertThrows(function(){ Object.prototype.hasOwnProperty.call(p, "a")},
964 "myexn")
965 assertThrows(function(){ Object.prototype.hasOwnProperty.call(p, 99)},
966 "myexn")
967 }
968
969 TestHasOwnThrow({
970 hasOwn: function(k) { throw "myexn" }
971 })
972
973 TestHasOwnThrow({
974 hasOwn: function(k) { return this.hasOwn2(k) },
975 hasOwn2: function(k) { throw "myexn" }
976 })
977
978 TestHasOwnThrow({
979 getOwnPropertyDescriptor: function(k) { throw "myexn" }
980 })
981
982 TestHasOwnThrow({
983 getOwnPropertyDescriptor: function(k) {
984 return this.getOwnPropertyDescriptor2(k)
985 },
986 getOwnPropertyDescriptor2: function(k) { throw "myexn" }
987 })
988
989 TestHasOwnThrow({
990 hasOwn: undefined,
991 getOwnPropertyDescriptor: function(k) { throw "myexn" }
992 })
993
994 TestHasOwnThrow(Proxy.create({
995 get: function(pr, pk) { throw "myexn" }
996 }))
997
998 TestHasOwnThrow(Proxy.create({
999 get: function(pr, pk) {
1000 return function(k) { throw "myexn" }
1001 }
1002 }))
1003
1004
624 1005
625 // Instanceof (instanceof) 1006 // Instanceof (instanceof)
626 1007
627 function TestInstanceof() { 1008 function TestInstanceof() {
628 var o = {} 1009 var o = {}
629 var p1 = Proxy.create({}) 1010 var p1 = Proxy.create({})
630 var p2 = Proxy.create({}, o) 1011 var p2 = Proxy.create({}, o)
631 var p3 = Proxy.create({}, p2) 1012 var p3 = Proxy.create({}, p2)
632 1013
633 var f0 = function() {} 1014 var f0 = function() {}
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 getOwnPropertyNames2: function() { return ["throw", "function "] } 1118 getOwnPropertyNames2: function() { return ["throw", "function "] }
738 }) 1119 })
739 1120
740 TestPropertyNames(["[object Object]"], { 1121 TestPropertyNames(["[object Object]"], {
741 get getOwnPropertyNames() { 1122 get getOwnPropertyNames() {
742 return function() { return [{}] } 1123 return function() { return [{}] }
743 } 1124 }
744 }) 1125 })
745 1126
746 1127
1128 function TestPropertyNamesThrow(handler) {
1129 TestWithProxies(TestPropertyNamesThrow2, handler)
1130 }
1131
1132 function TestPropertyNamesThrow2(handler, create) {
1133 var p = create(handler)
1134 assertThrows(function(){ Object.getOwnPropertyNames(p) }, "myexn")
1135 }
1136
1137 TestPropertyNamesThrow({
1138 getOwnPropertyNames: function() { throw "myexn" }
1139 })
1140
1141 TestPropertyNamesThrow({
1142 getOwnPropertyNames: function() { return this.getOwnPropertyNames2() },
1143 getOwnPropertyNames2: function() { throw "myexn" }
1144 })
1145
1146
747 function TestKeys(names, handler) { 1147 function TestKeys(names, handler) {
748 TestWithProxies(TestKeys2, [names, handler]) 1148 TestWithProxies(TestKeys2, [names, handler])
749 } 1149 }
750 1150
751 function TestKeys2(names_handler, create) { 1151 function TestKeys2(names_handler, create) {
752 var p = create(names_handler[1]) 1152 var p = create(names_handler[1])
753 assertArrayEquals(names_handler[0], Object.keys(p)) 1153 assertArrayEquals(names_handler[0], Object.keys(p))
754 } 1154 }
755 1155
756 TestKeys([], { 1156 TestKeys([], {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 }) 1196 })
797 1197
798 TestKeys([], { 1198 TestKeys([], {
799 get getOwnPropertyNames() { 1199 get getOwnPropertyNames() {
800 return function() { return ["a", "b", "c"] } 1200 return function() { return ["a", "b", "c"] }
801 }, 1201 },
802 getOwnPropertyDescriptor: function(k) { return {} } 1202 getOwnPropertyDescriptor: function(k) { return {} }
803 }) 1203 })
804 1204
805 1205
1206 function TestKeysThrow(handler) {
1207 TestWithProxies(TestKeysThrow2, handler)
1208 }
1209
1210 function TestKeysThrow2(handler, create) {
1211 var p = create(handler)
1212 assertThrows(function(){ Object.keys(p) }, "myexn")
1213 }
1214
1215 TestKeysThrow({
1216 keys: function() { throw "myexn" }
1217 })
1218
1219 TestKeysThrow({
1220 keys: function() { return this.keys2() },
1221 keys2: function() { throw "myexn" }
1222 })
1223
1224 TestKeysThrow({
1225 getOwnPropertyNames: function() { throw "myexn" },
1226 getOwnPropertyDescriptor: function(k) { return true }
1227 })
1228
1229 TestKeysThrow({
1230 getOwnPropertyNames: function() { return [1, 2] },
1231 getOwnPropertyDescriptor: function(k) { throw "myexn" }
1232 })
1233
1234 TestKeysThrow({
1235 getOwnPropertyNames: function() { return this.getOwnPropertyNames2() },
1236 getOwnPropertyNames2: function() { throw "myexn" },
1237 })
1238
1239 TestKeysThrow({
1240 getOwnPropertyNames: function() { return this.getOwnPropertyNames2() },
1241 getOwnPropertyNames2: function() { return [1, 2] },
1242 getOwnPropertyDescriptor: function(k) {
1243 return this.getOwnPropertyDescriptor2(k)
1244 },
1245 getOwnPropertyDescriptor2: function(k) { throw "myexn" }
1246 })
1247
1248 TestKeysThrow({
1249 get getOwnPropertyNames() { throw "myexn" }
1250 })
1251
1252 TestKeysThrow({
1253 get getOwnPropertyNames() {
1254 return function() { throw "myexn" }
1255 },
1256 })
1257
1258 TestKeysThrow([], {
1259 get getOwnPropertyNames() {
1260 return function() { return [1, 2] }
1261 },
1262 getOwnPropertyDescriptor: function(k) { throw "myexn" }
1263 })
1264
1265
806 1266
807 // Fixing (Object.freeze, Object.seal, Object.preventExtensions, 1267 // Fixing (Object.freeze, Object.seal, Object.preventExtensions,
808 // Object.isFrozen, Object.isSealed, Object.isExtensible) 1268 // Object.isFrozen, Object.isSealed, Object.isExtensible)
809 1269
1270 // TODO(rossberg): use TestWithProxies to include funciton proxies
810 function TestFix(names, handler) { 1271 function TestFix(names, handler) {
811 var proto = {p: 77} 1272 var proto = {p: 77}
812 var assertFixing = function(o, s, f, e) { 1273 var assertFixing = function(o, s, f, e) {
813 assertEquals(s, Object.isSealed(o)) 1274 assertEquals(s, Object.isSealed(o))
814 assertEquals(f, Object.isFrozen(o)) 1275 assertEquals(f, Object.isFrozen(o))
815 assertEquals(e, Object.isExtensible(o)) 1276 assertEquals(e, Object.isExtensible(o))
816 } 1277 }
817 1278
818 var o1 = Proxy.create(handler, proto) 1279 var p1 = Proxy.create(handler, proto)
819 assertFixing(o1, false, false, true) 1280 assertFixing(p1, false, false, true)
820 Object.seal(o1) 1281 Object.seal(p1)
821 assertFixing(o1, true, names.length === 0, false) 1282 assertFixing(p1, true, names.length === 0, false)
822 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(o1).sort()) 1283 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p1).sort())
823 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), 1284 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(),
824 Object.keys(o1).sort()) 1285 Object.keys(p1).sort())
825 assertEquals(proto, Object.getPrototypeOf(o1)) 1286 assertEquals(proto, Object.getPrototypeOf(p1))
826 assertEquals(77, o1.p) 1287 assertEquals(77, p1.p)
827 for (var n in o1) { 1288 for (var n in p1) {
828 var desc = Object.getOwnPropertyDescriptor(o1, n) 1289 var desc = Object.getOwnPropertyDescriptor(p1, n)
829 if (desc !== undefined) assertFalse(desc.configurable) 1290 if (desc !== undefined) assertFalse(desc.configurable)
830 } 1291 }
831 1292
832 var o2 = Proxy.create(handler, proto) 1293 var p2 = Proxy.create(handler, proto)
833 assertFixing(o2, false, false, true) 1294 assertFixing(p2, false, false, true)
834 Object.freeze(o2) 1295 Object.freeze(p2)
835 assertFixing(o2, true, true, false) 1296 assertFixing(p2, true, true, false)
836 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(o2).sort()) 1297 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p2).sort())
837 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), 1298 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(),
838 Object.keys(o2).sort()) 1299 Object.keys(p2).sort())
839 assertEquals(proto, Object.getPrototypeOf(o2)) 1300 assertEquals(proto, Object.getPrototypeOf(p2))
840 assertEquals(77, o2.p) 1301 assertEquals(77, p2.p)
841 for (var n in o2) { 1302 for (var n in p2) {
842 var desc = Object.getOwnPropertyDescriptor(o2, n) 1303 var desc = Object.getOwnPropertyDescriptor(p2, n)
843 if (desc !== undefined) assertFalse(desc.writable) 1304 if (desc !== undefined) assertFalse(desc.writable)
844 if (desc !== undefined) assertFalse(desc.configurable) 1305 if (desc !== undefined) assertFalse(desc.configurable)
845 } 1306 }
846 1307
847 var o3 = Proxy.create(handler, proto) 1308 var p3 = Proxy.create(handler, proto)
848 assertFixing(o3, false, false, true) 1309 assertFixing(p3, false, false, true)
849 Object.preventExtensions(o3) 1310 Object.preventExtensions(p3)
850 assertFixing(o3, names.length === 0, names.length === 0, false) 1311 assertFixing(p3, names.length === 0, names.length === 0, false)
851 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(o3).sort()) 1312 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p3).sort())
852 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), 1313 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(),
853 Object.keys(o3).sort()) 1314 Object.keys(p3).sort())
854 assertEquals(proto, Object.getPrototypeOf(o3)) 1315 assertEquals(proto, Object.getPrototypeOf(p3))
855 assertEquals(77, o3.p) 1316 assertEquals(77, p3.p)
856 } 1317 }
857 1318
858 TestFix([], { 1319 TestFix([], {
859 fix: function() { return {} } 1320 fix: function() { return {} }
860 }) 1321 })
861 1322
862 TestFix(["a", "b", "c", "d", "zz"], { 1323 TestFix(["a", "b", "c", "d", "zz"], {
863 fix: function() { 1324 fix: function() {
864 return { 1325 return {
865 a: {value: "a", writable: true, configurable: false, enumerable: true}, 1326 a: {value: "a", writable: true, configurable: false, enumerable: true},
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
905 }, function() {}) 1366 }, function() {})
906 fix(f3) 1367 fix(f3)
907 assertEquals(0, f1.length) 1368 assertEquals(0, f1.length)
908 } 1369 }
909 1370
910 TestFixFunction(Object.seal) 1371 TestFixFunction(Object.seal)
911 TestFixFunction(Object.freeze) 1372 TestFixFunction(Object.freeze)
912 TestFixFunction(Object.preventExtensions) 1373 TestFixFunction(Object.preventExtensions)
913 1374
914 1375
1376 function TestFixThrow(handler) {
1377 TestWithProxies(TestFixThrow2, handler)
1378 }
1379
1380 function TestFixThrow2(handler) {
1381 var p = Proxy.create(handler, {})
1382 assertThrows(function(){ Object.seal(p) }, "myexn")
1383 assertThrows(function(){ Object.freeze(p) }, "myexn")
1384 assertThrows(function(){ Object.preventExtensions(p) }, "myexn")
1385 }
1386
1387 TestFixThrow({
1388 fix: function() { throw "myexn" }
1389 })
1390
1391 TestFixThrow({
1392 fix: function() { return this.fix2() },
1393 fix2: function() { throw "myexn" }
1394 })
1395
1396 TestFixThrow({
1397 get fix() { throw "myexn" }
1398 })
1399
1400 TestFixThrow({
1401 get fix() {
1402 return function() { throw "myexn" }
1403 }
1404 })
1405
1406
915 1407
916 // String conversion (Object.prototype.toString, Object.prototype.toLocaleString ) 1408 // String conversion (Object.prototype.toString, Object.prototype.toLocaleString )
917 1409
918 var key 1410 var key
919 1411
920 function TestToString(handler) { 1412 function TestToString(handler) {
921 var o = Proxy.create(handler) 1413 var p = Proxy.create(handler)
922 key = "" 1414 key = ""
923 assertEquals("[object Object]", Object.prototype.toString.call(o)) 1415 assertEquals("[object Object]", Object.prototype.toString.call(p))
924 assertEquals("", key) 1416 assertEquals("", key)
925 assertEquals("my_proxy", Object.prototype.toLocaleString.call(o)) 1417 assertEquals("my_proxy", Object.prototype.toLocaleString.call(p))
926 assertEquals("toString", key) 1418 assertEquals("toString", key)
927 1419
928 var f = Proxy.createFunction(handler, function() {}) 1420 var f = Proxy.createFunction(handler, function() {})
929 key = "" 1421 key = ""
930 assertEquals("[object Function]", Object.prototype.toString.call(f)) 1422 assertEquals("[object Function]", Object.prototype.toString.call(f))
931 assertEquals("", key) 1423 assertEquals("", key)
932 assertEquals("my_proxy", Object.prototype.toLocaleString.call(o)) 1424 assertEquals("my_proxy", Object.prototype.toLocaleString.call(f))
933 assertEquals("toString", key) 1425 assertEquals("toString", key)
934 } 1426 }
935 1427
936 TestToString({ 1428 TestToString({
937 get: function(r, k) { key = k; return function() { return "my_proxy" } } 1429 get: function(r, k) { key = k; return function() { return "my_proxy" } }
938 }) 1430 })
939 1431
940 TestToString({ 1432 TestToString({
941 get: function(r, k) { return this.get2(r, k) }, 1433 get: function(r, k) { return this.get2(r, k) },
942 get2: function(r, k) { key = k; return function() { return "my_proxy" } } 1434 get2: function(r, k) { key = k; return function() { return "my_proxy" } }
943 }) 1435 })
944 1436
945 TestToString(Proxy.create({ 1437 TestToString(Proxy.create({
946 get: function(pr, pk) { 1438 get: function(pr, pk) {
947 return function(r, k) { key = k; return function() { return "my_proxy" } } 1439 return function(r, k) { key = k; return function() { return "my_proxy" } }
948 } 1440 }
949 })) 1441 }))
950 1442
951 1443
1444 function TestToStringThrow(handler) {
1445 var p = Proxy.create(handler)
1446 assertEquals("[object Object]", Object.prototype.toString.call(p))
1447 assertThrows(function(){ Object.prototype.toLocaleString.call(p) }, "myexn")
1448
1449 var f = Proxy.createFunction(handler, function() {})
1450 assertEquals("[object Function]", Object.prototype.toString.call(f))
1451 assertThrows(function(){ Object.prototype.toLocaleString.call(f) }, "myexn")
1452 }
1453
1454 TestToStringThrow({
1455 get: function(r, k) { throw "myexn" }
1456 })
1457
1458 TestToStringThrow({
1459 get: function(r, k) { return function() { throw "myexn" } }
1460 })
1461
1462 TestToStringThrow({
1463 get: function(r, k) { return this.get2(r, k) },
1464 get2: function(r, k) { throw "myexn" }
1465 })
1466
1467 TestToStringThrow(Proxy.create({
1468 get: function(pr, pk) { throw "myexn" }
1469 }))
1470
1471 TestToStringThrow(Proxy.create({
1472 get: function(pr, pk) {
1473 return function(r, k) { throw "myexn" }
1474 }
1475 }))
1476
1477
952 1478
953 // Value conversion (Object.prototype.toValue) 1479 // Value conversion (Object.prototype.toValue)
954 1480
955 function TestValueOf(handler) { 1481 function TestValueOf(handler) {
956 TestWithProxies(TestValueOf2, handler) 1482 TestWithProxies(TestValueOf2, handler)
957 } 1483 }
958 1484
959 function TestValueOf2(handler, create) { 1485 function TestValueOf2(handler, create) {
960 var o = create(handler) 1486 var p = create(handler)
961 assertSame(o, Object.prototype.valueOf.call(o)) 1487 assertSame(p, Object.prototype.valueOf.call(p))
962 } 1488 }
963 1489
964 TestValueOf({}) 1490 TestValueOf({})
965 1491
966 1492
967 1493
968 // Enumerability (Object.prototype.propertyIsEnumerable) 1494 // Enumerability (Object.prototype.propertyIsEnumerable)
969 1495
970 var key 1496 var key
971 1497
972 function TestIsEnumerable(handler) { 1498 function TestIsEnumerable(handler) {
973 TestWithProxies(TestIsEnumerable2, handler) 1499 TestWithProxies(TestIsEnumerable2, handler)
974 } 1500 }
975 1501
976 function TestIsEnumerable2(handler, create) { 1502 function TestIsEnumerable2(handler, create) {
977 var o = create(handler) 1503 var p = create(handler)
978 assertTrue(Object.prototype.propertyIsEnumerable.call(o, "a")) 1504 assertTrue(Object.prototype.propertyIsEnumerable.call(p, "a"))
979 assertEquals("a", key) 1505 assertEquals("a", key)
980 assertTrue(Object.prototype.propertyIsEnumerable.call(o, 2)) 1506 assertTrue(Object.prototype.propertyIsEnumerable.call(p, 2))
981 assertEquals("2", key) 1507 assertEquals("2", key)
982 assertFalse(Object.prototype.propertyIsEnumerable.call(o, "z")) 1508 assertFalse(Object.prototype.propertyIsEnumerable.call(p, "z"))
983 assertEquals("z", key) 1509 assertEquals("z", key)
984 } 1510 }
985 1511
986 TestIsEnumerable({ 1512 TestIsEnumerable({
987 getOwnPropertyDescriptor: function(k) { 1513 getOwnPropertyDescriptor: function(k) {
988 key = k; return {enumerable: k < "z", configurable: true} 1514 key = k; return {enumerable: k < "z", configurable: true}
989 }, 1515 },
990 }) 1516 })
991 1517
992 TestIsEnumerable({ 1518 TestIsEnumerable({
(...skipping 13 matching lines...) Expand all
1006 1532
1007 TestIsEnumerable(Proxy.create({ 1533 TestIsEnumerable(Proxy.create({
1008 get: function(pr, pk) { 1534 get: function(pr, pk) {
1009 return function(k) { 1535 return function(k) {
1010 key = k; return {enumerable: k < "z", configurable: true} 1536 key = k; return {enumerable: k < "z", configurable: true}
1011 } 1537 }
1012 } 1538 }
1013 })) 1539 }))
1014 1540
1015 1541
1542 function TestIsEnumerableThrow(handler) {
1543 TestWithProxies(TestIsEnumerableThrow2, handler)
1544 }
1545
1546 function TestIsEnumerableThrow2(handler, create) {
1547 var p = create(handler)
1548 assertThrows(function(){ Object.prototype.propertyIsEnumerable.call(p, "a") },
1549 "myexn")
1550 assertThrows(function(){ Object.prototype.propertyIsEnumerable.call(p, 11) },
1551 "myexn")
1552 }
1553
1554 TestIsEnumerableThrow({
1555 getOwnPropertyDescriptor: function(k) { throw "myexn" }
1556 })
1557
1558 TestIsEnumerableThrow({
1559 getOwnPropertyDescriptor: function(k) {
1560 return this.getOwnPropertyDescriptor2(k)
1561 },
1562 getOwnPropertyDescriptor2: function(k) { throw "myexn" }
1563 })
1564
1565 TestIsEnumerableThrow({
1566 getOwnPropertyDescriptor: function(k) {
1567 return {get enumerable() { throw "myexn" }, configurable: true}
1568 },
1569 })
1570
1571 TestIsEnumerableThrow(Proxy.create({
1572 get: function(pr, pk) { throw "myexn" }
1573 }))
1574
1575 TestIsEnumerableThrow(Proxy.create({
1576 get: function(pr, pk) {
1577 return function(k) { throw "myexn" }
1578 }
1579 }))
1580
1581
1016 1582
1017 // Calling (call, Function.prototype.call, Function.prototype.apply, 1583 // Calling (call, Function.prototype.call, Function.prototype.apply,
1018 // Function.prototype.bind). 1584 // Function.prototype.bind).
1019 1585
1020 var global = this 1586 var global = this
1021 var receiver 1587 var receiver
1022 1588
1023 function TestCall(isStrict, callTrap) { 1589 function TestCall(isStrict, callTrap) {
1024 assertEquals(42, callTrap(5, 37)) 1590 assertEquals(42, callTrap(5, 37))
1025 // TODO(rossberg): unrelated bug: this does not succeed for optimized code. 1591 // TODO(rossberg): unrelated bug: this does not succeed for optimized code.
1026 // assertEquals(isStrict ? undefined : global, receiver) 1592 // assertEquals(isStrict ? undefined : global, receiver)
1027 1593
1028 var f = Proxy.createFunction({fix: function() { return {} }}, callTrap) 1594 var f = Proxy.createFunction({fix: function() { return {} }}, callTrap)
1029
1030 receiver = 333 1595 receiver = 333
1031 assertEquals(42, f(11, 31)) 1596 assertEquals(42, f(11, 31))
1032 assertEquals(isStrict ? undefined : global, receiver) 1597 assertEquals(isStrict ? undefined : global, receiver)
1033 var o = {} 1598 var o = {}
1034 assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) 1599 assertEquals(42, Function.prototype.call.call(f, o, 20, 22))
1035 assertEquals(o, receiver) 1600 assertEquals(o, receiver)
1036 receiver = 333 1601 receiver = 333
1037 assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) 1602 assertEquals(32, Function.prototype.apply.call(f, o, [17, 15]))
1038 assertEquals(o, receiver) 1603 assertEquals(o, receiver)
1039 var ff = Function.prototype.bind.call(f, o, 12) 1604 var ff = Function.prototype.bind.call(f, o, 12)
1040 receiver = 333 1605 receiver = 333
1041 assertEquals(42, ff(30)) 1606 assertEquals(42, ff(30))
1042 assertEquals(o, receiver) 1607 assertEquals(o, receiver)
1043 receiver = 333 1608 receiver = 333
1044 assertEquals(32, Function.prototype.apply.call(ff, {}, [20])) 1609 assertEquals(32, Function.prototype.apply.call(ff, {}, [20]))
1045 assertEquals(o, receiver) 1610 assertEquals(o, receiver)
1046 1611
1047 Object.freeze(f) 1612 Object.freeze(f)
1048
1049 receiver = 333 1613 receiver = 333
1050 assertEquals(42, f(11, 31)) 1614 assertEquals(42, f(11, 31))
1051 // TODO(rossberg): unrelated bug: this does not succeed for optimized code. 1615 // TODO(rossberg): unrelated bug: this does not succeed for optimized code.
1052 // assertEquals(isStrict ? undefined : global, receiver) 1616 // assertEquals(isStrict ? undefined : global, receiver)
1053 receiver = 333 1617 receiver = 333
1054 assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) 1618 assertEquals(42, Function.prototype.call.call(f, o, 20, 22))
1055 assertEquals(o, receiver) 1619 assertEquals(o, receiver)
1056 receiver = 333 1620 receiver = 333
1057 assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) 1621 assertEquals(32, Function.prototype.apply.call(f, o, [17, 15]))
1058 assertEquals(o, receiver) 1622 assertEquals(o, receiver)
(...skipping 21 matching lines...) Expand all
1080 TestCall(true, Proxy.createFunction({}, function(x, y) { 1644 TestCall(true, Proxy.createFunction({}, function(x, y) {
1081 "use strict"; 1645 "use strict";
1082 receiver = this; return x + y 1646 receiver = this; return x + y
1083 })) 1647 }))
1084 1648
1085 var p = Proxy.createFunction({fix: function() {return {}}}, function(x, y) { 1649 var p = Proxy.createFunction({fix: function() {return {}}}, function(x, y) {
1086 receiver = this; return x + y 1650 receiver = this; return x + y
1087 }) 1651 })
1088 Object.freeze(p) 1652 Object.freeze(p)
1089 TestCall(false, p) 1653 TestCall(false, p)
1654
1655
1656 function TestCallThrow(callTrap) {
1657 var f = Proxy.createFunction({fix: function() {return {}}}, callTrap)
1658 assertThrows(function(){ f(11) }, "myexn")
1659 assertThrows(function(){ Function.prototype.call.call(f, {}, 2) }, "myexn")
1660 assertThrows(function(){ Function.prototype.apply.call(f, {}, [1]) }, "myexn")
1661
1662 Object.freeze(f)
1663 assertThrows(function(){ f(11) }, "myexn")
1664 assertThrows(function(){ Function.prototype.call.call(f, {}, 2) }, "myexn")
1665 assertThrows(function(){ Function.prototype.apply.call(f, {}, [1]) }, "myexn")
1666 }
1667
1668 TestCallThrow(function() { throw "myexn" })
1669 TestCallThrow(Proxy.createFunction({}, function() { throw "myexn" }))
1670
1671 var p = Proxy.createFunction(
1672 {fix: function() {return {}}}, function() { throw "myexn" })
1673 Object.freeze(p)
1674 TestCallThrow(p)
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698