| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012-2015 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 |
| 11 // with the distribution. | 11 // with the distribution. |
| 12 // * Neither the name of Google Inc. nor the names of its | 12 // * Neither the name of Google Inc. nor the names of its |
| 13 // contributors may be used to endorse or promote products derived | 13 // contributors may be used to endorse or promote products derived |
| 14 // from this software without specific prior written permission. | 14 // from this software without specific prior written permission. |
| 15 // | 15 // |
| 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 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 // Tests the object.defineProperty method - ES 15.2.3.6 | 28 // Tests the Reflect.defineProperty method - ES6 26.1.3 |
| 29 // This is adapted from mjsunit/object-define-property.js. |
| 29 | 30 |
| 30 // Flags: --allow-natives-syntax | 31 // Flags: --allow-natives-syntax --harmony-reflect |
| 32 |
| 31 | 33 |
| 32 // Check that an exception is thrown when null is passed as object. | 34 // Check that an exception is thrown when null is passed as object. |
| 33 var exception = false; | 35 var exception = false; |
| 34 try { | 36 try { |
| 35 Object.defineProperty(null, null, null); | 37 Reflect.defineProperty(null, null, null); |
| 36 } catch (e) { | 38 } catch (e) { |
| 37 exception = true; | 39 exception = true; |
| 38 assertTrue(/called on non-object/.test(e)); | 40 assertTrue(/called on non-object/.test(e)); |
| 39 } | 41 } |
| 40 assertTrue(exception); | 42 assertTrue(exception); |
| 41 | 43 |
| 42 // Check that an exception is thrown when undefined is passed as object. | 44 // Check that an exception is thrown when undefined is passed as object. |
| 43 exception = false; | 45 exception = false; |
| 44 try { | 46 try { |
| 45 Object.defineProperty(undefined, undefined, undefined); | 47 Reflect.defineProperty(undefined, undefined, undefined); |
| 46 } catch (e) { | 48 } catch (e) { |
| 47 exception = true; | 49 exception = true; |
| 48 assertTrue(/called on non-object/.test(e)); | 50 assertTrue(/called on non-object/.test(e)); |
| 49 } | 51 } |
| 50 assertTrue(exception); | 52 assertTrue(exception); |
| 51 | 53 |
| 52 // Check that an exception is thrown when non-object is passed as object. | 54 // Check that an exception is thrown when non-object is passed as object. |
| 53 exception = false; | 55 exception = false; |
| 54 try { | 56 try { |
| 55 Object.defineProperty(0, "foo", undefined); | 57 Reflect.defineProperty(0, "foo", undefined); |
| 56 } catch (e) { | 58 } catch (e) { |
| 57 exception = true; | 59 exception = true; |
| 58 assertTrue(/called on non-object/.test(e)); | 60 assertTrue(/called on non-object/.test(e)); |
| 59 } | 61 } |
| 60 assertTrue(exception); | 62 assertTrue(exception); |
| 61 | 63 |
| 62 // Object. | 64 // Object. |
| 63 var obj1 = {}; | 65 var obj1 = {}; |
| 64 | 66 |
| 65 // Values. | 67 // Values. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 var accessorDefault = {set: function(){} }; | 107 var accessorDefault = {set: function(){} }; |
| 106 | 108 |
| 107 var dataConfigurable = { value: 1000, configurable: true }; | 109 var dataConfigurable = { value: 1000, configurable: true }; |
| 108 | 110 |
| 109 var dataNoConfigurable = { value: 2000, configurable: false }; | 111 var dataNoConfigurable = { value: 2000, configurable: false }; |
| 110 | 112 |
| 111 var dataWritable = { value: 3000, writable: true}; | 113 var dataWritable = { value: 3000, writable: true}; |
| 112 | 114 |
| 113 | 115 |
| 114 // Check that we can't add property with undefined attributes. | 116 // Check that we can't add property with undefined attributes. |
| 115 try { | 117 assertThrows(function() { Reflect.defineProperty(obj1, "foo", undefined) }, |
| 116 Object.defineProperty(obj1, "foo", undefined); | 118 TypeError); |
| 117 assertTrue(false); | |
| 118 } catch (e) { | |
| 119 assertTrue(/must be an object/.test(e)); | |
| 120 } | |
| 121 | 119 |
| 122 // Make sure that we can add a property with an empty descriptor and | 120 // Make sure that we can add a property with an empty descriptor and |
| 123 // that it has the default descriptor values. | 121 // that it has the default descriptor values. |
| 124 Object.defineProperty(obj1, "foo", emptyDesc); | 122 assertTrue(Reflect.defineProperty(obj1, "foo", emptyDesc)); |
| 125 | 123 |
| 126 // foo should be undefined as it has no get, set or value | 124 // foo should be undefined as it has no get, set or value |
| 127 assertEquals(undefined, obj1.foo); | 125 assertEquals(undefined, obj1.foo); |
| 128 | 126 |
| 129 // We should, however, be able to retrieve the propertydescriptor which should | 127 // We should, however, be able to retrieve the propertydescriptor which should |
| 130 // have all default values (according to 8.6.1). | 128 // have all default values (according to 8.6.1). |
| 131 var desc = Object.getOwnPropertyDescriptor(obj1, "foo"); | 129 var desc = Object.getOwnPropertyDescriptor(obj1, "foo"); |
| 132 assertFalse(desc.configurable); | 130 assertFalse(desc.configurable); |
| 133 assertFalse(desc.enumerable); | 131 assertFalse(desc.enumerable); |
| 134 assertFalse(desc.writable); | 132 assertFalse(desc.writable); |
| 135 assertEquals(desc.get, undefined); | 133 assertEquals(desc.get, undefined); |
| 136 assertEquals(desc.set, undefined); | 134 assertEquals(desc.set, undefined); |
| 137 assertEquals(desc.value, undefined); | 135 assertEquals(desc.value, undefined); |
| 138 | 136 |
| 139 // Make sure that getOwnPropertyDescriptor does not return a descriptor | 137 // Make sure that getOwnPropertyDescriptor does not return a descriptor |
| 140 // with default values if called with non existing property (otherwise | 138 // with default values if called with non existing property (otherwise |
| 141 // the test above is invalid). | 139 // the test above is invalid). |
| 142 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); | 140 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); |
| 143 assertEquals(desc, undefined); | 141 assertEquals(desc, undefined); |
| 144 | 142 |
| 145 // Make sure that foo can't be reset (as configurable is false). | 143 // Make sure that foo can't be reset (as configurable is false). |
| 146 try { | 144 assertFalse(Reflect.defineProperty(obj1, "foo", accessorConfigurable)); |
| 147 Object.defineProperty(obj1, "foo", accessorConfigurable); | |
| 148 } catch (e) { | |
| 149 assertTrue(/Cannot redefine property/.test(e)); | |
| 150 } | |
| 151 | 145 |
| 152 | 146 |
| 153 // Accessor properties | 147 // Accessor properties |
| 154 | 148 |
| 155 Object.defineProperty(obj1, "bar", accessorConfigurable); | 149 assertTrue(Reflect.defineProperty(obj1, "bar", accessorConfigurable)); |
| 156 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); | 150 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); |
| 157 assertTrue(desc.configurable); | 151 assertTrue(desc.configurable); |
| 158 assertFalse(desc.enumerable); | 152 assertFalse(desc.enumerable); |
| 159 assertEquals(desc.writable, undefined); | 153 assertEquals(desc.writable, undefined); |
| 160 assertEquals(desc.get, accessorConfigurable.get); | 154 assertEquals(desc.get, accessorConfigurable.get); |
| 161 assertEquals(desc.set, accessorConfigurable.set); | 155 assertEquals(desc.set, accessorConfigurable.set); |
| 162 assertEquals(desc.value, undefined); | 156 assertEquals(desc.value, undefined); |
| 163 assertEquals(1, obj1.bar = 1); | 157 assertEquals(1, obj1.bar = 1); |
| 164 assertEquals(1, val1); | 158 assertEquals(1, val1); |
| 165 assertEquals(1, obj1.bar = 1); | 159 assertEquals(1, obj1.bar = 1); |
| 166 assertEquals(2, val1); | 160 assertEquals(2, val1); |
| 167 assertEquals(2, obj1.bar); | 161 assertEquals(2, obj1.bar); |
| 168 | 162 |
| 169 // Redefine bar with non configurable test | 163 // Redefine bar with non configurable test |
| 170 Object.defineProperty(obj1, "bar", accessorNoConfigurable); | 164 assertTrue(Reflect.defineProperty(obj1, "bar", accessorNoConfigurable)); |
| 171 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); | 165 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); |
| 172 assertFalse(desc.configurable); | 166 assertFalse(desc.configurable); |
| 173 assertFalse(desc.enumerable); | 167 assertFalse(desc.enumerable); |
| 174 assertEquals(desc.writable, undefined); | 168 assertEquals(desc.writable, undefined); |
| 175 assertEquals(desc.get, accessorNoConfigurable.get); | 169 assertEquals(desc.get, accessorNoConfigurable.get); |
| 176 assertEquals(desc.set, accessorNoConfigurable.set); | 170 assertEquals(desc.set, accessorNoConfigurable.set); |
| 177 assertEquals(desc.value, undefined); | 171 assertEquals(desc.value, undefined); |
| 178 assertEquals(1, obj1.bar = 1); | 172 assertEquals(1, obj1.bar = 1); |
| 179 assertEquals(2, val1); | 173 assertEquals(2, val1); |
| 180 assertEquals(1, val2); | 174 assertEquals(1, val2); |
| 181 assertEquals(1, obj1.bar = 1) | 175 assertEquals(1, obj1.bar = 1) |
| 182 assertEquals(2, val1); | 176 assertEquals(2, val1); |
| 183 assertEquals(2, val2); | 177 assertEquals(2, val2); |
| 184 assertEquals(2, obj1.bar); | 178 assertEquals(2, obj1.bar); |
| 185 | 179 |
| 186 // Try to redefine bar again - should fail as configurable is false. | 180 // Try to redefine bar again - should fail as configurable is false. |
| 187 try { | 181 assertFalse(Reflect.defineProperty(obj1, "bar", accessorConfigurable)); |
| 188 Object.defineProperty(obj1, "bar", accessorConfigurable); | |
| 189 assertTrue(false); | |
| 190 } catch(e) { | |
| 191 assertTrue(/Cannot redefine property/.test(e)); | |
| 192 } | |
| 193 | 182 |
| 194 // Try to redefine bar again using the data descriptor - should fail. | 183 // Try to redefine bar again using the data descriptor - should fail. |
| 195 try { | 184 assertFalse(Reflect.defineProperty(obj1, "bar", dataConfigurable)); |
| 196 Object.defineProperty(obj1, "bar", dataConfigurable); | |
| 197 assertTrue(false); | |
| 198 } catch(e) { | |
| 199 assertTrue(/Cannot redefine property/.test(e)); | |
| 200 } | |
| 201 | 185 |
| 202 // Redefine using same descriptor - should succeed. | 186 // Redefine using same descriptor - should succeed. |
| 203 Object.defineProperty(obj1, "bar", accessorNoConfigurable); | 187 assertTrue(Reflect.defineProperty(obj1, "bar", accessorNoConfigurable)); |
| 204 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); | 188 desc = Object.getOwnPropertyDescriptor(obj1, "bar"); |
| 205 assertFalse(desc.configurable); | 189 assertFalse(desc.configurable); |
| 206 assertFalse(desc.enumerable); | 190 assertFalse(desc.enumerable); |
| 207 assertEquals(desc.writable, undefined); | 191 assertEquals(desc.writable, undefined); |
| 208 assertEquals(desc.get, accessorNoConfigurable.get); | 192 assertEquals(desc.get, accessorNoConfigurable.get); |
| 209 assertEquals(desc.set, accessorNoConfigurable.set); | 193 assertEquals(desc.set, accessorNoConfigurable.set); |
| 210 assertEquals(desc.value, undefined); | 194 assertEquals(desc.value, undefined); |
| 211 assertEquals(1, obj1.bar = 1); | 195 assertEquals(1, obj1.bar = 1); |
| 212 assertEquals(2, val1); | 196 assertEquals(2, val1); |
| 213 assertEquals(3, val2); | 197 assertEquals(3, val2); |
| 214 assertEquals(1, obj1.bar = 1) | 198 assertEquals(1, obj1.bar = 1) |
| 215 assertEquals(2, val1); | 199 assertEquals(2, val1); |
| 216 assertEquals(4, val2); | 200 assertEquals(4, val2); |
| 217 assertEquals(4, obj1.bar); | 201 assertEquals(4, obj1.bar); |
| 218 | 202 |
| 219 // Define an accessor that has only a setter. | 203 // Define an accessor that has only a setter. |
| 220 Object.defineProperty(obj1, "setOnly", accessorOnlySet); | 204 assertTrue(Reflect.defineProperty(obj1, "setOnly", accessorOnlySet)); |
| 221 desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); | 205 desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); |
| 222 assertTrue(desc.configurable); | 206 assertTrue(desc.configurable); |
| 223 assertFalse(desc.enumerable); | 207 assertFalse(desc.enumerable); |
| 224 assertEquals(desc.set, accessorOnlySet.set); | 208 assertEquals(desc.set, accessorOnlySet.set); |
| 225 assertEquals(desc.writable, undefined); | 209 assertEquals(desc.writable, undefined); |
| 226 assertEquals(desc.value, undefined); | 210 assertEquals(desc.value, undefined); |
| 227 assertEquals(desc.get, undefined); | 211 assertEquals(desc.get, undefined); |
| 228 assertEquals(1, obj1.setOnly = 1); | 212 assertEquals(1, obj1.setOnly = 1); |
| 229 assertEquals(1, val3); | 213 assertEquals(1, val3); |
| 230 | 214 |
| 231 // Add a getter - should not touch the setter. | 215 // Add a getter - should not touch the setter. |
| 232 Object.defineProperty(obj1, "setOnly", accessorOnlyGet); | 216 assertTrue(Reflect.defineProperty(obj1, "setOnly", accessorOnlyGet)); |
| 233 desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); | 217 desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); |
| 234 assertTrue(desc.configurable); | 218 assertTrue(desc.configurable); |
| 235 assertFalse(desc.enumerable); | 219 assertFalse(desc.enumerable); |
| 236 assertEquals(desc.get, accessorOnlyGet.get); | 220 assertEquals(desc.get, accessorOnlyGet.get); |
| 237 assertEquals(desc.set, accessorOnlySet.set); | 221 assertEquals(desc.set, accessorOnlySet.set); |
| 238 assertEquals(desc.writable, undefined); | 222 assertEquals(desc.writable, undefined); |
| 239 assertEquals(desc.value, undefined); | 223 assertEquals(desc.value, undefined); |
| 240 assertEquals(1, obj1.setOnly = 1); | 224 assertEquals(1, obj1.setOnly = 1); |
| 241 assertEquals(2, val3); | 225 assertEquals(2, val3); |
| 242 | 226 |
| 243 // The above should also work if redefining just a getter or setter on | 227 // The above should also work if redefining just a getter or setter on |
| 244 // an existing property with both a getter and a setter. | 228 // an existing property with both a getter and a setter. |
| 245 Object.defineProperty(obj1, "both", accessorConfigurable); | 229 assertTrue(Reflect.defineProperty(obj1, "both", accessorConfigurable)); |
| 246 | 230 |
| 247 Object.defineProperty(obj1, "both", accessorOnlySet); | 231 assertTrue(Reflect.defineProperty(obj1, "both", accessorOnlySet)); |
| 248 desc = Object.getOwnPropertyDescriptor(obj1, "both"); | 232 desc = Object.getOwnPropertyDescriptor(obj1, "both"); |
| 249 assertTrue(desc.configurable); | 233 assertTrue(desc.configurable); |
| 250 assertFalse(desc.enumerable); | 234 assertFalse(desc.enumerable); |
| 251 assertEquals(desc.set, accessorOnlySet.set); | 235 assertEquals(desc.set, accessorOnlySet.set); |
| 252 assertEquals(desc.get, accessorConfigurable.get); | 236 assertEquals(desc.get, accessorConfigurable.get); |
| 253 assertEquals(desc.writable, undefined); | 237 assertEquals(desc.writable, undefined); |
| 254 assertEquals(desc.value, undefined); | 238 assertEquals(desc.value, undefined); |
| 255 assertEquals(1, obj1.both = 1); | 239 assertEquals(1, obj1.both = 1); |
| 256 assertEquals(3, val3); | 240 assertEquals(3, val3); |
| 257 | 241 |
| 258 | 242 |
| 259 // Data properties | 243 // Data properties |
| 260 | 244 |
| 261 Object.defineProperty(obj1, "foobar", dataConfigurable); | 245 assertTrue(Reflect.defineProperty(obj1, "foobar", dataConfigurable)); |
| 262 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); | 246 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); |
| 263 assertEquals(obj1.foobar, 1000); | 247 assertEquals(obj1.foobar, 1000); |
| 264 assertEquals(desc.value, 1000); | 248 assertEquals(desc.value, 1000); |
| 265 assertTrue(desc.configurable); | 249 assertTrue(desc.configurable); |
| 266 assertFalse(desc.writable); | 250 assertFalse(desc.writable); |
| 267 assertFalse(desc.enumerable); | 251 assertFalse(desc.enumerable); |
| 268 assertEquals(desc.get, undefined); | 252 assertEquals(desc.get, undefined); |
| 269 assertEquals(desc.set, undefined); | 253 assertEquals(desc.set, undefined); |
| 270 //Try writing to non writable attribute - should remain 1000 | 254 //Try writing to non writable attribute - should remain 1000 |
| 271 obj1.foobar = 1001; | 255 obj1.foobar = 1001; |
| 272 assertEquals(obj1.foobar, 1000); | 256 assertEquals(obj1.foobar, 1000); |
| 273 | 257 |
| 274 | 258 |
| 275 // Redefine to writable descriptor - now writing to foobar should be allowed. | 259 // Redefine to writable descriptor - now writing to foobar should be allowed. |
| 276 Object.defineProperty(obj1, "foobar", dataWritable); | 260 assertTrue(Reflect.defineProperty(obj1, "foobar", dataWritable)); |
| 277 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); | 261 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); |
| 278 assertEquals(obj1.foobar, 3000); | 262 assertEquals(obj1.foobar, 3000); |
| 279 assertEquals(desc.value, 3000); | 263 assertEquals(desc.value, 3000); |
| 280 // Note that since dataWritable does not define configurable the configurable | 264 // Note that since dataWritable does not define configurable the configurable |
| 281 // setting from the redefined property (in this case true) is used. | 265 // setting from the redefined property (in this case true) is used. |
| 282 assertTrue(desc.configurable); | 266 assertTrue(desc.configurable); |
| 283 assertTrue(desc.writable); | 267 assertTrue(desc.writable); |
| 284 assertFalse(desc.enumerable); | 268 assertFalse(desc.enumerable); |
| 285 assertEquals(desc.get, undefined); | 269 assertEquals(desc.get, undefined); |
| 286 assertEquals(desc.set, undefined); | 270 assertEquals(desc.set, undefined); |
| 287 // Writing to the property should now be allowed | 271 // Writing to the property should now be allowed |
| 288 obj1.foobar = 1001; | 272 obj1.foobar = 1001; |
| 289 assertEquals(obj1.foobar, 1001); | 273 assertEquals(obj1.foobar, 1001); |
| 290 | 274 |
| 291 | 275 |
| 292 // Redefine with non configurable data property. | 276 // Redefine with non configurable data property. |
| 293 Object.defineProperty(obj1, "foobar", dataNoConfigurable); | 277 assertTrue(Reflect.defineProperty(obj1, "foobar", dataNoConfigurable)); |
| 294 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); | 278 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); |
| 295 assertEquals(obj1.foobar, 2000); | 279 assertEquals(obj1.foobar, 2000); |
| 296 assertEquals(desc.value, 2000); | 280 assertEquals(desc.value, 2000); |
| 297 assertFalse(desc.configurable); | 281 assertFalse(desc.configurable); |
| 298 assertTrue(desc.writable); | 282 assertTrue(desc.writable); |
| 299 assertFalse(desc.enumerable); | 283 assertFalse(desc.enumerable); |
| 300 assertEquals(desc.get, undefined); | 284 assertEquals(desc.get, undefined); |
| 301 assertEquals(desc.set, undefined); | 285 assertEquals(desc.set, undefined); |
| 302 | 286 |
| 303 // Try redefine again - shold fail because configurable is now false. | 287 // Try redefine again - shold fail because configurable is now false. |
| 304 try { | 288 assertFalse(Reflect.defineProperty(obj1, "foobar", dataConfigurable)); |
| 305 Object.defineProperty(obj1, "foobar", dataConfigurable); | |
| 306 assertTrue(false); | |
| 307 } catch (e) { | |
| 308 assertTrue(/Cannot redefine property/.test(e)); | |
| 309 } | |
| 310 | 289 |
| 311 // Try redefine again with accessor property - shold also fail. | 290 // Try redefine again with accessor property - shold also fail. |
| 312 try { | 291 assertFalse(Reflect.defineProperty(obj1, "foobar", dataConfigurable)); |
| 313 Object.defineProperty(obj1, "foobar", dataConfigurable); | |
| 314 assertTrue(false); | |
| 315 } catch (e) { | |
| 316 assertTrue(/Cannot redefine property/.test(e)); | |
| 317 } | |
| 318 | 292 |
| 319 | 293 |
| 320 // Redifine with the same descriptor - should succeed (step 6). | 294 // Redifine with the same descriptor - should succeed (step 6). |
| 321 Object.defineProperty(obj1, "foobar", dataNoConfigurable); | 295 assertTrue(Reflect.defineProperty(obj1, "foobar", dataNoConfigurable)); |
| 322 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); | 296 desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); |
| 323 assertEquals(obj1.foobar, 2000); | 297 assertEquals(obj1.foobar, 2000); |
| 324 assertEquals(desc.value, 2000); | 298 assertEquals(desc.value, 2000); |
| 325 assertFalse(desc.configurable); | 299 assertFalse(desc.configurable); |
| 326 assertTrue(desc.writable); | 300 assertTrue(desc.writable); |
| 327 assertFalse(desc.enumerable); | 301 assertFalse(desc.enumerable); |
| 328 assertEquals(desc.get, undefined); | 302 assertEquals(desc.get, undefined); |
| 329 assertEquals(desc.set, undefined); | 303 assertEquals(desc.set, undefined); |
| 330 | 304 |
| 331 | 305 |
| 332 // New object | 306 // New object |
| 333 var obj2 = {}; | 307 var obj2 = {}; |
| 334 | 308 |
| 335 // Make accessor - redefine to data | 309 // Make accessor - redefine to data |
| 336 Object.defineProperty(obj2, "foo", accessorConfigurable); | 310 assertTrue(Reflect.defineProperty(obj2, "foo", accessorConfigurable)); |
| 337 | 311 |
| 338 // Redefine to data property | 312 // Redefine to data property |
| 339 Object.defineProperty(obj2, "foo", dataConfigurable); | 313 assertTrue(Reflect.defineProperty(obj2, "foo", dataConfigurable)); |
| 340 desc = Object.getOwnPropertyDescriptor(obj2, "foo"); | 314 desc = Object.getOwnPropertyDescriptor(obj2, "foo"); |
| 341 assertEquals(obj2.foo, 1000); | 315 assertEquals(obj2.foo, 1000); |
| 342 assertEquals(desc.value, 1000); | 316 assertEquals(desc.value, 1000); |
| 343 assertTrue(desc.configurable); | 317 assertTrue(desc.configurable); |
| 344 assertFalse(desc.writable); | 318 assertFalse(desc.writable); |
| 345 assertFalse(desc.enumerable); | 319 assertFalse(desc.enumerable); |
| 346 assertEquals(desc.get, undefined); | 320 assertEquals(desc.get, undefined); |
| 347 assertEquals(desc.set, undefined); | 321 assertEquals(desc.set, undefined); |
| 348 | 322 |
| 349 | 323 |
| 350 // Redefine back to accessor | 324 // Redefine back to accessor |
| 351 Object.defineProperty(obj2, "foo", accessorConfigurable); | 325 assertTrue(Reflect.defineProperty(obj2, "foo", accessorConfigurable)); |
| 352 desc = Object.getOwnPropertyDescriptor(obj2, "foo"); | 326 desc = Object.getOwnPropertyDescriptor(obj2, "foo"); |
| 353 assertTrue(desc.configurable); | 327 assertTrue(desc.configurable); |
| 354 assertFalse(desc.enumerable); | 328 assertFalse(desc.enumerable); |
| 355 assertEquals(desc.writable, undefined); | 329 assertEquals(desc.writable, undefined); |
| 356 assertEquals(desc.get, accessorConfigurable.get); | 330 assertEquals(desc.get, accessorConfigurable.get); |
| 357 assertEquals(desc.set, accessorConfigurable.set); | 331 assertEquals(desc.set, accessorConfigurable.set); |
| 358 assertEquals(desc.value, undefined); | 332 assertEquals(desc.value, undefined); |
| 359 assertEquals(1, obj2.foo = 1); | 333 assertEquals(1, obj2.foo = 1); |
| 360 assertEquals(3, val1); | 334 assertEquals(3, val1); |
| 361 assertEquals(4, val2); | 335 assertEquals(4, val2); |
| 362 assertEquals(3, obj2.foo); | 336 assertEquals(3, obj2.foo); |
| 363 | 337 |
| 364 // Make data - redefine to accessor | 338 // Make data - redefine to accessor |
| 365 Object.defineProperty(obj2, "bar", dataConfigurable) | 339 assertTrue(Reflect.defineProperty(obj2, "bar", dataConfigurable)) |
| 366 | 340 |
| 367 // Redefine to accessor property | 341 // Redefine to accessor property |
| 368 Object.defineProperty(obj2, "bar", accessorConfigurable); | 342 assertTrue(Reflect.defineProperty(obj2, "bar", accessorConfigurable)); |
| 369 desc = Object.getOwnPropertyDescriptor(obj2, "bar"); | 343 desc = Object.getOwnPropertyDescriptor(obj2, "bar"); |
| 370 assertTrue(desc.configurable); | 344 assertTrue(desc.configurable); |
| 371 assertFalse(desc.enumerable); | 345 assertFalse(desc.enumerable); |
| 372 assertEquals(desc.writable, undefined); | 346 assertEquals(desc.writable, undefined); |
| 373 assertEquals(desc.get, accessorConfigurable.get); | 347 assertEquals(desc.get, accessorConfigurable.get); |
| 374 assertEquals(desc.set, accessorConfigurable.set); | 348 assertEquals(desc.set, accessorConfigurable.set); |
| 375 assertEquals(desc.value, undefined); | 349 assertEquals(desc.value, undefined); |
| 376 assertEquals(1, obj2.bar = 1); | 350 assertEquals(1, obj2.bar = 1); |
| 377 assertEquals(4, val1); | 351 assertEquals(4, val1); |
| 378 assertEquals(4, val2); | 352 assertEquals(4, val2); |
| 379 assertEquals(4, obj2.foo); | 353 assertEquals(4, obj2.foo); |
| 380 | 354 |
| 381 // Redefine back to data property | 355 // Redefine back to data property |
| 382 Object.defineProperty(obj2, "bar", dataConfigurable); | 356 assertTrue(Reflect.defineProperty(obj2, "bar", dataConfigurable)); |
| 383 desc = Object.getOwnPropertyDescriptor(obj2, "bar"); | 357 desc = Object.getOwnPropertyDescriptor(obj2, "bar"); |
| 384 assertEquals(obj2.bar, 1000); | 358 assertEquals(obj2.bar, 1000); |
| 385 assertEquals(desc.value, 1000); | 359 assertEquals(desc.value, 1000); |
| 386 assertTrue(desc.configurable); | 360 assertTrue(desc.configurable); |
| 387 assertFalse(desc.writable); | 361 assertFalse(desc.writable); |
| 388 assertFalse(desc.enumerable); | 362 assertFalse(desc.enumerable); |
| 389 assertEquals(desc.get, undefined); | 363 assertEquals(desc.get, undefined); |
| 390 assertEquals(desc.set, undefined); | 364 assertEquals(desc.set, undefined); |
| 391 | 365 |
| 392 | 366 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 405 assertEquals(desc.writable, undefined); | 379 assertEquals(desc.writable, undefined); |
| 406 assertEquals(desc.get, get); | 380 assertEquals(desc.get, get); |
| 407 assertEquals(desc.set, set); | 381 assertEquals(desc.set, set); |
| 408 assertEquals(desc.value, undefined); | 382 assertEquals(desc.value, undefined); |
| 409 assertEquals(1, obj3.foo = 1); | 383 assertEquals(1, obj3.foo = 1); |
| 410 assertEquals(1, obj3.x); | 384 assertEquals(1, obj3.x); |
| 411 assertEquals(1, obj3.foo); | 385 assertEquals(1, obj3.foo); |
| 412 | 386 |
| 413 // Redefine to accessor property (non configurable) - note that enumerable | 387 // Redefine to accessor property (non configurable) - note that enumerable |
| 414 // which we do not redefine should remain the same (true). | 388 // which we do not redefine should remain the same (true). |
| 415 Object.defineProperty(obj3, "foo", accessorNoConfigurable); | 389 assertTrue(Reflect.defineProperty(obj3, "foo", accessorNoConfigurable)); |
| 416 desc = Object.getOwnPropertyDescriptor(obj3, "foo"); | 390 desc = Object.getOwnPropertyDescriptor(obj3, "foo"); |
| 417 assertFalse(desc.configurable); | 391 assertFalse(desc.configurable); |
| 418 assertTrue(desc.enumerable); | 392 assertTrue(desc.enumerable); |
| 419 assertEquals(desc.writable, undefined); | 393 assertEquals(desc.writable, undefined); |
| 420 assertEquals(desc.get, accessorNoConfigurable.get); | 394 assertEquals(desc.get, accessorNoConfigurable.get); |
| 421 assertEquals(desc.set, accessorNoConfigurable.set); | 395 assertEquals(desc.set, accessorNoConfigurable.set); |
| 422 assertEquals(desc.value, undefined); | 396 assertEquals(desc.value, undefined); |
| 423 assertEquals(1, obj3.foo = 1); | 397 assertEquals(1, obj3.foo = 1); |
| 424 assertEquals(5, val2); | 398 assertEquals(5, val2); |
| 425 assertEquals(5, obj3.foo); | 399 assertEquals(5, obj3.foo); |
| 426 | 400 |
| 427 | 401 |
| 428 obj3.__defineGetter__("bar", get); | 402 obj3.__defineGetter__("bar", get); |
| 429 obj3.__defineSetter__("bar", set); | 403 obj3.__defineSetter__("bar", set); |
| 430 | 404 |
| 431 | 405 |
| 432 // Redefine back to data property | 406 // Redefine back to data property |
| 433 Object.defineProperty(obj3, "bar", dataConfigurable); | 407 assertTrue(Reflect.defineProperty(obj3, "bar", dataConfigurable)); |
| 434 desc = Object.getOwnPropertyDescriptor(obj3, "bar"); | 408 desc = Object.getOwnPropertyDescriptor(obj3, "bar"); |
| 435 assertEquals(obj3.bar, 1000); | 409 assertEquals(obj3.bar, 1000); |
| 436 assertEquals(desc.value, 1000); | 410 assertEquals(desc.value, 1000); |
| 437 assertTrue(desc.configurable); | 411 assertTrue(desc.configurable); |
| 438 assertFalse(desc.writable); | 412 assertFalse(desc.writable); |
| 439 assertTrue(desc.enumerable); | 413 assertTrue(desc.enumerable); |
| 440 assertEquals(desc.get, undefined); | 414 assertEquals(desc.get, undefined); |
| 441 assertEquals(desc.set, undefined); | 415 assertEquals(desc.set, undefined); |
| 442 | 416 |
| 443 | 417 |
| 444 var obj4 = {}; | 418 var obj4 = {}; |
| 445 var func = function (){return 42;}; | 419 var func = function (){return 42;}; |
| 446 obj4.bar = func; | 420 obj4.bar = func; |
| 447 assertEquals(42, obj4.bar()); | 421 assertEquals(42, obj4.bar()); |
| 448 | 422 |
| 449 Object.defineProperty(obj4, "bar", accessorConfigurable); | 423 assertTrue(Reflect.defineProperty(obj4, "bar", accessorConfigurable)); |
| 450 desc = Object.getOwnPropertyDescriptor(obj4, "bar"); | 424 desc = Object.getOwnPropertyDescriptor(obj4, "bar"); |
| 451 assertTrue(desc.configurable); | 425 assertTrue(desc.configurable); |
| 452 assertTrue(desc.enumerable); | 426 assertTrue(desc.enumerable); |
| 453 assertEquals(desc.writable, undefined); | 427 assertEquals(desc.writable, undefined); |
| 454 assertEquals(desc.get, accessorConfigurable.get); | 428 assertEquals(desc.get, accessorConfigurable.get); |
| 455 assertEquals(desc.set, accessorConfigurable.set); | 429 assertEquals(desc.set, accessorConfigurable.set); |
| 456 assertEquals(desc.value, undefined); | 430 assertEquals(desc.value, undefined); |
| 457 assertEquals(1, obj4.bar = 1); | 431 assertEquals(1, obj4.bar = 1); |
| 458 assertEquals(5, val1); | 432 assertEquals(5, val1); |
| 459 assertEquals(5, obj4.bar); | 433 assertEquals(5, obj4.bar); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 assertTrue(/illegal access/.test(e)); | 488 assertTrue(/illegal access/.test(e)); |
| 515 } | 489 } |
| 516 | 490 |
| 517 // Test that all possible differences in step 6 in DefineOwnProperty are | 491 // Test that all possible differences in step 6 in DefineOwnProperty are |
| 518 // exercised, i.e., any difference in the given property descriptor and the | 492 // exercised, i.e., any difference in the given property descriptor and the |
| 519 // existing properties should not return true, but throw an error if the | 493 // existing properties should not return true, but throw an error if the |
| 520 // existing configurable property is false. | 494 // existing configurable property is false. |
| 521 | 495 |
| 522 var obj5 = {}; | 496 var obj5 = {}; |
| 523 // Enumerable will default to false. | 497 // Enumerable will default to false. |
| 524 Object.defineProperty(obj5, 'foo', accessorNoConfigurable); | 498 assertTrue(Reflect.defineProperty(obj5, 'foo', accessorNoConfigurable)); |
| 525 desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); | 499 desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); |
| 526 // First, test that we are actually allowed to set the accessor if all | 500 // First, test that we are actually allowed to set the accessor if all |
| 527 // values are of the descriptor are the same as the existing one. | 501 // values are of the descriptor are the same as the existing one. |
| 528 Object.defineProperty(obj5, 'foo', accessorNoConfigurable); | 502 assertTrue(Reflect.defineProperty(obj5, 'foo', accessorNoConfigurable)); |
| 529 | 503 |
| 530 // Different setter. | 504 // Different setter. |
| 531 var descDifferent = { | 505 var descDifferent = { |
| 532 configurable:false, | 506 configurable:false, |
| 533 enumerable:false, | 507 enumerable:false, |
| 534 set: setter1, | 508 set: setter1, |
| 535 get: getter2 | 509 get: getter2 |
| 536 }; | 510 }; |
| 537 | 511 |
| 538 try { | 512 assertFalse(Reflect.defineProperty(obj5, 'foo', descDifferent)); |
| 539 Object.defineProperty(obj5, 'foo', descDifferent); | |
| 540 assertTrue(false); | |
| 541 } catch (e) { | |
| 542 assertTrue(/Cannot redefine property/.test(e)); | |
| 543 } | |
| 544 | 513 |
| 545 // Different getter. | 514 // Different getter. |
| 546 descDifferent = { | 515 descDifferent = { |
| 547 configurable:false, | 516 configurable:false, |
| 548 enumerable:false, | 517 enumerable:false, |
| 549 set: setter2, | 518 set: setter2, |
| 550 get: getter1 | 519 get: getter1 |
| 551 }; | 520 }; |
| 552 | 521 |
| 553 try { | 522 assertFalse(Reflect.defineProperty(obj5, 'foo', descDifferent)); |
| 554 Object.defineProperty(obj5, 'foo', descDifferent); | |
| 555 assertTrue(false); | |
| 556 } catch (e) { | |
| 557 assertTrue(/Cannot redefine property/.test(e)); | |
| 558 } | |
| 559 | 523 |
| 560 // Different enumerable. | 524 // Different enumerable. |
| 561 descDifferent = { | 525 descDifferent = { |
| 562 configurable:false, | 526 configurable:false, |
| 563 enumerable:true, | 527 enumerable:true, |
| 564 set: setter2, | 528 set: setter2, |
| 565 get: getter2 | 529 get: getter2 |
| 566 }; | 530 }; |
| 567 | 531 |
| 568 try { | 532 assertFalse(Reflect.defineProperty(obj5, 'foo', descDifferent)); |
| 569 Object.defineProperty(obj5, 'foo', descDifferent); | |
| 570 assertTrue(false); | |
| 571 } catch (e) { | |
| 572 assertTrue(/Cannot redefine property/.test(e)); | |
| 573 } | |
| 574 | 533 |
| 575 // Different configurable. | 534 // Different configurable. |
| 576 descDifferent = { | 535 descDifferent = { |
| 577 configurable:false, | 536 configurable:false, |
| 578 enumerable:true, | 537 enumerable:true, |
| 579 set: setter2, | 538 set: setter2, |
| 580 get: getter2 | 539 get: getter2 |
| 581 }; | 540 }; |
| 582 | 541 |
| 583 try { | 542 assertFalse(Reflect.defineProperty(obj5, 'foo', descDifferent)); |
| 584 Object.defineProperty(obj5, 'foo', descDifferent); | |
| 585 assertTrue(false); | |
| 586 } catch (e) { | |
| 587 assertTrue(/Cannot redefine property/.test(e)); | |
| 588 } | |
| 589 | 543 |
| 590 // No difference. | 544 // No difference. |
| 591 descDifferent = { | 545 descDifferent = { |
| 592 configurable:false, | 546 configurable:false, |
| 593 enumerable:false, | 547 enumerable:false, |
| 594 set: setter2, | 548 set: setter2, |
| 595 get: getter2 | 549 get: getter2 |
| 596 }; | 550 }; |
| 597 // Make sure we can still redefine if all properties are the same. | 551 // Make sure we can still redefine if all properties are the same. |
| 598 Object.defineProperty(obj5, 'foo', descDifferent); | 552 assertTrue(Reflect.defineProperty(obj5, 'foo', descDifferent)); |
| 599 | 553 |
| 600 // Make sure that obj5 still holds the original values. | 554 // Make sure that obj5 still holds the original values. |
| 601 desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); | 555 desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); |
| 602 assertEquals(desc.get, getter2); | 556 assertEquals(desc.get, getter2); |
| 603 assertEquals(desc.set, setter2); | 557 assertEquals(desc.set, setter2); |
| 604 assertFalse(desc.enumerable); | 558 assertFalse(desc.enumerable); |
| 605 assertFalse(desc.configurable); | 559 assertFalse(desc.configurable); |
| 606 | 560 |
| 607 | 561 |
| 608 // Also exercise step 6 on data property, writable and enumerable | 562 // Also exercise step 6 on data property, writable and enumerable |
| 609 // defaults to false. | 563 // defaults to false. |
| 610 Object.defineProperty(obj5, 'bar', dataNoConfigurable); | 564 assertTrue(Reflect.defineProperty(obj5, 'bar', dataNoConfigurable)); |
| 611 | 565 |
| 612 // Test that redefinition with the same property descriptor is possible | 566 // Test that redefinition with the same property descriptor is possible |
| 613 Object.defineProperty(obj5, 'bar', dataNoConfigurable); | 567 assertTrue(Reflect.defineProperty(obj5, 'bar', dataNoConfigurable)); |
| 614 | 568 |
| 615 // Different value. | 569 // Different value. |
| 616 descDifferent = { | 570 descDifferent = { |
| 617 configurable:false, | 571 configurable:false, |
| 618 enumerable:false, | 572 enumerable:false, |
| 619 writable: false, | 573 writable: false, |
| 620 value: 1999 | 574 value: 1999 |
| 621 }; | 575 }; |
| 622 | 576 |
| 623 try { | 577 assertFalse(Reflect.defineProperty(obj5, 'bar', descDifferent)); |
| 624 Object.defineProperty(obj5, 'bar', descDifferent); | |
| 625 assertTrue(false); | |
| 626 } catch (e) { | |
| 627 assertTrue(/Cannot redefine property/.test(e)); | |
| 628 } | |
| 629 | 578 |
| 630 // Different writable. | 579 // Different writable. |
| 631 descDifferent = { | 580 descDifferent = { |
| 632 configurable:false, | 581 configurable:false, |
| 633 enumerable:false, | 582 enumerable:false, |
| 634 writable: true, | 583 writable: true, |
| 635 value: 2000 | 584 value: 2000 |
| 636 }; | 585 }; |
| 637 | 586 |
| 638 try { | 587 assertFalse(Reflect.defineProperty(obj5, 'bar', descDifferent)); |
| 639 Object.defineProperty(obj5, 'bar', descDifferent); | |
| 640 assertTrue(false); | |
| 641 } catch (e) { | |
| 642 assertTrue(/Cannot redefine property/.test(e)); | |
| 643 } | |
| 644 | 588 |
| 645 | 589 |
| 646 // Different enumerable. | 590 // Different enumerable. |
| 647 descDifferent = { | 591 descDifferent = { |
| 648 configurable:false, | 592 configurable:false, |
| 649 enumerable:true , | 593 enumerable:true , |
| 650 writable:false, | 594 writable:false, |
| 651 value: 2000 | 595 value: 2000 |
| 652 }; | 596 }; |
| 653 | 597 |
| 654 try { | 598 assertFalse(Reflect.defineProperty(obj5, 'bar', descDifferent)); |
| 655 Object.defineProperty(obj5, 'bar', descDifferent); | |
| 656 assertTrue(false); | |
| 657 } catch (e) { | |
| 658 assertTrue(/Cannot redefine property/.test(e)); | |
| 659 } | |
| 660 | 599 |
| 661 | 600 |
| 662 // Different configurable. | 601 // Different configurable. |
| 663 descDifferent = { | 602 descDifferent = { |
| 664 configurable:true, | 603 configurable:true, |
| 665 enumerable:false, | 604 enumerable:false, |
| 666 writable:false, | 605 writable:false, |
| 667 value: 2000 | 606 value: 2000 |
| 668 }; | 607 }; |
| 669 | 608 |
| 670 try { | 609 assertFalse(Reflect.defineProperty(obj5, 'bar', descDifferent)); |
| 671 Object.defineProperty(obj5, 'bar', descDifferent); | |
| 672 assertTrue(false); | |
| 673 } catch (e) { | |
| 674 assertTrue(/Cannot redefine property/.test(e)); | |
| 675 } | |
| 676 | 610 |
| 677 // No difference. | 611 // No difference. |
| 678 descDifferent = { | 612 descDifferent = { |
| 679 configurable:false, | 613 configurable:false, |
| 680 enumerable:false, | 614 enumerable:false, |
| 681 writable:false, | 615 writable:false, |
| 682 value:2000 | 616 value:2000 |
| 683 }; | 617 }; |
| 684 // Make sure we can still redefine if all properties are the same. | 618 // Make sure we can still redefine if all properties are the same. |
| 685 Object.defineProperty(obj5, 'bar', descDifferent); | 619 assertTrue(Reflect.defineProperty(obj5, 'bar', descDifferent)); |
| 686 | 620 |
| 687 // Make sure that obj5 still holds the original values. | 621 // Make sure that obj5 still holds the original values. |
| 688 desc = Object.getOwnPropertyDescriptor(obj5, 'bar'); | 622 desc = Object.getOwnPropertyDescriptor(obj5, 'bar'); |
| 689 assertEquals(desc.value, 2000); | 623 assertEquals(desc.value, 2000); |
| 690 assertFalse(desc.writable); | 624 assertFalse(desc.writable); |
| 691 assertFalse(desc.enumerable); | 625 assertFalse(desc.enumerable); |
| 692 assertFalse(desc.configurable); | 626 assertFalse(desc.configurable); |
| 693 | 627 |
| 694 | 628 |
| 695 // Make sure that we can't overwrite +0 with -0 and vice versa. | 629 // Make sure that we can't overwrite +0 with -0 and vice versa. |
| 696 var descMinusZero = {value: -0, configurable: false}; | 630 var descMinusZero = {value: -0, configurable: false}; |
| 697 var descPlusZero = {value: +0, configurable: false}; | 631 var descPlusZero = {value: +0, configurable: false}; |
| 698 | 632 |
| 699 Object.defineProperty(obj5, 'minuszero', descMinusZero); | 633 assertTrue(Reflect.defineProperty(obj5, 'minuszero', descMinusZero)); |
| 700 | 634 |
| 701 // Make sure we can redefine with -0. | 635 // Make sure we can redefine with -0. |
| 702 Object.defineProperty(obj5, 'minuszero', descMinusZero); | 636 assertTrue(Reflect.defineProperty(obj5, 'minuszero', descMinusZero)); |
| 703 | 637 |
| 704 exception = false; | 638 assertFalse(Reflect.defineProperty(obj5, 'minuszero', descPlusZero)); |
| 705 try { | |
| 706 Object.defineProperty(obj5, 'minuszero', descPlusZero); | |
| 707 } catch (e) { | |
| 708 exception = true; | |
| 709 assertTrue(/Cannot redefine property/.test(e)); | |
| 710 } | |
| 711 assertTrue(exception); | |
| 712 | 639 |
| 713 | 640 |
| 714 Object.defineProperty(obj5, 'pluszero', descPlusZero); | 641 assertTrue(Reflect.defineProperty(obj5, 'pluszero', descPlusZero)); |
| 715 | 642 |
| 716 // Make sure we can redefine with +0. | 643 // Make sure we can redefine with +0. |
| 717 Object.defineProperty(obj5, 'pluszero', descPlusZero); | 644 assertTrue(Reflect.defineProperty(obj5, 'pluszero', descPlusZero)); |
| 718 | 645 |
| 719 exception = false; | 646 assertFalse(Reflect.defineProperty(obj5, 'pluszero', descMinusZero)); |
| 720 try { | |
| 721 Object.defineProperty(obj5, 'pluszero', descMinusZero); | |
| 722 } catch (e) { | |
| 723 exception = true; | |
| 724 assertTrue(/Cannot redefine property/.test(e)); | |
| 725 } | |
| 726 assertTrue(exception); | |
| 727 | 647 |
| 728 | 648 |
| 729 var obj6 = {}; | 649 var obj6 = {}; |
| 730 obj6[1] = 'foo'; | 650 obj6[1] = 'foo'; |
| 731 obj6[2] = 'bar'; | 651 obj6[2] = 'bar'; |
| 732 obj6[3] = '42'; | 652 obj6[3] = '42'; |
| 733 obj6[4] = '43'; | 653 obj6[4] = '43'; |
| 734 obj6[5] = '44'; | 654 obj6[5] = '44'; |
| 735 | 655 |
| 736 var descElement = { value: 'foobar' }; | 656 var descElement = { value: 'foobar' }; |
| 737 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; | 657 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; |
| 738 var descElementNonWritable = { value: 'foofoo', writable: false }; | 658 var descElementNonWritable = { value: 'foofoo', writable: false }; |
| 739 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; | 659 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; |
| 740 var descElementAllFalse = { value: 'foofalse', | 660 var descElementAllFalse = { value: 'foofalse', |
| 741 configurable: false, | 661 configurable: false, |
| 742 writable: false, | 662 writable: false, |
| 743 enumerable: false }; | 663 enumerable: false }; |
| 744 | 664 |
| 745 | 665 |
| 746 // Redefine existing property. | 666 // Redefine existing property. |
| 747 Object.defineProperty(obj6, '1', descElement); | 667 assertTrue(Reflect.defineProperty(obj6, '1', descElement)); |
| 748 desc = Object.getOwnPropertyDescriptor(obj6, '1'); | 668 desc = Object.getOwnPropertyDescriptor(obj6, '1'); |
| 749 assertEquals(desc.value, 'foobar'); | 669 assertEquals(desc.value, 'foobar'); |
| 750 assertTrue(desc.writable); | 670 assertTrue(desc.writable); |
| 751 assertTrue(desc.enumerable); | 671 assertTrue(desc.enumerable); |
| 752 assertTrue(desc.configurable); | 672 assertTrue(desc.configurable); |
| 753 | 673 |
| 754 // Redefine existing property with configurable: false. | 674 // Redefine existing property with configurable: false. |
| 755 Object.defineProperty(obj6, '2', descElementNonConfigurable); | 675 assertTrue(Reflect.defineProperty(obj6, '2', descElementNonConfigurable)); |
| 756 desc = Object.getOwnPropertyDescriptor(obj6, '2'); | 676 desc = Object.getOwnPropertyDescriptor(obj6, '2'); |
| 757 assertEquals(desc.value, 'barfoo'); | 677 assertEquals(desc.value, 'barfoo'); |
| 758 assertTrue(desc.writable); | 678 assertTrue(desc.writable); |
| 759 assertTrue(desc.enumerable); | 679 assertTrue(desc.enumerable); |
| 760 assertFalse(desc.configurable); | 680 assertFalse(desc.configurable); |
| 761 | 681 |
| 762 // Can use defineProperty to change the value of a non | 682 // Can use defineProperty to change the value of a non |
| 763 // configurable property. | 683 // configurable property. |
| 764 try { | 684 try { |
| 765 Object.defineProperty(obj6, '2', descElement); | 685 assertTrue(Reflect.defineProperty(obj6, '2', descElement)); |
| 766 desc = Object.getOwnPropertyDescriptor(obj6, '2'); | 686 desc = Object.getOwnPropertyDescriptor(obj6, '2'); |
| 767 assertEquals(desc.value, 'foobar'); | 687 assertEquals(desc.value, 'foobar'); |
| 768 } catch (e) { | 688 } catch (e) { |
| 769 assertUnreachable(); | 689 assertUnreachable(); |
| 770 } | 690 } |
| 771 | 691 |
| 772 // Ensure that we can't change the descriptor of a | 692 // Ensure that we can't change the descriptor of a |
| 773 // non configurable property. | 693 // non configurable property. |
| 774 exception = false; | 694 var descAccessor = { get: function() { return 0; } }; |
| 775 try { | 695 assertFalse(Reflect.defineProperty(obj6, '2', descAccessor)); |
| 776 var descAccessor = { get: function() { return 0; } }; | |
| 777 Object.defineProperty(obj6, '2', descAccessor); | |
| 778 } catch (e) { | |
| 779 exception = true; | |
| 780 assertTrue(/Cannot redefine property/.test(e)); | |
| 781 } | |
| 782 assertTrue(exception); | |
| 783 | 696 |
| 784 Object.defineProperty(obj6, '2', descElementNonWritable); | 697 assertTrue(Reflect.defineProperty(obj6, '2', descElementNonWritable)); |
| 785 desc = Object.getOwnPropertyDescriptor(obj6, '2'); | 698 desc = Object.getOwnPropertyDescriptor(obj6, '2'); |
| 786 assertEquals(desc.value, 'foofoo'); | 699 assertEquals(desc.value, 'foofoo'); |
| 787 assertFalse(desc.writable); | 700 assertFalse(desc.writable); |
| 788 assertTrue(desc.enumerable); | 701 assertTrue(desc.enumerable); |
| 789 assertFalse(desc.configurable); | 702 assertFalse(desc.configurable); |
| 790 | 703 |
| 791 Object.defineProperty(obj6, '3', descElementNonWritable); | 704 assertTrue(Reflect.defineProperty(obj6, '3', descElementNonWritable)); |
| 792 desc = Object.getOwnPropertyDescriptor(obj6, '3'); | 705 desc = Object.getOwnPropertyDescriptor(obj6, '3'); |
| 793 assertEquals(desc.value, 'foofoo'); | 706 assertEquals(desc.value, 'foofoo'); |
| 794 assertFalse(desc.writable); | 707 assertFalse(desc.writable); |
| 795 assertTrue(desc.enumerable); | 708 assertTrue(desc.enumerable); |
| 796 assertTrue(desc.configurable); | 709 assertTrue(desc.configurable); |
| 797 | 710 |
| 798 // Redefine existing property with configurable: false. | 711 // Redefine existing property with configurable: false. |
| 799 Object.defineProperty(obj6, '4', descElementNonEnumerable); | 712 assertTrue(Reflect.defineProperty(obj6, '4', descElementNonEnumerable)); |
| 800 desc = Object.getOwnPropertyDescriptor(obj6, '4'); | 713 desc = Object.getOwnPropertyDescriptor(obj6, '4'); |
| 801 assertEquals(desc.value, 'barbar'); | 714 assertEquals(desc.value, 'barbar'); |
| 802 assertTrue(desc.writable); | 715 assertTrue(desc.writable); |
| 803 assertFalse(desc.enumerable); | 716 assertFalse(desc.enumerable); |
| 804 assertTrue(desc.configurable); | 717 assertTrue(desc.configurable); |
| 805 | 718 |
| 806 // Redefine existing property with configurable: false. | 719 // Redefine existing property with configurable: false. |
| 807 Object.defineProperty(obj6, '5', descElementAllFalse); | 720 assertTrue(Reflect.defineProperty(obj6, '5', descElementAllFalse)); |
| 808 desc = Object.getOwnPropertyDescriptor(obj6, '5'); | 721 desc = Object.getOwnPropertyDescriptor(obj6, '5'); |
| 809 assertEquals(desc.value, 'foofalse'); | 722 assertEquals(desc.value, 'foofalse'); |
| 810 assertFalse(desc.writable); | 723 assertFalse(desc.writable); |
| 811 assertFalse(desc.enumerable); | 724 assertFalse(desc.enumerable); |
| 812 assertFalse(desc.configurable); | 725 assertFalse(desc.configurable); |
| 813 | 726 |
| 814 // Define non existing property - all attributes should default to false. | 727 // Define non existing property - all attributes should default to false. |
| 815 Object.defineProperty(obj6, '15', descElement); | 728 assertTrue(Reflect.defineProperty(obj6, '15', descElement)); |
| 816 desc = Object.getOwnPropertyDescriptor(obj6, '15'); | 729 desc = Object.getOwnPropertyDescriptor(obj6, '15'); |
| 817 assertEquals(desc.value, 'foobar'); | 730 assertEquals(desc.value, 'foobar'); |
| 818 assertFalse(desc.writable); | 731 assertFalse(desc.writable); |
| 819 assertFalse(desc.enumerable); | 732 assertFalse(desc.enumerable); |
| 820 assertFalse(desc.configurable); | 733 assertFalse(desc.configurable); |
| 821 | 734 |
| 822 // Make sure that we can't redefine using direct access. | 735 // Make sure that we can't redefine using direct access. |
| 823 obj6[15] ='overwrite'; | 736 obj6[15] ='overwrite'; |
| 824 assertEquals(obj6[15],'foobar'); | 737 assertEquals(obj6[15],'foobar'); |
| 825 | 738 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 836 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; | 749 var descElementNonConfigurable = { value: 'barfoo', configurable: false }; |
| 837 var descElementNonWritable = { value: 'foofoo', writable: false }; | 750 var descElementNonWritable = { value: 'foofoo', writable: false }; |
| 838 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; | 751 var descElementNonEnumerable = { value: 'barbar', enumerable: false }; |
| 839 var descElementAllFalse = { value: 'foofalse', | 752 var descElementAllFalse = { value: 'foofalse', |
| 840 configurable: false, | 753 configurable: false, |
| 841 writable: false, | 754 writable: false, |
| 842 enumerable: false }; | 755 enumerable: false }; |
| 843 | 756 |
| 844 | 757 |
| 845 // Redefine existing property. | 758 // Redefine existing property. |
| 846 Object.defineProperty(arr, '1', descElement); | 759 assertTrue(Reflect.defineProperty(arr, '1', descElement)); |
| 847 desc = Object.getOwnPropertyDescriptor(arr, '1'); | 760 desc = Object.getOwnPropertyDescriptor(arr, '1'); |
| 848 assertEquals(desc.value, 'foobar'); | 761 assertEquals(desc.value, 'foobar'); |
| 849 assertTrue(desc.writable); | 762 assertTrue(desc.writable); |
| 850 assertTrue(desc.enumerable); | 763 assertTrue(desc.enumerable); |
| 851 assertTrue(desc.configurable); | 764 assertTrue(desc.configurable); |
| 852 | 765 |
| 853 // Redefine existing property with configurable: false. | 766 // Redefine existing property with configurable: false. |
| 854 Object.defineProperty(arr, '2', descElementNonConfigurable); | 767 assertTrue(Reflect.defineProperty(arr, '2', descElementNonConfigurable)); |
| 855 desc = Object.getOwnPropertyDescriptor(arr, '2'); | 768 desc = Object.getOwnPropertyDescriptor(arr, '2'); |
| 856 assertEquals(desc.value, 'barfoo'); | 769 assertEquals(desc.value, 'barfoo'); |
| 857 assertTrue(desc.writable); | 770 assertTrue(desc.writable); |
| 858 assertTrue(desc.enumerable); | 771 assertTrue(desc.enumerable); |
| 859 assertFalse(desc.configurable); | 772 assertFalse(desc.configurable); |
| 860 | 773 |
| 861 // Can use defineProperty to change the value of a non | 774 // Can use defineProperty to change the value of a non |
| 862 // configurable property of an array. | 775 // configurable property of an array. |
| 863 try { | 776 try { |
| 864 Object.defineProperty(arr, '2', descElement); | 777 assertTrue(Reflect.defineProperty(arr, '2', descElement)); |
| 865 desc = Object.getOwnPropertyDescriptor(arr, '2'); | 778 desc = Object.getOwnPropertyDescriptor(arr, '2'); |
| 866 assertEquals(desc.value, 'foobar'); | 779 assertEquals(desc.value, 'foobar'); |
| 867 } catch (e) { | 780 } catch (e) { |
| 868 assertUnreachable(); | 781 assertUnreachable(); |
| 869 } | 782 } |
| 870 | 783 |
| 871 // Ensure that we can't change the descriptor of a | 784 // Ensure that we can't change the descriptor of a |
| 872 // non configurable property. | 785 // non configurable property. |
| 873 exception = false; | 786 var descAccessor = { get: function() { return 0; } }; |
| 874 try { | 787 assertFalse(Reflect.defineProperty(arr, '2', descAccessor)); |
| 875 var descAccessor = { get: function() { return 0; } }; | |
| 876 Object.defineProperty(arr, '2', descAccessor); | |
| 877 } catch (e) { | |
| 878 exception = true; | |
| 879 assertTrue(/Cannot redefine property/.test(e)); | |
| 880 } | |
| 881 assertTrue(exception); | |
| 882 | 788 |
| 883 Object.defineProperty(arr, '2', descElementNonWritable); | 789 assertTrue(Reflect.defineProperty(arr, '2', descElementNonWritable)); |
| 884 desc = Object.getOwnPropertyDescriptor(arr, '2'); | 790 desc = Object.getOwnPropertyDescriptor(arr, '2'); |
| 885 assertEquals(desc.value, 'foofoo'); | 791 assertEquals(desc.value, 'foofoo'); |
| 886 assertFalse(desc.writable); | 792 assertFalse(desc.writable); |
| 887 assertTrue(desc.enumerable); | 793 assertTrue(desc.enumerable); |
| 888 assertFalse(desc.configurable); | 794 assertFalse(desc.configurable); |
| 889 | 795 |
| 890 Object.defineProperty(arr, '3', descElementNonWritable); | 796 assertTrue(Reflect.defineProperty(arr, '3', descElementNonWritable)); |
| 891 desc = Object.getOwnPropertyDescriptor(arr, '3'); | 797 desc = Object.getOwnPropertyDescriptor(arr, '3'); |
| 892 assertEquals(desc.value, 'foofoo'); | 798 assertEquals(desc.value, 'foofoo'); |
| 893 assertFalse(desc.writable); | 799 assertFalse(desc.writable); |
| 894 assertTrue(desc.enumerable); | 800 assertTrue(desc.enumerable); |
| 895 assertTrue(desc.configurable); | 801 assertTrue(desc.configurable); |
| 896 | 802 |
| 897 // Redefine existing property with configurable: false. | 803 // Redefine existing property with configurable: false. |
| 898 Object.defineProperty(arr, '4', descElementNonEnumerable); | 804 assertTrue(Reflect.defineProperty(arr, '4', descElementNonEnumerable)); |
| 899 desc = Object.getOwnPropertyDescriptor(arr, '4'); | 805 desc = Object.getOwnPropertyDescriptor(arr, '4'); |
| 900 assertEquals(desc.value, 'barbar'); | 806 assertEquals(desc.value, 'barbar'); |
| 901 assertTrue(desc.writable); | 807 assertTrue(desc.writable); |
| 902 assertFalse(desc.enumerable); | 808 assertFalse(desc.enumerable); |
| 903 assertTrue(desc.configurable); | 809 assertTrue(desc.configurable); |
| 904 | 810 |
| 905 // Redefine existing property with configurable: false. | 811 // Redefine existing property with configurable: false. |
| 906 Object.defineProperty(arr, '5', descElementAllFalse); | 812 assertTrue(Reflect.defineProperty(arr, '5', descElementAllFalse)); |
| 907 desc = Object.getOwnPropertyDescriptor(arr, '5'); | 813 desc = Object.getOwnPropertyDescriptor(arr, '5'); |
| 908 assertEquals(desc.value, 'foofalse'); | 814 assertEquals(desc.value, 'foofalse'); |
| 909 assertFalse(desc.writable); | 815 assertFalse(desc.writable); |
| 910 assertFalse(desc.enumerable); | 816 assertFalse(desc.enumerable); |
| 911 assertFalse(desc.configurable); | 817 assertFalse(desc.configurable); |
| 912 | 818 |
| 913 // Define non existing property - all attributes should default to false. | 819 // Define non existing property - all attributes should default to false. |
| 914 Object.defineProperty(arr, '15', descElement); | 820 assertTrue(Reflect.defineProperty(arr, '15', descElement)); |
| 915 desc = Object.getOwnPropertyDescriptor(arr, '15'); | 821 desc = Object.getOwnPropertyDescriptor(arr, '15'); |
| 916 assertEquals(desc.value, 'foobar'); | 822 assertEquals(desc.value, 'foobar'); |
| 917 assertFalse(desc.writable); | 823 assertFalse(desc.writable); |
| 918 assertFalse(desc.enumerable); | 824 assertFalse(desc.enumerable); |
| 919 assertFalse(desc.configurable); | 825 assertFalse(desc.configurable); |
| 920 | 826 |
| 921 // Define non-array property, check that .length is unaffected. | 827 // Define non-array property, check that .length is unaffected. |
| 922 assertEquals(16, arr.length); | 828 assertEquals(16, arr.length); |
| 923 Object.defineProperty(arr, '0x20', descElement); | 829 assertTrue(Reflect.defineProperty(arr, '0x20', descElement)); |
| 924 assertEquals(16, arr.length); | 830 assertEquals(16, arr.length); |
| 925 | 831 |
| 926 // See issue 968: http://code.google.com/p/v8/issues/detail?id=968 | 832 // See issue 968: http://code.google.com/p/v8/issues/detail?id=968 |
| 927 var o = { x : 42 }; | 833 var o = { x : 42 }; |
| 928 Object.defineProperty(o, "x", { writable: false }); | 834 assertTrue(Reflect.defineProperty(o, "x", { writable: false })); |
| 929 assertEquals(42, o.x); | 835 assertEquals(42, o.x); |
| 930 o.x = 37; | 836 o.x = 37; |
| 931 assertEquals(42, o.x); | 837 assertEquals(42, o.x); |
| 932 | 838 |
| 933 o = { x : 42 }; | 839 o = { x : 42 }; |
| 934 Object.defineProperty(o, "x", {}); | 840 assertTrue(Reflect.defineProperty(o, "x", {})); |
| 935 assertEquals(42, o.x); | 841 assertEquals(42, o.x); |
| 936 o.x = 37; | 842 o.x = 37; |
| 937 // Writability is preserved. | 843 // Writability is preserved. |
| 938 assertEquals(37, o.x); | 844 assertEquals(37, o.x); |
| 939 | 845 |
| 940 var o = { }; | 846 var o = { }; |
| 941 Object.defineProperty(o, "x", { writable: false }); | 847 assertTrue(Reflect.defineProperty(o, "x", { writable: false })); |
| 942 assertEquals(undefined, o.x); | 848 assertEquals(undefined, o.x); |
| 943 o.x = 37; | 849 o.x = 37; |
| 944 assertEquals(undefined, o.x); | 850 assertEquals(undefined, o.x); |
| 945 | 851 |
| 946 o = { get x() { return 87; } }; | 852 o = { get x() { return 87; } }; |
| 947 Object.defineProperty(o, "x", { writable: false }); | 853 assertTrue(Reflect.defineProperty(o, "x", { writable: false })); |
| 948 assertEquals(undefined, o.x); | 854 assertEquals(undefined, o.x); |
| 949 o.x = 37; | 855 o.x = 37; |
| 950 assertEquals(undefined, o.x); | 856 assertEquals(undefined, o.x); |
| 951 | 857 |
| 952 // Ignore inherited properties. | 858 // Ignore inherited properties. |
| 953 o = { __proto__ : { x : 87 } }; | 859 o = { __proto__ : { x : 87 } }; |
| 954 Object.defineProperty(o, "x", { writable: false }); | 860 assertTrue(Reflect.defineProperty(o, "x", { writable: false })); |
| 955 assertEquals(undefined, o.x); | 861 assertEquals(undefined, o.x); |
| 956 o.x = 37; | 862 o.x = 37; |
| 957 assertEquals(undefined, o.x); | 863 assertEquals(undefined, o.x); |
| 958 | 864 |
| 959 function testDefineProperty(obj, propertyName, desc, resultDesc) { | 865 function testDefineProperty(obj, propertyName, desc, resultDesc) { |
| 960 Object.defineProperty(obj, propertyName, desc); | 866 assertTrue(Reflect.defineProperty(obj, propertyName, desc)); |
| 961 var actualDesc = Object.getOwnPropertyDescriptor(obj, propertyName); | 867 var actualDesc = Object.getOwnPropertyDescriptor(obj, propertyName); |
| 962 assertEquals(resultDesc.enumerable, actualDesc.enumerable); | 868 assertEquals(resultDesc.enumerable, actualDesc.enumerable); |
| 963 assertEquals(resultDesc.configurable, actualDesc.configurable); | 869 assertEquals(resultDesc.configurable, actualDesc.configurable); |
| 964 if (resultDesc.hasOwnProperty('value')) { | 870 if (resultDesc.hasOwnProperty('value')) { |
| 965 assertEquals(resultDesc.value, actualDesc.value); | 871 assertEquals(resultDesc.value, actualDesc.value); |
| 966 assertEquals(resultDesc.writable, actualDesc.writable); | 872 assertEquals(resultDesc.writable, actualDesc.writable); |
| 967 assertFalse(resultDesc.hasOwnProperty('get')); | 873 assertFalse(resultDesc.hasOwnProperty('get')); |
| 968 assertFalse(resultDesc.hasOwnProperty('set')); | 874 assertFalse(resultDesc.hasOwnProperty('set')); |
| 969 } else { | 875 } else { |
| 970 assertEquals(resultDesc.get, actualDesc.get); | 876 assertEquals(resultDesc.get, actualDesc.get); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1015 { enumerable : true, configurable : false }, | 921 { enumerable : true, configurable : false }, |
| 1016 { value : 42, writable : true, enumerable : true, configurable : false }); | 922 { value : 42, writable : true, enumerable : true, configurable : false }); |
| 1017 | 923 |
| 1018 o = { p : 42 }; | 924 o = { p : 42 }; |
| 1019 testDefineProperty(o, 'p', | 925 testDefineProperty(o, 'p', |
| 1020 { enumerable : false, configurable : false }, | 926 { enumerable : false, configurable : false }, |
| 1021 { value : 42, writable : true, enumerable : false, configurable : false }); | 927 { value : 42, writable : true, enumerable : false, configurable : false }); |
| 1022 | 928 |
| 1023 // can make a writable, non-configurable field non-writable | 929 // can make a writable, non-configurable field non-writable |
| 1024 o = { p : 42 }; | 930 o = { p : 42 }; |
| 1025 Object.defineProperty(o, 'p', { configurable: false }); | 931 assertTrue(Reflect.defineProperty(o, 'p', { configurable: false })); |
| 1026 testDefineProperty(o, 'p', | 932 testDefineProperty(o, 'p', |
| 1027 { writable: false }, | 933 { writable: false }, |
| 1028 { value : 42, writable : false, enumerable : true, configurable : false }); | 934 { value : 42, writable : false, enumerable : true, configurable : false }); |
| 1029 | 935 |
| 1030 // redefine of get only property with generic descriptor | 936 // redefine of get only property with generic descriptor |
| 1031 o = {}; | 937 o = {}; |
| 1032 Object.defineProperty(o, 'p', | 938 assertTrue(Reflect.defineProperty(o, 'p', |
| 1033 { get : getter1, enumerable: true, configurable: true }); | 939 { get : getter1, enumerable: true, configurable: true })); |
| 1034 testDefineProperty(o, 'p', | 940 testDefineProperty(o, 'p', |
| 1035 { enumerable : false, configurable : false }, | 941 { enumerable : false, configurable : false }, |
| 1036 { get: getter1, set: undefined, enumerable : false, configurable : false }); | 942 { get: getter1, set: undefined, enumerable : false, configurable : false }); |
| 1037 | 943 |
| 1038 // redefine of get/set only property with generic descriptor | 944 // redefine of get/set only property with generic descriptor |
| 1039 o = {}; | 945 o = {}; |
| 1040 Object.defineProperty(o, 'p', | 946 assertTrue(Reflect.defineProperty(o, 'p', |
| 1041 { get: getter1, set: setter1, enumerable: true, configurable: true }); | 947 { get: getter1, set: setter1, enumerable: true, configurable: true })); |
| 1042 testDefineProperty(o, 'p', | 948 testDefineProperty(o, 'p', |
| 1043 { enumerable : false, configurable : false }, | 949 { enumerable : false, configurable : false }, |
| 1044 { get: getter1, set: setter1, enumerable : false, configurable : false }); | 950 { get: getter1, set: setter1, enumerable : false, configurable : false }); |
| 1045 | 951 |
| 1046 // redefine of set only property with generic descriptor | 952 // redefine of set only property with generic descriptor |
| 1047 o = {}; | 953 o = {}; |
| 1048 Object.defineProperty(o, 'p', | 954 assertTrue(Reflect.defineProperty(o, 'p', |
| 1049 { set : setter1, enumerable: true, configurable: true }); | 955 { set : setter1, enumerable: true, configurable: true })); |
| 1050 testDefineProperty(o, 'p', | 956 testDefineProperty(o, 'p', |
| 1051 { enumerable : false, configurable : false }, | 957 { enumerable : false, configurable : false }, |
| 1052 { get: undefined, set: setter1, enumerable : false, configurable : false }); | 958 { get: undefined, set: setter1, enumerable : false, configurable : false }); |
| 1053 | 959 |
| 1054 | 960 |
| 1055 // Regression test: Ensure that growing dictionaries are not ignored. | 961 // Regression test: Ensure that growing dictionaries are not ignored. |
| 1056 o = {}; | 962 o = {}; |
| 1057 for (var i = 0; i < 1000; i++) { | 963 for (var i = 0; i < 1000; i++) { |
| 1058 // Non-enumerable property forces dictionary mode. | 964 // Non-enumerable property forces dictionary mode. |
| 1059 Object.defineProperty(o, i, {value: i, enumerable: false}); | 965 assertTrue(Reflect.defineProperty(o, i, {value: i, enumerable: false})); |
| 1060 } | 966 } |
| 1061 assertEquals(999, o[999]); | 967 assertEquals(999, o[999]); |
| 1062 | 968 |
| 1063 | 969 |
| 1064 // Regression test: Bizzare behavior on non-strict arguments object. | 970 // Regression test: Bizzare behavior on non-strict arguments object. |
| 1065 // TODO(yangguo): Tests disabled, needs investigation! | 971 // TODO(yangguo): Tests disabled, needs investigation! |
| 1066 /* | 972 /* |
| 1067 (function test(arg0) { | 973 (function test(arg0) { |
| 1068 // Here arguments[0] is a fast alias on arg0. | 974 // Here arguments[0] is a fast alias on arg0. |
| 1069 Object.defineProperty(arguments, "0", { | 975 Reflect.defineProperty(arguments, "0", { |
| 1070 value:1, | 976 value:1, |
| 1071 enumerable:false | 977 enumerable:false |
| 1072 }); | 978 }); |
| 1073 // Here arguments[0] is a slow alias on arg0. | 979 // Here arguments[0] is a slow alias on arg0. |
| 1074 Object.defineProperty(arguments, "0", { | 980 Reflect.defineProperty(arguments, "0", { |
| 1075 value:2, | 981 value:2, |
| 1076 writable:false | 982 writable:false |
| 1077 }); | 983 }); |
| 1078 // Here arguments[0] is no alias at all. | 984 // Here arguments[0] is no alias at all. |
| 1079 Object.defineProperty(arguments, "0", { | 985 Reflect.defineProperty(arguments, "0", { |
| 1080 value:3 | 986 value:3 |
| 1081 }); | 987 }); |
| 1082 assertEquals(2, arg0); | 988 assertEquals(2, arg0); |
| 1083 assertEquals(3, arguments[0]); | 989 assertEquals(3, arguments[0]); |
| 1084 })(0); | 990 })(0); |
| 1085 */ | 991 */ |
| 1086 | 992 |
| 1087 // Regression test: We should never observe the hole value. | 993 // Regression test: We should never observe the hole value. |
| 1088 var objectWithGetter = {}; | 994 var objectWithGetter = {}; |
| 1089 objectWithGetter.__defineGetter__('foo', function() {}); | 995 objectWithGetter.__defineGetter__('foo', function() {}); |
| 1090 assertEquals(undefined, objectWithGetter.__lookupSetter__('foo')); | 996 assertEquals(undefined, objectWithGetter.__lookupSetter__('foo')); |
| 1091 | 997 |
| 1092 var objectWithSetter = {}; | 998 var objectWithSetter = {}; |
| 1093 objectWithSetter.__defineSetter__('foo', function(x) {}); | 999 objectWithSetter.__defineSetter__('foo', function(x) {}); |
| 1094 assertEquals(undefined, objectWithSetter.__lookupGetter__('foo')); | 1000 assertEquals(undefined, objectWithSetter.__lookupGetter__('foo')); |
| 1095 | 1001 |
| 1096 // An object with a getter on the prototype chain. | 1002 // An object with a getter on the prototype chain. |
| 1097 function getter() { return 111; } | 1003 function getter() { return 111; } |
| 1098 function anotherGetter() { return 222; } | 1004 function anotherGetter() { return 222; } |
| 1099 | 1005 |
| 1100 function testGetterOnProto(expected, o) { | 1006 function testGetterOnProto(expected, o) { |
| 1101 assertEquals(expected, o.quebec); | 1007 assertEquals(expected, o.quebec); |
| 1102 } | 1008 } |
| 1103 | 1009 |
| 1104 obj1 = {}; | 1010 obj1 = {}; |
| 1105 Object.defineProperty(obj1, "quebec", { get: getter, configurable: true }); | 1011 assertTrue( |
| 1012 Reflect.defineProperty(obj1, "quebec", { get: getter, configurable: true })); |
| 1106 obj2 = Object.create(obj1); | 1013 obj2 = Object.create(obj1); |
| 1107 obj3 = Object.create(obj2); | 1014 obj3 = Object.create(obj2); |
| 1108 | 1015 |
| 1109 testGetterOnProto(111, obj3); | 1016 testGetterOnProto(111, obj3); |
| 1110 testGetterOnProto(111, obj3); | 1017 testGetterOnProto(111, obj3); |
| 1111 %OptimizeFunctionOnNextCall(testGetterOnProto); | 1018 %OptimizeFunctionOnNextCall(testGetterOnProto); |
| 1112 testGetterOnProto(111, obj3); | 1019 testGetterOnProto(111, obj3); |
| 1113 testGetterOnProto(111, obj3); | 1020 testGetterOnProto(111, obj3); |
| 1114 | 1021 |
| 1115 Object.defineProperty(obj1, "quebec", { get: anotherGetter }); | 1022 assertTrue(Reflect.defineProperty(obj1, "quebec", { get: anotherGetter })); |
| 1116 | 1023 |
| 1117 testGetterOnProto(222, obj3); | 1024 testGetterOnProto(222, obj3); |
| 1118 testGetterOnProto(222, obj3); | 1025 testGetterOnProto(222, obj3); |
| 1119 %OptimizeFunctionOnNextCall(testGetterOnProto); | 1026 %OptimizeFunctionOnNextCall(testGetterOnProto); |
| 1120 testGetterOnProto(222, obj3); | 1027 testGetterOnProto(222, obj3); |
| 1121 testGetterOnProto(222, obj3); | 1028 testGetterOnProto(222, obj3); |
| 1122 | 1029 |
| 1123 // An object with a setter on the prototype chain. | 1030 // An object with a setter on the prototype chain. |
| 1124 var modifyMe; | 1031 var modifyMe; |
| 1125 function setter(x) { modifyMe = x+1; } | 1032 function setter(x) { modifyMe = x+1; } |
| 1126 function anotherSetter(x) { modifyMe = x+2; } | 1033 function anotherSetter(x) { modifyMe = x+2; } |
| 1127 | 1034 |
| 1128 function testSetterOnProto(expected, o) { | 1035 function testSetterOnProto(expected, o) { |
| 1129 modifyMe = 333; | 1036 modifyMe = 333; |
| 1130 o.romeo = 444; | 1037 o.romeo = 444; |
| 1131 assertEquals(expected, modifyMe); | 1038 assertEquals(expected, modifyMe); |
| 1132 } | 1039 } |
| 1133 | 1040 |
| 1134 obj1 = {}; | 1041 obj1 = {}; |
| 1135 Object.defineProperty(obj1, "romeo", { set: setter, configurable: true }); | 1042 assertTrue( |
| 1043 Reflect.defineProperty(obj1, "romeo", { set: setter, configurable: true })); |
| 1136 obj2 = Object.create(obj1); | 1044 obj2 = Object.create(obj1); |
| 1137 obj3 = Object.create(obj2); | 1045 obj3 = Object.create(obj2); |
| 1138 | 1046 |
| 1139 testSetterOnProto(445, obj3); | 1047 testSetterOnProto(445, obj3); |
| 1140 testSetterOnProto(445, obj3); | 1048 testSetterOnProto(445, obj3); |
| 1141 %OptimizeFunctionOnNextCall(testSetterOnProto); | 1049 %OptimizeFunctionOnNextCall(testSetterOnProto); |
| 1142 testSetterOnProto(445, obj3); | 1050 testSetterOnProto(445, obj3); |
| 1143 testSetterOnProto(445, obj3); | 1051 testSetterOnProto(445, obj3); |
| 1144 | 1052 |
| 1145 Object.defineProperty(obj1, "romeo", { set: anotherSetter }); | 1053 assertTrue(Reflect.defineProperty(obj1, "romeo", { set: anotherSetter })); |
| 1146 | 1054 |
| 1147 testSetterOnProto(446, obj3); | 1055 testSetterOnProto(446, obj3); |
| 1148 testSetterOnProto(446, obj3); | 1056 testSetterOnProto(446, obj3); |
| 1149 %OptimizeFunctionOnNextCall(testSetterOnProto); | 1057 %OptimizeFunctionOnNextCall(testSetterOnProto); |
| 1150 testSetterOnProto(446, obj3); | 1058 testSetterOnProto(446, obj3); |
| 1151 testSetterOnProto(446, obj3); | 1059 testSetterOnProto(446, obj3); |
| 1152 | 1060 |
| 1153 // Removing a setter on the prototype chain. | 1061 // Removing a setter on the prototype chain. |
| 1154 function testSetterOnProtoStrict(o) { | 1062 function testSetterOnProtoStrict(o) { |
| 1155 "use strict"; | 1063 "use strict"; |
| 1156 o.sierra = 12345; | 1064 o.sierra = 12345; |
| 1157 } | 1065 } |
| 1158 | 1066 |
| 1159 obj1 = {}; | 1067 obj1 = {}; |
| 1160 Object.defineProperty(obj1, "sierra", | 1068 assertTrue(Reflect.defineProperty(obj1, "sierra", |
| 1161 { get: getter, set: setter, configurable: true }); | 1069 { get: getter, set: setter, configurable: true })); |
| 1162 obj2 = Object.create(obj1); | 1070 obj2 = Object.create(obj1); |
| 1163 obj3 = Object.create(obj2); | 1071 obj3 = Object.create(obj2); |
| 1164 | 1072 |
| 1165 testSetterOnProtoStrict(obj3); | 1073 testSetterOnProtoStrict(obj3); |
| 1166 testSetterOnProtoStrict(obj3); | 1074 testSetterOnProtoStrict(obj3); |
| 1167 %OptimizeFunctionOnNextCall(testSetterOnProtoStrict); | 1075 %OptimizeFunctionOnNextCall(testSetterOnProtoStrict); |
| 1168 testSetterOnProtoStrict(obj3); | 1076 testSetterOnProtoStrict(obj3); |
| 1169 testSetterOnProtoStrict(obj3); | 1077 testSetterOnProtoStrict(obj3); |
| 1170 | 1078 |
| 1171 Object.defineProperty(obj1, "sierra", | 1079 assertTrue(Reflect.defineProperty(obj1, "sierra", |
| 1172 { get: getter, set: undefined, configurable: true }); | 1080 { get: getter, set: undefined, configurable: true })); |
| 1173 | 1081 |
| 1174 exception = false; | 1082 exception = false; |
| 1175 try { | 1083 try { |
| 1176 testSetterOnProtoStrict(obj3); | 1084 testSetterOnProtoStrict(obj3); |
| 1177 } catch (e) { | 1085 } catch (e) { |
| 1178 exception = true; | 1086 exception = true; |
| 1179 assertTrue(/which has only a getter/.test(e)); | 1087 assertTrue(/which has only a getter/.test(e)); |
| 1180 } | 1088 } |
| 1181 assertTrue(exception); | 1089 assertTrue(exception); |
| 1182 | 1090 |
| 1183 // Test assignment to a getter-only property on the prototype chain. This makes | 1091 // Test assignment to a getter-only property on the prototype chain. This makes |
| 1184 // sure that crankshaft re-checks its assumptions and doesn't rely only on type | 1092 // sure that crankshaft re-checks its assumptions and doesn't rely only on type |
| 1185 // feedback (which would be monomorphic here). | 1093 // feedback (which would be monomorphic here). |
| 1186 | 1094 |
| 1187 function Assign(o) { | 1095 function Assign(o) { |
| 1188 o.blubb = 123; | 1096 o.blubb = 123; |
| 1189 } | 1097 } |
| 1190 | 1098 |
| 1191 function C() {} | 1099 function C() {} |
| 1192 | 1100 |
| 1193 Assign(new C); | 1101 Assign(new C); |
| 1194 Assign(new C); | 1102 Assign(new C); |
| 1195 %OptimizeFunctionOnNextCall(Assign); | 1103 %OptimizeFunctionOnNextCall(Assign); |
| 1196 Object.defineProperty(C.prototype, "blubb", {get: function() { return -42; }}); | 1104 assertTrue( |
| 1105 Reflect.defineProperty(C.prototype, "blubb", {get: function() {return -42}})); |
| 1197 Assign(new C); | 1106 Assign(new C); |
| 1198 | 1107 |
| 1199 // Test that changes to the prototype of a simple constructor are not ignored, | 1108 // Test that changes to the prototype of a simple constructor are not ignored, |
| 1200 // even after creating initial instances. | 1109 // even after creating initial instances. |
| 1201 function C() { | 1110 function C() { |
| 1202 this.x = 23; | 1111 this.x = 23; |
| 1203 } | 1112 } |
| 1204 assertEquals(23, new C().x); | 1113 assertEquals(23, new C().x); |
| 1205 C.prototype.__defineSetter__('x', function(value) { this.y = 23; }); | 1114 C.prototype.__defineSetter__('x', function(value) { this.y = 23; }); |
| 1206 assertEquals(void 0, new C().x); | 1115 assertEquals(void 0, new C().x); |
| OLD | NEW |