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