| 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 |