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