OLD | NEW |
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 Loading... |
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): integer-index properties not implemented properly. | |
32 // TODO(rossberg): for-in not implemented on proxies. | 31 // TODO(rossberg): for-in not implemented on proxies. |
33 | 32 |
34 | 33 |
35 // Helper. | 34 // Helper. |
36 | 35 |
37 function TestWithProxies(test, handler) { | 36 function TestWithProxies(test, handler) { |
38 test(handler, Proxy.create) | 37 test(handler, Proxy.create) |
39 test(handler, function(h) {return Proxy.createFunction(h, function() {})}) | 38 test(handler, function(h) {return Proxy.createFunction(h, function() {})}) |
40 } | 39 } |
41 | 40 |
42 | 41 |
43 | 42 |
44 // Getting property descriptors (Object.getOwnPropertyDescriptor). | 43 // Getting property descriptors (Object.getOwnPropertyDescriptor). |
45 | 44 |
46 var key | 45 var key |
47 | 46 |
48 function TestGetOwnProperty(handler) { | 47 function TestGetOwnProperty(handler) { |
49 TestWithProxies(TestGetOwnProperty2, handler) | 48 TestWithProxies(TestGetOwnProperty2, handler) |
50 } | 49 } |
51 | 50 |
52 function TestGetOwnProperty2(handler, create) { | 51 function TestGetOwnProperty2(handler, create) { |
53 var p = create(handler) | 52 var p = create(handler) |
54 assertEquals(42, Object.getOwnPropertyDescriptor(p, "a").value) | 53 assertEquals(42, Object.getOwnPropertyDescriptor(p, "a").value) |
55 assertEquals("a", key) | 54 assertEquals("a", key) |
| 55 assertEquals(42, Object.getOwnPropertyDescriptor(p, 99).value) |
| 56 assertEquals("99", key) |
56 } | 57 } |
57 | 58 |
58 TestGetOwnProperty({ | 59 TestGetOwnProperty({ |
59 getOwnPropertyDescriptor: function(k) { | 60 getOwnPropertyDescriptor: function(k) { |
60 key = k | 61 key = k |
61 return {value: 42, configurable: true} | 62 return {value: 42, configurable: true} |
62 } | 63 } |
63 }) | 64 }) |
64 | 65 |
65 TestGetOwnProperty({ | 66 TestGetOwnProperty({ |
(...skipping 20 matching lines...) Expand all Loading... |
86 })) | 87 })) |
87 | 88 |
88 | 89 |
89 function TestGetOwnPropertyThrow(handler) { | 90 function TestGetOwnPropertyThrow(handler) { |
90 TestWithProxies(TestGetOwnPropertyThrow2, handler) | 91 TestWithProxies(TestGetOwnPropertyThrow2, handler) |
91 } | 92 } |
92 | 93 |
93 function TestGetOwnPropertyThrow2(handler, create) { | 94 function TestGetOwnPropertyThrow2(handler, create) { |
94 var p = create(handler) | 95 var p = create(handler) |
95 assertThrows(function(){ Object.getOwnPropertyDescriptor(p, "a") }, "myexn") | 96 assertThrows(function(){ Object.getOwnPropertyDescriptor(p, "a") }, "myexn") |
| 97 assertThrows(function(){ Object.getOwnPropertyDescriptor(p, 77) }, "myexn") |
96 } | 98 } |
97 | 99 |
98 TestGetOwnPropertyThrow({ | 100 TestGetOwnPropertyThrow({ |
99 getOwnPropertyDescriptor: function(k) { throw "myexn" } | 101 getOwnPropertyDescriptor: function(k) { throw "myexn" } |
100 }) | 102 }) |
101 | 103 |
102 TestGetOwnPropertyThrow({ | 104 TestGetOwnPropertyThrow({ |
103 getOwnPropertyDescriptor: function(k) { | 105 getOwnPropertyDescriptor: function(k) { |
104 return this.getPropertyDescriptor2(k) | 106 return this.getPropertyDescriptor2(k) |
105 }, | 107 }, |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 TestWithProxies(TestGetCall2, handler) | 191 TestWithProxies(TestGetCall2, handler) |
190 } | 192 } |
191 | 193 |
192 function TestGetCall2(handler, create) { | 194 function TestGetCall2(handler, create) { |
193 var p = create(handler) | 195 var p = create(handler) |
194 assertEquals(55, p.f()) | 196 assertEquals(55, p.f()) |
195 assertEquals(55, p["f"]()) | 197 assertEquals(55, p["f"]()) |
196 assertEquals(55, p.f("unused", "arguments")) | 198 assertEquals(55, p.f("unused", "arguments")) |
197 assertEquals(55, p.f.call(p)) | 199 assertEquals(55, p.f.call(p)) |
198 assertEquals(55, p["f"].call(p)) | 200 assertEquals(55, p["f"].call(p)) |
| 201 assertEquals(55, p[101].call(p)) |
199 assertEquals(55, p.withargs(45, 5)) | 202 assertEquals(55, p.withargs(45, 5)) |
200 assertEquals(55, p.withargs.call(p, 11, 22)) | 203 assertEquals(55, p.withargs.call(p, 11, 22)) |
201 assertEquals("6655", "66" + p) // calls p.toString | 204 assertEquals("6655", "66" + p) // calls p.toString |
202 | 205 |
203 var o = Object.create(p, {g: {value: function(x) { return x + 88 }}}) | 206 var o = Object.create(p, {g: {value: function(x) { return x + 88 }}}) |
204 assertEquals(55, o.f()) | 207 assertEquals(55, o.f()) |
205 assertEquals(55, o["f"]()) | 208 assertEquals(55, o["f"]()) |
206 assertEquals(55, o.f("unused", "arguments")) | 209 assertEquals(55, o.f("unused", "arguments")) |
207 assertEquals(55, o.f.call(o)) | 210 assertEquals(55, o.f.call(o)) |
208 assertEquals(55, o.f.call(p)) | 211 assertEquals(55, o.f.call(p)) |
209 assertEquals(55, o["f"].call(p)) | 212 assertEquals(55, o["f"].call(p)) |
| 213 assertEquals(55, o[101].call(p)) |
210 assertEquals(55, o.withargs(45, 5)) | 214 assertEquals(55, o.withargs(45, 5)) |
211 assertEquals(55, o.withargs.call(p, 11, 22)) | 215 assertEquals(55, o.withargs.call(p, 11, 22)) |
212 assertEquals(90, o.g(2)) | 216 assertEquals(90, o.g(2)) |
213 assertEquals(91, o.g.call(o, 3)) | 217 assertEquals(91, o.g.call(o, 3)) |
214 assertEquals(92, o.g.call(p, 4)) | 218 assertEquals(92, o.g.call(p, 4)) |
215 assertEquals("6655", "66" + o) // calls o.toString | 219 assertEquals("6655", "66" + o) // calls o.toString |
216 } | 220 } |
217 | 221 |
218 TestGetCall({ | 222 TestGetCall({ |
219 get: function(r, k) { return function() { return 55 } } | 223 get: function(r, k) { return function() { return 55 } } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 | 274 |
271 | 275 |
272 function TestGetThrow(handler) { | 276 function TestGetThrow(handler) { |
273 TestWithProxies(TestGetThrow2, handler) | 277 TestWithProxies(TestGetThrow2, handler) |
274 } | 278 } |
275 | 279 |
276 function TestGetThrow2(handler, create) { | 280 function TestGetThrow2(handler, create) { |
277 var p = create(handler) | 281 var p = create(handler) |
278 assertThrows(function(){ p.a }, "myexn") | 282 assertThrows(function(){ p.a }, "myexn") |
279 assertThrows(function(){ p["b"] }, "myexn") | 283 assertThrows(function(){ p["b"] }, "myexn") |
| 284 assertThrows(function(){ p[3] }, "myexn") |
280 | 285 |
281 var o = Object.create(p, {x: {value: 88}}) | 286 var o = Object.create(p, {x: {value: 88}, '4': {value: 89}}) |
282 assertThrows(function(){ o.a }, "myexn") | 287 assertThrows(function(){ o.a }, "myexn") |
283 assertThrows(function(){ o["b"] }, "myexn") | 288 assertThrows(function(){ o["b"] }, "myexn") |
| 289 assertThrows(function(){ o[3] }, "myexn") |
284 assertEquals(88, o.x) | 290 assertEquals(88, o.x) |
285 assertEquals(88, o["x"]) | 291 assertEquals(88, o["x"]) |
| 292 assertEquals(89, o[4]) |
286 } | 293 } |
287 | 294 |
288 TestGetThrow({ | 295 TestGetThrow({ |
289 get: function(r, k) { throw "myexn" } | 296 get: function(r, k) { throw "myexn" } |
290 }) | 297 }) |
291 | 298 |
292 TestGetThrow({ | 299 TestGetThrow({ |
293 get: function(r, k) { return this.get2(r, k) }, | 300 get: function(r, k) { return this.get2(r, k) }, |
294 get2: function(r, k) { throw "myexn" } | 301 get2: function(r, k) { throw "myexn" } |
295 }) | 302 }) |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 } | 343 } |
337 | 344 |
338 function TestSet2(handler, create) { | 345 function TestSet2(handler, create) { |
339 var p = create(handler) | 346 var p = create(handler) |
340 assertEquals(42, p.a = 42) | 347 assertEquals(42, p.a = 42) |
341 assertEquals("a", key) | 348 assertEquals("a", key) |
342 assertEquals(42, val) | 349 assertEquals(42, val) |
343 assertEquals(43, p["b"] = 43) | 350 assertEquals(43, p["b"] = 43) |
344 assertEquals("b", key) | 351 assertEquals("b", key) |
345 assertEquals(43, val) | 352 assertEquals(43, val) |
| 353 assertEquals(44, p[77] = 44) |
| 354 assertEquals("77", key) |
| 355 assertEquals(44, val) |
346 } | 356 } |
347 | 357 |
348 TestSet({ | 358 TestSet({ |
349 set: function(r, k, v) { key = k; val = v; return true }, | 359 set: function(r, k, v) { key = k; val = v; return true }, |
350 }) | 360 }) |
351 | 361 |
352 TestSet({ | 362 TestSet({ |
353 set: function(r, k, v) { return this.set2(r, k, v) }, | 363 set: function(r, k, v) { return this.set2(r, k, v) }, |
354 set2: function(r, k, v) { key = k; val = v; return true } | 364 set2: function(r, k, v) { key = k; val = v; return true } |
355 }) | 365 }) |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 | 426 |
417 | 427 |
418 function TestSetThrow(handler, create) { | 428 function TestSetThrow(handler, create) { |
419 TestWithProxies(TestSetThrow2, handler) | 429 TestWithProxies(TestSetThrow2, handler) |
420 } | 430 } |
421 | 431 |
422 function TestSetThrow2(handler, create) { | 432 function TestSetThrow2(handler, create) { |
423 var p = create(handler) | 433 var p = create(handler) |
424 assertThrows(function(){ p.a = 42 }, "myexn") | 434 assertThrows(function(){ p.a = 42 }, "myexn") |
425 assertThrows(function(){ p["b"] = 42 }, "myexn") | 435 assertThrows(function(){ p["b"] = 42 }, "myexn") |
| 436 assertThrows(function(){ p[22] = 42 }, "myexn") |
426 } | 437 } |
427 | 438 |
428 TestSetThrow({ | 439 TestSetThrow({ |
429 set: function(r, k, v) { throw "myexn" } | 440 set: function(r, k, v) { throw "myexn" } |
430 }) | 441 }) |
431 | 442 |
432 TestSetThrow({ | 443 TestSetThrow({ |
433 set: function(r, k, v) { return this.set2(r, k, v) }, | 444 set: function(r, k, v) { return this.set2(r, k, v) }, |
434 set2: function(r, k, v) { throw "myexn" } | 445 set2: function(r, k, v) { throw "myexn" } |
435 }) | 446 }) |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 | 547 |
537 var key | 548 var key |
538 var val | 549 var val |
539 | 550 |
540 function TestSetForDerived(handler, create) { | 551 function TestSetForDerived(handler, create) { |
541 TestWithProxies(TestSetForDerived2, handler) | 552 TestWithProxies(TestSetForDerived2, handler) |
542 } | 553 } |
543 | 554 |
544 function TestSetForDerived2(handler, create) { | 555 function TestSetForDerived2(handler, create) { |
545 var p = create(handler) | 556 var p = create(handler) |
546 var o = Object.create(p, {x: {value: 88, writable: true}}) | 557 var o = Object.create(p, {x: {value: 88, writable: true}, |
| 558 '1': {value: 89, writable: true}}) |
547 | 559 |
548 key = "" | 560 key = "" |
549 assertEquals(48, o.x = 48) | 561 assertEquals(48, o.x = 48) |
550 assertEquals("", key) // trap not invoked | 562 assertEquals("", key) // trap not invoked |
551 assertEquals(48, o.x) | 563 assertEquals(48, o.x) |
552 | 564 |
| 565 assertEquals(47, o[1] = 47) |
| 566 assertEquals("", key) // trap not invoked |
| 567 assertEquals(47, o[1]) |
| 568 |
553 assertEquals(49, o.y = 49) | 569 assertEquals(49, o.y = 49) |
554 assertEquals("y", key) | 570 assertEquals("y", key) |
555 assertEquals(49, o.y) | 571 assertEquals(49, o.y) |
556 | 572 |
| 573 assertEquals(50, o[2] = 50) |
| 574 assertEquals("2", key) |
| 575 assertEquals(50, o[2]) |
| 576 |
557 assertEquals(44, o.p_writable = 44) | 577 assertEquals(44, o.p_writable = 44) |
558 assertEquals("p_writable", key) | 578 assertEquals("p_writable", key) |
559 assertEquals(44, o.p_writable) | 579 assertEquals(44, o.p_writable) |
560 | 580 |
561 assertEquals(45, o.p_nonwritable = 45) | 581 assertEquals(45, o.p_nonwritable = 45) |
562 assertEquals("p_nonwritable", key) | 582 assertEquals("p_nonwritable", key) |
563 assertEquals(45, o.p_nonwritable) | 583 assertEquals(45, o.p_nonwritable) |
564 | 584 |
565 assertEquals(46, o.p_setter = 46) | 585 assertEquals(46, o.p_setter = 46) |
566 assertEquals("p_setter", key) | 586 assertEquals("p_setter", key) |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 assertEquals(2, Object.getOwnPropertyNames(desc).length) | 647 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
628 assertEquals(45, desc.value) | 648 assertEquals(45, desc.value) |
629 assertEquals(false, desc.writable) | 649 assertEquals(false, desc.writable) |
630 | 650 |
631 assertEquals(p, Object.defineProperty(p, "c", {value: 46, enumerable: false})) | 651 assertEquals(p, Object.defineProperty(p, "c", {value: 46, enumerable: false})) |
632 assertEquals("c", key) | 652 assertEquals("c", key) |
633 assertEquals(2, Object.getOwnPropertyNames(desc).length) | 653 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
634 assertEquals(46, desc.value) | 654 assertEquals(46, desc.value) |
635 assertEquals(false, desc.enumerable) | 655 assertEquals(false, desc.enumerable) |
636 | 656 |
| 657 assertEquals(p, Object.defineProperty(p, 101, {value: 47, enumerable: false})) |
| 658 assertEquals("101", key) |
| 659 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
| 660 assertEquals(47, desc.value) |
| 661 assertEquals(false, desc.enumerable) |
| 662 |
637 var attributes = {configurable: true, mine: 66, minetoo: 23} | 663 var attributes = {configurable: true, mine: 66, minetoo: 23} |
638 assertEquals(p, Object.defineProperty(p, "d", attributes)) | 664 assertEquals(p, Object.defineProperty(p, "d", attributes)) |
639 assertEquals("d", key) | 665 assertEquals("d", key) |
640 // Modifying the attributes object after the fact should have no effect. | 666 // Modifying the attributes object after the fact should have no effect. |
641 attributes.configurable = false | 667 attributes.configurable = false |
642 attributes.mine = 77 | 668 attributes.mine = 77 |
643 delete attributes.minetoo | 669 delete attributes.minetoo |
644 assertEquals(3, Object.getOwnPropertyNames(desc).length) | 670 assertEquals(3, Object.getOwnPropertyNames(desc).length) |
645 assertEquals(true, desc.configurable) | 671 assertEquals(true, desc.configurable) |
646 assertEquals(66, desc.mine) | 672 assertEquals(66, desc.mine) |
(...skipping 14 matching lines...) Expand all Loading... |
661 // getOwnPropertyNames: function() { return ["value"] } | 687 // getOwnPropertyNames: function() { return ["value"] } |
662 // }) | 688 // }) |
663 // assertEquals(1, Object.getOwnPropertyNames(d).length) | 689 // assertEquals(1, Object.getOwnPropertyNames(d).length) |
664 // assertEquals(77, d.value) | 690 // assertEquals(77, d.value) |
665 // assertEquals(p, Object.defineProperty(p, "p", d)) | 691 // assertEquals(p, Object.defineProperty(p, "p", d)) |
666 // assertEquals("p", key) | 692 // assertEquals("p", key) |
667 // assertEquals(1, Object.getOwnPropertyNames(desc).length) | 693 // assertEquals(1, Object.getOwnPropertyNames(desc).length) |
668 // assertEquals(77, desc.value) | 694 // assertEquals(77, desc.value) |
669 | 695 |
670 var props = { | 696 var props = { |
671 'bla': {}, | 697 '11': {}, |
672 blub: {get: function() { return true }}, | 698 blub: {get: function() { return true }}, |
673 '': {get value() { return 20 }}, | 699 '': {get value() { return 20 }}, |
674 last: {value: 21, configurable: true, mine: "eyes"} | 700 last: {value: 21, configurable: true, mine: "eyes"} |
675 } | 701 } |
676 Object.defineProperty(props, "hidden", {value: "hidden", enumerable: false}) | 702 Object.defineProperty(props, "hidden", {value: "hidden", enumerable: false}) |
677 assertEquals(p, Object.defineProperties(p, props)) | 703 assertEquals(p, Object.defineProperties(p, props)) |
678 assertEquals("last", key) | 704 assertEquals("last", key) |
679 assertEquals(2, Object.getOwnPropertyNames(desc).length) | 705 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
680 assertEquals(21, desc.value) | 706 assertEquals(21, desc.value) |
681 assertEquals(true, desc.configurable) | 707 assertEquals(true, desc.configurable) |
(...skipping 19 matching lines...) Expand all Loading... |
701 })) | 727 })) |
702 | 728 |
703 | 729 |
704 function TestDefineThrow(handler) { | 730 function TestDefineThrow(handler) { |
705 TestWithProxies(TestDefineThrow2, handler) | 731 TestWithProxies(TestDefineThrow2, handler) |
706 } | 732 } |
707 | 733 |
708 function TestDefineThrow2(handler, create) { | 734 function TestDefineThrow2(handler, create) { |
709 var p = create(handler) | 735 var p = create(handler) |
710 assertThrows(function(){ Object.defineProperty(p, "a", {value: 44})}, "myexn") | 736 assertThrows(function(){ Object.defineProperty(p, "a", {value: 44})}, "myexn") |
| 737 assertThrows(function(){ Object.defineProperty(p, 0, {value: 44})}, "myexn") |
711 | 738 |
712 // TODO(rossberg): These tests require for-in on proxies. | 739 // TODO(rossberg): These tests require for-in on proxies. |
713 // var d1 = create({ | 740 // var d1 = create({ |
714 // get: function(r, k) { throw "myexn" }, | 741 // get: function(r, k) { throw "myexn" }, |
715 // getOwnPropertyNames: function() { return ["value"] } | 742 // getOwnPropertyNames: function() { return ["value"] } |
716 // }) | 743 // }) |
717 // assertThrows(function(){ Object.defineProperty(p, "p", d1) }, "myexn") | 744 // assertThrows(function(){ Object.defineProperty(p, "p", d1) }, "myexn") |
718 // var d2 = create({ | 745 // var d2 = create({ |
719 // get: function(r, k) { return 77 }, | 746 // get: function(r, k) { return 77 }, |
720 // getOwnPropertyNames: function() { throw "myexn" } | 747 // getOwnPropertyNames: function() { throw "myexn" } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 function TestDelete(handler) { | 780 function TestDelete(handler) { |
754 TestWithProxies(TestDelete2, handler) | 781 TestWithProxies(TestDelete2, handler) |
755 } | 782 } |
756 | 783 |
757 function TestDelete2(handler, create) { | 784 function TestDelete2(handler, create) { |
758 var p = create(handler) | 785 var p = create(handler) |
759 assertEquals(true, delete p.a) | 786 assertEquals(true, delete p.a) |
760 assertEquals("a", key) | 787 assertEquals("a", key) |
761 assertEquals(true, delete p["b"]) | 788 assertEquals(true, delete p["b"]) |
762 assertEquals("b", key) | 789 assertEquals("b", key) |
| 790 assertEquals(true, delete p[1]) |
| 791 assertEquals("1", key) |
763 | 792 |
764 assertEquals(false, delete p.z1) | 793 assertEquals(false, delete p.z1) |
765 assertEquals("z1", key) | 794 assertEquals("z1", key) |
766 assertEquals(false, delete p["z2"]) | 795 assertEquals(false, delete p["z2"]) |
767 assertEquals("z2", key); | 796 assertEquals("z2", key); |
768 | 797 |
769 (function() { | 798 (function() { |
770 "use strict" | 799 "use strict" |
771 assertEquals(true, delete p.c) | 800 assertEquals(true, delete p.c) |
772 assertEquals("c", key) | 801 assertEquals("c", key) |
773 assertEquals(true, delete p["d"]) | 802 assertEquals(true, delete p["d"]) |
774 assertEquals("d", key) | 803 assertEquals("d", key) |
| 804 assertEquals(true, delete p[2]) |
| 805 assertEquals("2", key) |
775 | 806 |
776 assertThrows(function(){ delete p.z3 }, TypeError) | 807 assertThrows(function(){ delete p.z3 }, TypeError) |
777 assertEquals("z3", key) | 808 assertEquals("z3", key) |
778 assertThrows(function(){ delete p["z4"] }, TypeError) | 809 assertThrows(function(){ delete p["z4"] }, TypeError) |
779 assertEquals("z4", key) | 810 assertEquals("z4", key) |
780 })() | 811 })() |
781 } | 812 } |
782 | 813 |
783 TestDelete({ | 814 TestDelete({ |
784 delete: function(k) { key = k; return k < "z" } | 815 delete: function(k) { key = k; return k < "z" } |
(...skipping 12 matching lines...) Expand all Loading... |
797 | 828 |
798 | 829 |
799 function TestDeleteThrow(handler) { | 830 function TestDeleteThrow(handler) { |
800 TestWithProxies(TestDeleteThrow2, handler) | 831 TestWithProxies(TestDeleteThrow2, handler) |
801 } | 832 } |
802 | 833 |
803 function TestDeleteThrow2(handler, create) { | 834 function TestDeleteThrow2(handler, create) { |
804 var p = create(handler) | 835 var p = create(handler) |
805 assertThrows(function(){ delete p.a }, "myexn") | 836 assertThrows(function(){ delete p.a }, "myexn") |
806 assertThrows(function(){ delete p["b"] }, "myexn"); | 837 assertThrows(function(){ delete p["b"] }, "myexn"); |
| 838 assertThrows(function(){ delete p[3] }, "myexn"); |
807 | 839 |
808 (function() { | 840 (function() { |
809 "use strict" | 841 "use strict" |
810 assertThrows(function(){ delete p.c }, "myexn") | 842 assertThrows(function(){ delete p.c }, "myexn") |
811 assertThrows(function(){ delete p["d"] }, "myexn") | 843 assertThrows(function(){ delete p["d"] }, "myexn") |
| 844 assertThrows(function(){ delete p[4] }, "myexn"); |
812 })() | 845 })() |
813 } | 846 } |
814 | 847 |
815 TestDeleteThrow({ | 848 TestDeleteThrow({ |
816 delete: function(k) { throw "myexn" } | 849 delete: function(k) { throw "myexn" } |
817 }) | 850 }) |
818 | 851 |
819 TestDeleteThrow({ | 852 TestDeleteThrow({ |
820 delete: function(k) { return this.delete2(k) }, | 853 delete: function(k) { return this.delete2(k) }, |
821 delete2: function(k) { throw "myexn" } | 854 delete2: function(k) { throw "myexn" } |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1024 })) | 1057 })) |
1025 | 1058 |
1026 | 1059 |
1027 function TestInThrow(handler) { | 1060 function TestInThrow(handler) { |
1028 TestWithProxies(TestInThrow2, handler) | 1061 TestWithProxies(TestInThrow2, handler) |
1029 } | 1062 } |
1030 | 1063 |
1031 function TestInThrow2(handler, create) { | 1064 function TestInThrow2(handler, create) { |
1032 var p = create(handler) | 1065 var p = create(handler) |
1033 assertThrows(function(){ return "a" in o }, "myexn") | 1066 assertThrows(function(){ return "a" in o }, "myexn") |
| 1067 assertThrows(function(){ return 99 in o }, "myexn") |
1034 assertThrows(function(){ return !("a" in o) }, "myexn") | 1068 assertThrows(function(){ return !("a" in o) }, "myexn") |
1035 assertThrows(function(){ return ("a" in o) ? 2 : 3 }, "myexn") | 1069 assertThrows(function(){ return ("a" in o) ? 2 : 3 }, "myexn") |
1036 assertThrows(function(){ if ("b" in o) {} }, "myexn") | 1070 assertThrows(function(){ if ("b" in o) {} }, "myexn") |
1037 assertThrows(function(){ if (!("b" in o)) {} }, "myexn") | 1071 assertThrows(function(){ if (!("b" in o)) {} }, "myexn") |
1038 assertThrows(function(){ if ("zzz" in o) {} }, "myexn") | 1072 assertThrows(function(){ if ("zzz" in o) {} }, "myexn") |
1039 } | 1073 } |
1040 | 1074 |
1041 TestInThrow({ | 1075 TestInThrow({ |
1042 has: function(k) { throw "myexn" } | 1076 has: function(k) { throw "myexn" } |
1043 }) | 1077 }) |
(...skipping 30 matching lines...) Expand all Loading... |
1074 | 1108 |
1075 function TestInForDerived(handler) { | 1109 function TestInForDerived(handler) { |
1076 TestWithProxies(TestInForDerived2, handler) | 1110 TestWithProxies(TestInForDerived2, handler) |
1077 } | 1111 } |
1078 | 1112 |
1079 function TestInForDerived2(handler, create) { | 1113 function TestInForDerived2(handler, create) { |
1080 var p = create(handler) | 1114 var p = create(handler) |
1081 var o = Object.create(p) | 1115 var o = Object.create(p) |
1082 assertTrue("a" in o) | 1116 assertTrue("a" in o) |
1083 assertEquals("a", key) | 1117 assertEquals("a", key) |
1084 // TODO(rossberg): integer indexes not correctly implemeted yet | 1118 assertTrue(99 in o) |
1085 // assertTrue(99 in o) | 1119 assertEquals("99", key) |
1086 // assertEquals("99", key) | |
1087 assertFalse("z" in o) | 1120 assertFalse("z" in o) |
1088 assertEquals("z", key) | 1121 assertEquals("z", key) |
1089 | 1122 |
1090 assertEquals(2, ("a" in o) ? 2 : 0) | 1123 assertEquals(2, ("a" in o) ? 2 : 0) |
1091 assertEquals(0, !("a" in o) ? 2 : 0) | 1124 assertEquals(0, !("a" in o) ? 2 : 0) |
1092 assertEquals(0, ("zzz" in o) ? 2 : 0) | 1125 assertEquals(0, ("zzz" in o) ? 2 : 0) |
1093 assertEquals(2, !("zzz" in o) ? 2 : 0) | 1126 assertEquals(2, !("zzz" in o) ? 2 : 0) |
1094 | 1127 |
1095 if ("b" in o) { | 1128 if ("b" in o) { |
1096 } else { | 1129 } else { |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1166 | 1199 |
1167 | 1200 |
1168 | 1201 |
1169 // Property descriptor conversion. | 1202 // Property descriptor conversion. |
1170 | 1203 |
1171 var descget | 1204 var descget |
1172 | 1205 |
1173 function TestDescriptorGetOrder(handler) { | 1206 function TestDescriptorGetOrder(handler) { |
1174 var p = Proxy.create(handler) | 1207 var p = Proxy.create(handler) |
1175 var o = Object.create(p, {b: {value: 0}}) | 1208 var o = Object.create(p, {b: {value: 0}}) |
1176 TestDescriptorGetOrder2(function(n) { p[n] }, "vV") | 1209 TestDescriptorGetOrder2(function(n) { return p[n] }, "vV") |
1177 TestDescriptorGetOrder2(function(n) { n in p }, "") | 1210 TestDescriptorGetOrder2(function(n) { return n in p }, "") |
1178 TestDescriptorGetOrder2(function(n) { o[n] }, "vV") | 1211 TestDescriptorGetOrder2(function(n) { return o[n] }, "vV") |
1179 TestDescriptorGetOrder2(function(n) { n in o }, "eEcCvVwWgs") | 1212 TestDescriptorGetOrder2(function(n) { return n in o }, "eEcCvVwWgs") |
1180 } | 1213 } |
1181 | 1214 |
1182 function TestDescriptorGetOrder2(f, access) { | 1215 function TestDescriptorGetOrder2(f, access) { |
1183 descget = "" | 1216 descget = "" |
1184 f("a") | 1217 assertTrue(f("a")) |
1185 assertEquals(access, descget) | 1218 assertEquals(access, descget) |
1186 // TODO(rossberg): integer indexes not correctly implemented yet. | |
1187 // descget = "" | |
1188 // f(99) | |
1189 // assertEquals(access, descget) | |
1190 descget = "" | 1219 descget = "" |
1191 f("z") | 1220 assertTrue(f(99)) |
| 1221 assertEquals(access, descget) |
| 1222 descget = "" |
| 1223 assertFalse(!!f("z")) |
1192 assertEquals("", descget) | 1224 assertEquals("", descget) |
1193 } | 1225 } |
1194 | 1226 |
1195 TestDescriptorGetOrder({ | 1227 TestDescriptorGetOrder({ |
1196 getPropertyDescriptor: function(k) { | 1228 getPropertyDescriptor: function(k) { |
1197 if (k >= "z") return void 0 | 1229 if (k >= "z") return void 0 |
1198 // Return a proxy as property descriptor, so that we can log accesses. | 1230 // Return a proxy as property descriptor, so that we can log accesses. |
1199 return Proxy.create({ | 1231 return Proxy.create({ |
1200 get: function(r, attr) { | 1232 get: function(r, attr) { |
1201 descget += attr[0].toUpperCase() | 1233 descget += attr[0].toUpperCase() |
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1677 assertFixing(o, false, false, true) | 1709 assertFixing(o, false, false, true) |
1678 Object.freeze(o) | 1710 Object.freeze(o) |
1679 assertFixing(p, false, false, true) | 1711 assertFixing(p, false, false, true) |
1680 assertFixing(o, true, true, false) | 1712 assertFixing(o, true, true, false) |
1681 } | 1713 } |
1682 | 1714 |
1683 TestFix([], { | 1715 TestFix([], { |
1684 fix: function() { return {} } | 1716 fix: function() { return {} } |
1685 }) | 1717 }) |
1686 | 1718 |
1687 TestFix(["a", "b", "c", "d", "zz"], { | 1719 TestFix(["a", "b", "c", "3", "zz"], { |
1688 fix: function() { | 1720 fix: function() { |
1689 return { | 1721 return { |
1690 a: {value: "a", writable: true, configurable: false, enumerable: true}, | 1722 a: {value: "a", writable: true, configurable: false, enumerable: true}, |
1691 b: {value: 33, writable: false, configurable: false, enumerable: true}, | 1723 b: {value: 33, writable: false, configurable: false, enumerable: true}, |
1692 c: {value: 0, writable: true, configurable: true, enumerable: true}, | 1724 c: {value: 0, writable: true, configurable: true, enumerable: true}, |
1693 d: {value: true, writable: false, configurable: true, enumerable: true}, | 1725 '3': {value: true, writable: false, configurable: true, enumerable: true}, |
1694 zz: {value: 0, enumerable: false} | 1726 zz: {value: 0, enumerable: false} |
1695 } | 1727 } |
1696 } | 1728 } |
1697 }) | 1729 }) |
1698 | 1730 |
1699 TestFix(["a"], { | 1731 TestFix(["a"], { |
1700 fix: function() { return this.fix2() }, | 1732 fix: function() { return this.fix2() }, |
1701 fix2: function() { | 1733 fix2: function() { |
1702 return {a: {value: 4, writable: true, configurable: true, enumerable: true}} | 1734 return {a: {value: 4, writable: true, configurable: true, enumerable: true}} |
1703 } | 1735 } |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2185 | 2217 |
2186 function TestConstructThrow2(f) { | 2218 function TestConstructThrow2(f) { |
2187 assertThrows(function(){ new f(11) }, "myexn") | 2219 assertThrows(function(){ new f(11) }, "myexn") |
2188 Object.freeze(f) | 2220 Object.freeze(f) |
2189 assertThrows(function(){ new f(11) }, "myexn") | 2221 assertThrows(function(){ new f(11) }, "myexn") |
2190 } | 2222 } |
2191 | 2223 |
2192 TestConstructThrow(function() { throw "myexn" }) | 2224 TestConstructThrow(function() { throw "myexn" }) |
2193 TestConstructThrow(Proxy.createFunction({}, function() { throw "myexn" })) | 2225 TestConstructThrow(Proxy.createFunction({}, function() { throw "myexn" })) |
2194 TestConstructThrow(CreateFrozen({}, function() { throw "myexn" })) | 2226 TestConstructThrow(CreateFrozen({}, function() { throw "myexn" })) |
OLD | NEW |