| 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 12 matching lines...) Expand all Loading... |
| 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 // Tests the object.defineProperty method - ES 15.2.3.6 | 28 // Tests the object.defineProperty method - ES 15.2.3.6 |
| 29 | 29 |
| 30 // Flags: --allow-natives-syntax | 30 // Flags: --allow-natives-syntax |
| 31 | 31 |
| 32 // Check that an exception is thrown when null is passed as object. | 32 // Check that an exception is thrown when null is passed as object. |
| 33 var exception = false; |
| 33 try { | 34 try { |
| 34 Object.defineProperty(null, null, null); | 35 Object.defineProperty(null, null, null); |
| 35 assertTrue(false); | |
| 36 } catch (e) { | 36 } catch (e) { |
| 37 exception = true; |
| 37 assertTrue(/called on non-object/.test(e)); | 38 assertTrue(/called on non-object/.test(e)); |
| 38 } | 39 } |
| 40 assertTrue(exception); |
| 39 | 41 |
| 40 // Check that an exception is thrown when undefined is passed as object. | 42 // Check that an exception is thrown when undefined is passed as object. |
| 43 exception = false; |
| 41 try { | 44 try { |
| 42 Object.defineProperty(undefined, undefined, undefined); | 45 Object.defineProperty(undefined, undefined, undefined); |
| 43 assertTrue(false); | |
| 44 } catch (e) { | 46 } catch (e) { |
| 47 exception = true; |
| 45 assertTrue(/called on non-object/.test(e)); | 48 assertTrue(/called on non-object/.test(e)); |
| 46 } | 49 } |
| 50 assertTrue(exception); |
| 47 | 51 |
| 48 // Check that an exception is thrown when non-object is passed as object. | 52 // Check that an exception is thrown when non-object is passed as object. |
| 53 exception = false; |
| 49 try { | 54 try { |
| 50 Object.defineProperty(0, "foo", undefined); | 55 Object.defineProperty(0, "foo", undefined); |
| 51 assertTrue(false); | |
| 52 } catch (e) { | 56 } catch (e) { |
| 57 exception = true; |
| 53 assertTrue(/called on non-object/.test(e)); | 58 assertTrue(/called on non-object/.test(e)); |
| 54 } | 59 } |
| 60 assertTrue(exception); |
| 55 | 61 |
| 56 // Object. | 62 // Object. |
| 57 var obj1 = {}; | 63 var obj1 = {}; |
| 58 | 64 |
| 59 // Values. | 65 // Values. |
| 60 var val1 = 0; | 66 var val1 = 0; |
| 61 var val2 = 0; | 67 var val2 = 0; |
| 62 var val3 = 0; | 68 var val3 = 0; |
| 63 | 69 |
| 64 function setter1() {val1++; } | 70 function setter1() {val1++; } |
| (...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 688 | 694 |
| 689 // Make sure that we can't overwrite +0 with -0 and vice versa. | 695 // Make sure that we can't overwrite +0 with -0 and vice versa. |
| 690 var descMinusZero = {value: -0, configurable: false}; | 696 var descMinusZero = {value: -0, configurable: false}; |
| 691 var descPlusZero = {value: +0, configurable: false}; | 697 var descPlusZero = {value: +0, configurable: false}; |
| 692 | 698 |
| 693 Object.defineProperty(obj5, 'minuszero', descMinusZero); | 699 Object.defineProperty(obj5, 'minuszero', descMinusZero); |
| 694 | 700 |
| 695 // Make sure we can redefine with -0. | 701 // Make sure we can redefine with -0. |
| 696 Object.defineProperty(obj5, 'minuszero', descMinusZero); | 702 Object.defineProperty(obj5, 'minuszero', descMinusZero); |
| 697 | 703 |
| 704 exception = false; |
| 698 try { | 705 try { |
| 699 Object.defineProperty(obj5, 'minuszero', descPlusZero); | 706 Object.defineProperty(obj5, 'minuszero', descPlusZero); |
| 700 assertUnreachable(); | |
| 701 } catch (e) { | 707 } catch (e) { |
| 708 exception = true; |
| 702 assertTrue(/Cannot redefine property/.test(e)); | 709 assertTrue(/Cannot redefine property/.test(e)); |
| 703 } | 710 } |
| 711 assertTrue(exception); |
| 704 | 712 |
| 705 | 713 |
| 706 Object.defineProperty(obj5, 'pluszero', descPlusZero); | 714 Object.defineProperty(obj5, 'pluszero', descPlusZero); |
| 707 | 715 |
| 708 // Make sure we can redefine with +0. | 716 // Make sure we can redefine with +0. |
| 709 Object.defineProperty(obj5, 'pluszero', descPlusZero); | 717 Object.defineProperty(obj5, 'pluszero', descPlusZero); |
| 710 | 718 |
| 719 exception = false; |
| 711 try { | 720 try { |
| 712 Object.defineProperty(obj5, 'pluszero', descMinusZero); | 721 Object.defineProperty(obj5, 'pluszero', descMinusZero); |
| 713 assertUnreachable(); | |
| 714 } catch (e) { | 722 } catch (e) { |
| 723 exception = true; |
| 715 assertTrue(/Cannot redefine property/.test(e)); | 724 assertTrue(/Cannot redefine property/.test(e)); |
| 716 } | 725 } |
| 726 assertTrue(exception); |
| 717 | 727 |
| 718 | 728 |
| 719 var obj6 = {}; | 729 var obj6 = {}; |
| 720 obj6[1] = 'foo'; | 730 obj6[1] = 'foo'; |
| 721 obj6[2] = 'bar'; | 731 obj6[2] = 'bar'; |
| 722 obj6[3] = '42'; | 732 obj6[3] = '42'; |
| 723 obj6[4] = '43'; | 733 obj6[4] = '43'; |
| 724 obj6[5] = '44'; | 734 obj6[5] = '44'; |
| 725 | 735 |
| 726 var descElement = { value: 'foobar' }; | 736 var descElement = { value: 'foobar' }; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 754 try { | 764 try { |
| 755 Object.defineProperty(obj6, '2', descElement); | 765 Object.defineProperty(obj6, '2', descElement); |
| 756 desc = Object.getOwnPropertyDescriptor(obj6, '2'); | 766 desc = Object.getOwnPropertyDescriptor(obj6, '2'); |
| 757 assertEquals(desc.value, 'foobar'); | 767 assertEquals(desc.value, 'foobar'); |
| 758 } catch (e) { | 768 } catch (e) { |
| 759 assertUnreachable(); | 769 assertUnreachable(); |
| 760 } | 770 } |
| 761 | 771 |
| 762 // Ensure that we can't change the descriptor of a | 772 // Ensure that we can't change the descriptor of a |
| 763 // non configurable property. | 773 // non configurable property. |
| 774 exception = false; |
| 764 try { | 775 try { |
| 765 var descAccessor = { get: function() { return 0; } }; | 776 var descAccessor = { get: function() { return 0; } }; |
| 766 Object.defineProperty(obj6, '2', descAccessor); | 777 Object.defineProperty(obj6, '2', descAccessor); |
| 767 assertUnreachable(); | |
| 768 } catch (e) { | 778 } catch (e) { |
| 779 exception = true; |
| 769 assertTrue(/Cannot redefine property/.test(e)); | 780 assertTrue(/Cannot redefine property/.test(e)); |
| 770 } | 781 } |
| 782 assertTrue(exception); |
| 771 | 783 |
| 772 Object.defineProperty(obj6, '2', descElementNonWritable); | 784 Object.defineProperty(obj6, '2', descElementNonWritable); |
| 773 desc = Object.getOwnPropertyDescriptor(obj6, '2'); | 785 desc = Object.getOwnPropertyDescriptor(obj6, '2'); |
| 774 assertEquals(desc.value, 'foofoo'); | 786 assertEquals(desc.value, 'foofoo'); |
| 775 assertFalse(desc.writable); | 787 assertFalse(desc.writable); |
| 776 assertTrue(desc.enumerable); | 788 assertTrue(desc.enumerable); |
| 777 assertFalse(desc.configurable); | 789 assertFalse(desc.configurable); |
| 778 | 790 |
| 779 Object.defineProperty(obj6, '3', descElementNonWritable); | 791 Object.defineProperty(obj6, '3', descElementNonWritable); |
| 780 desc = Object.getOwnPropertyDescriptor(obj6, '3'); | 792 desc = Object.getOwnPropertyDescriptor(obj6, '3'); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 851 try { | 863 try { |
| 852 Object.defineProperty(arr, '2', descElement); | 864 Object.defineProperty(arr, '2', descElement); |
| 853 desc = Object.getOwnPropertyDescriptor(arr, '2'); | 865 desc = Object.getOwnPropertyDescriptor(arr, '2'); |
| 854 assertEquals(desc.value, 'foobar'); | 866 assertEquals(desc.value, 'foobar'); |
| 855 } catch (e) { | 867 } catch (e) { |
| 856 assertUnreachable(); | 868 assertUnreachable(); |
| 857 } | 869 } |
| 858 | 870 |
| 859 // Ensure that we can't change the descriptor of a | 871 // Ensure that we can't change the descriptor of a |
| 860 // non configurable property. | 872 // non configurable property. |
| 873 exception = false; |
| 861 try { | 874 try { |
| 862 var descAccessor = { get: function() { return 0; } }; | 875 var descAccessor = { get: function() { return 0; } }; |
| 863 Object.defineProperty(arr, '2', descAccessor); | 876 Object.defineProperty(arr, '2', descAccessor); |
| 864 assertUnreachable(); | |
| 865 } catch (e) { | 877 } catch (e) { |
| 878 exception = true; |
| 866 assertTrue(/Cannot redefine property/.test(e)); | 879 assertTrue(/Cannot redefine property/.test(e)); |
| 867 } | 880 } |
| 881 assertTrue(exception); |
| 868 | 882 |
| 869 Object.defineProperty(arr, '2', descElementNonWritable); | 883 Object.defineProperty(arr, '2', descElementNonWritable); |
| 870 desc = Object.getOwnPropertyDescriptor(arr, '2'); | 884 desc = Object.getOwnPropertyDescriptor(arr, '2'); |
| 871 assertEquals(desc.value, 'foofoo'); | 885 assertEquals(desc.value, 'foofoo'); |
| 872 assertFalse(desc.writable); | 886 assertFalse(desc.writable); |
| 873 assertTrue(desc.enumerable); | 887 assertTrue(desc.enumerable); |
| 874 assertFalse(desc.configurable); | 888 assertFalse(desc.configurable); |
| 875 | 889 |
| 876 Object.defineProperty(arr, '3', descElementNonWritable); | 890 Object.defineProperty(arr, '3', descElementNonWritable); |
| 877 desc = Object.getOwnPropertyDescriptor(arr, '3'); | 891 desc = Object.getOwnPropertyDescriptor(arr, '3'); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1024 { enumerable : false, configurable : false }, | 1038 { enumerable : false, configurable : false }, |
| 1025 { get: getter1, set: setter1, enumerable : false, configurable : false }); | 1039 { get: getter1, set: setter1, enumerable : false, configurable : false }); |
| 1026 | 1040 |
| 1027 // redefine of set only property with generic descriptor | 1041 // redefine of set only property with generic descriptor |
| 1028 o = {}; | 1042 o = {}; |
| 1029 Object.defineProperty(o, 'p', | 1043 Object.defineProperty(o, 'p', |
| 1030 { set : setter1, enumerable: true, configurable: true }); | 1044 { set : setter1, enumerable: true, configurable: true }); |
| 1031 testDefineProperty(o, 'p', | 1045 testDefineProperty(o, 'p', |
| 1032 { enumerable : false, configurable : false }, | 1046 { enumerable : false, configurable : false }, |
| 1033 { get: undefined, set: setter1, enumerable : false, configurable : false }); | 1047 { get: undefined, set: setter1, enumerable : false, configurable : false }); |
| OLD | NEW |