OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 function setter2() {val2++; } | 67 function setter2() {val2++; } |
68 function getter2() {return val2; } | 68 function getter2() {return val2; } |
69 | 69 |
70 function setter3() {val3++; } | 70 function setter3() {val3++; } |
71 function getter3() {return val3; } | 71 function getter3() {return val3; } |
72 | 72 |
73 | 73 |
74 // Descriptors. | 74 // Descriptors. |
75 var emptyDesc = {}; | 75 var emptyDesc = {}; |
76 | 76 |
77 var accessorConfigurable = { | 77 var accessorConfigurable = { |
78 set: setter1, | 78 set: setter1, |
79 get: getter1, | 79 get: getter1, |
80 configurable: true | 80 configurable: true |
81 }; | 81 }; |
82 | 82 |
83 var accessorNoConfigurable = { | 83 var accessorNoConfigurable = { |
84 set: setter2, | 84 set: setter2, |
85 get: getter2, | 85 get: getter2, |
86 configurable: false | 86 configurable: false |
87 }; | 87 }; |
88 | 88 |
89 var accessorOnlySet = { | 89 var accessorOnlySet = { |
90 set: setter3, | 90 set: setter3, |
91 configurable: true | 91 configurable: true |
92 }; | 92 }; |
93 | 93 |
94 var accessorOnlyGet = { | 94 var accessorOnlyGet = { |
95 get: getter3, | 95 get: getter3, |
96 configurable: true | 96 configurable: true |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); | 227 desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); |
228 assertTrue(desc.configurable); | 228 assertTrue(desc.configurable); |
229 assertFalse(desc.enumerable); | 229 assertFalse(desc.enumerable); |
230 assertEquals(desc.get, accessorOnlyGet.get); | 230 assertEquals(desc.get, accessorOnlyGet.get); |
231 assertEquals(desc.set, accessorOnlySet.set); | 231 assertEquals(desc.set, accessorOnlySet.set); |
232 assertEquals(desc.writable, undefined); | 232 assertEquals(desc.writable, undefined); |
233 assertEquals(desc.value, undefined); | 233 assertEquals(desc.value, undefined); |
234 assertEquals(1, obj1.setOnly = 1); | 234 assertEquals(1, obj1.setOnly = 1); |
235 assertEquals(2, val3); | 235 assertEquals(2, val3); |
236 | 236 |
237 // The above should also work if redefining just a getter or setter on | 237 // The above should also work if redefining just a getter or setter on |
238 // an existing property with both a getter and a setter. | 238 // an existing property with both a getter and a setter. |
239 Object.defineProperty(obj1, "both", accessorConfigurable); | 239 Object.defineProperty(obj1, "both", accessorConfigurable); |
240 | 240 |
241 Object.defineProperty(obj1, "both", accessorOnlySet); | 241 Object.defineProperty(obj1, "both", accessorOnlySet); |
242 desc = Object.getOwnPropertyDescriptor(obj1, "both"); | 242 desc = Object.getOwnPropertyDescriptor(obj1, "both"); |
243 assertTrue(desc.configurable); | 243 assertTrue(desc.configurable); |
244 assertFalse(desc.enumerable); | 244 assertFalse(desc.enumerable); |
245 assertEquals(desc.set, accessorOnlySet.set); | 245 assertEquals(desc.set, accessorOnlySet.set); |
246 assertEquals(desc.get, accessorConfigurable.get); | 246 assertEquals(desc.get, accessorConfigurable.get); |
247 assertEquals(desc.writable, undefined); | 247 assertEquals(desc.writable, undefined); |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 desc = Object.getOwnPropertyDescriptor(obj2, "bar"); | 377 desc = Object.getOwnPropertyDescriptor(obj2, "bar"); |
378 assertEquals(obj2.bar, 1000); | 378 assertEquals(obj2.bar, 1000); |
379 assertEquals(desc.value, 1000); | 379 assertEquals(desc.value, 1000); |
380 assertTrue(desc.configurable); | 380 assertTrue(desc.configurable); |
381 assertFalse(desc.writable); | 381 assertFalse(desc.writable); |
382 assertFalse(desc.enumerable); | 382 assertFalse(desc.enumerable); |
383 assertEquals(desc.get, undefined); | 383 assertEquals(desc.get, undefined); |
384 assertEquals(desc.set, undefined); | 384 assertEquals(desc.set, undefined); |
385 | 385 |
386 | 386 |
387 // Redefinition of an accessor defined using __defineGetter__ and | 387 // Redefinition of an accessor defined using __defineGetter__ and |
388 // __defineSetter__. | 388 // __defineSetter__. |
389 function get(){return this.x} | 389 function get(){return this.x} |
390 function set(x){this.x=x}; | 390 function set(x){this.x=x}; |
391 | 391 |
392 var obj3 = {x:1000}; | 392 var obj3 = {x:1000}; |
393 obj3.__defineGetter__("foo", get); | 393 obj3.__defineGetter__("foo", get); |
394 obj3.__defineSetter__("foo", set); | 394 obj3.__defineSetter__("foo", set); |
395 | 395 |
396 desc = Object.getOwnPropertyDescriptor(obj3, "foo"); | 396 desc = Object.getOwnPropertyDescriptor(obj3, "foo"); |
397 assertTrue(desc.configurable); | 397 assertTrue(desc.configurable); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 // Make sure an error is thrown when trying to access to redefined function. | 455 // Make sure an error is thrown when trying to access to redefined function. |
456 try { | 456 try { |
457 obj4.bar(); | 457 obj4.bar(); |
458 assertTrue(false); | 458 assertTrue(false); |
459 } catch (e) { | 459 } catch (e) { |
460 assertTrue(/is not a function/.test(e)); | 460 assertTrue(/is not a function/.test(e)); |
461 } | 461 } |
462 | 462 |
463 | 463 |
464 // Test runtime calls to DefineOrRedefineDataProperty and | 464 // Test runtime calls to DefineOrRedefineDataProperty and |
465 // DefineOrRedefineAccessorProperty - make sure we don't | 465 // DefineOrRedefineAccessorProperty - make sure we don't |
466 // crash. | 466 // crash. |
467 try { | 467 try { |
468 %DefineOrRedefineAccessorProperty(0, 0, 0, 0, 0); | 468 %DefineOrRedefineAccessorProperty(0, 0, 0, 0, 0); |
469 } catch (e) { | 469 } catch (e) { |
470 assertTrue(/illegal access/.test(e)); | 470 assertTrue(/illegal access/.test(e)); |
471 } | 471 } |
472 | 472 |
473 try { | 473 try { |
474 %DefineOrRedefineDataProperty(0, 0, 0, 0); | 474 %DefineOrRedefineDataProperty(0, 0, 0, 0); |
475 } catch (e) { | 475 } catch (e) { |
(...skipping 28 matching lines...) Expand all Loading... |
504 | 504 |
505 try { | 505 try { |
506 %DefineOrRedefineDataProperty(null, 'foo', 0, 0); | 506 %DefineOrRedefineDataProperty(null, 'foo', 0, 0); |
507 } catch (e) { | 507 } catch (e) { |
508 assertTrue(/illegal access/.test(e)); | 508 assertTrue(/illegal access/.test(e)); |
509 } | 509 } |
510 | 510 |
511 // Test that all possible differences in step 6 in DefineOwnProperty are | 511 // Test that all possible differences in step 6 in DefineOwnProperty are |
512 // exercised, i.e., any difference in the given property descriptor and the | 512 // exercised, i.e., any difference in the given property descriptor and the |
513 // existing properties should not return true, but throw an error if the | 513 // existing properties should not return true, but throw an error if the |
514 // existing configurable property is false. | 514 // existing configurable property is false. |
515 | 515 |
516 var obj5 = {}; | 516 var obj5 = {}; |
517 // Enumerable will default to false. | 517 // Enumerable will default to false. |
518 Object.defineProperty(obj5, 'foo', accessorNoConfigurable); | 518 Object.defineProperty(obj5, 'foo', accessorNoConfigurable); |
519 desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); | 519 desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); |
520 // First, test that we are actually allowed to set the accessor if all | 520 // First, test that we are actually allowed to set the accessor if all |
521 // values are of the descriptor are the same as the existing one. | 521 // values are of the descriptor are the same as the existing one. |
522 Object.defineProperty(obj5, 'foo', accessorNoConfigurable); | 522 Object.defineProperty(obj5, 'foo', accessorNoConfigurable); |
523 | 523 |
524 // Different setter. | 524 // Different setter. |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
720 obj6[1] = 'foo'; | 720 obj6[1] = 'foo'; |
721 obj6[2] = 'bar'; | 721 obj6[2] = 'bar'; |
722 obj6[3] = '42'; | 722 obj6[3] = '42'; |
723 obj6[4] = '43'; | 723 obj6[4] = '43'; |
724 obj6[5] = '44'; | 724 obj6[5] = '44'; |
725 | 725 |
726 var descElement = { value: 'foobar' }; | 726 var descElement = { value: 'foobar' }; |
727 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; | 727 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; |
728 var descElementNonWritable = { value: 'foofoo', writable: false }; | 728 var descElementNonWritable = { value: 'foofoo', writable: false }; |
729 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; | 729 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; |
730 var descElementAllFalse = { value: 'foofalse', | 730 var descElementAllFalse = { value: 'foofalse', |
731 configurable: false, | 731 configurable: false, |
732 writable: false, | 732 writable: false, |
733 enumerable: false }; | 733 enumerable: false }; |
734 | 734 |
735 | 735 |
736 // Redefine existing property. | 736 // Redefine existing property. |
737 Object.defineProperty(obj6, '1', descElement); | 737 Object.defineProperty(obj6, '1', descElement); |
738 desc = Object.getOwnPropertyDescriptor(obj6, '1'); | 738 desc = Object.getOwnPropertyDescriptor(obj6, '1'); |
739 assertEquals(desc.value, 'foobar'); | 739 assertEquals(desc.value, 'foobar'); |
740 assertTrue(desc.writable); | 740 assertTrue(desc.writable); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 // Define non existing property - all attributes should default to false. | 783 // Define non existing property - all attributes should default to false. |
784 Object.defineProperty(obj6, '15', descElement); | 784 Object.defineProperty(obj6, '15', descElement); |
785 desc = Object.getOwnPropertyDescriptor(obj6, '15'); | 785 desc = Object.getOwnPropertyDescriptor(obj6, '15'); |
786 assertEquals(desc.value, 'foobar'); | 786 assertEquals(desc.value, 'foobar'); |
787 assertFalse(desc.writable); | 787 assertFalse(desc.writable); |
788 assertFalse(desc.enumerable); | 788 assertFalse(desc.enumerable); |
789 assertFalse(desc.configurable); | 789 assertFalse(desc.configurable); |
790 | 790 |
791 // Make sure that we can't redefine using direct access. | 791 // Make sure that we can't redefine using direct access. |
792 obj6[15] ='overwrite'; | 792 obj6[15] ='overwrite'; |
793 assertEquals(obj6[15],'foobar'); | 793 assertEquals(obj6[15],'foobar'); |
794 | 794 |
795 | 795 |
796 // Repeat the above tests on an array. | 796 // Repeat the above tests on an array. |
797 var arr = new Array(); | 797 var arr = new Array(); |
798 arr[1] = 'foo'; | 798 arr[1] = 'foo'; |
799 arr[2] = 'bar'; | 799 arr[2] = 'bar'; |
800 arr[3] = '42'; | 800 arr[3] = '42'; |
801 arr[4] = '43'; | 801 arr[4] = '43'; |
802 arr[5] = '44'; | 802 arr[5] = '44'; |
803 | 803 |
804 var descElement = { value: 'foobar' }; | 804 var descElement = { value: 'foobar' }; |
805 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; | 805 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; |
806 var descElementNonWritable = { value: 'foofoo', writable: false }; | 806 var descElementNonWritable = { value: 'foofoo', writable: false }; |
807 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; | 807 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; |
808 var descElementAllFalse = { value: 'foofalse', | 808 var descElementAllFalse = { value: 'foofalse', |
809 configurable: false, | 809 configurable: false, |
810 writable: false, | 810 writable: false, |
811 enumerable: false }; | 811 enumerable: false }; |
812 | 812 |
813 | 813 |
814 // Redefine existing property. | 814 // Redefine existing property. |
815 Object.defineProperty(arr, '1', descElement); | 815 Object.defineProperty(arr, '1', descElement); |
816 desc = Object.getOwnPropertyDescriptor(arr, '1'); | 816 desc = Object.getOwnPropertyDescriptor(arr, '1'); |
817 assertEquals(desc.value, 'foobar'); | 817 assertEquals(desc.value, 'foobar'); |
818 assertTrue(desc.writable); | 818 assertTrue(desc.writable); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 assertEquals(undefined, o.x); | 891 assertEquals(undefined, o.x); |
892 o.x = 37; | 892 o.x = 37; |
893 assertEquals(undefined, o.x); | 893 assertEquals(undefined, o.x); |
894 | 894 |
895 // Ignore inherited properties. | 895 // Ignore inherited properties. |
896 o = { __proto__ : { x : 87 } }; | 896 o = { __proto__ : { x : 87 } }; |
897 Object.defineProperty(o, "x", { writable: false }); | 897 Object.defineProperty(o, "x", { writable: false }); |
898 assertEquals(undefined, o.x); | 898 assertEquals(undefined, o.x); |
899 o.x = 37; | 899 o.x = 37; |
900 assertEquals(undefined, o.x); | 900 assertEquals(undefined, o.x); |
901 | |
OLD | NEW |