Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 2008 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 10 matching lines...) Expand all Loading... | |
| 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 // Flags: --harmony-proxies | 28 // Flags: --harmony-proxies |
| 29 | 29 |
| 30 | 30 |
| 31 // TODO(rossberg): test exception cases. | |
| 32 // TODO(rossberg): test proxies as prototypes. | |
| 33 // TODO(rossberg): for-in for proxies not implemented. | 31 // TODO(rossberg): for-in for proxies not implemented. |
| 32 // TODO(rossberg): inheritance from proxies not implemented. | |
| 34 // TODO(rossberg): function proxies as constructors not implemented. | 33 // TODO(rossberg): function proxies as constructors not implemented. |
| 35 | 34 |
| 36 | 35 |
| 37 // Helper. | 36 // Helper. |
| 38 | 37 |
| 39 function TestWithProxies(test, handler) { | 38 function TestWithProxies(test, handler) { |
| 40 test(handler, Proxy.create) | 39 test(handler, Proxy.create) |
| 41 test(handler, function(h) {return Proxy.createFunction(h, function() {})}) | 40 test(handler, function(h) {return Proxy.createFunction(h, function() {})}) |
| 42 } | 41 } |
| 43 | 42 |
| 44 | 43 |
| 45 // Getters. | 44 // Getters. |
| 46 | 45 |
| 47 function TestGet(handler) { | 46 function TestGet(handler) { |
| 48 TestWithProxies(TestGet2, handler) | 47 TestWithProxies(TestGet2, handler) |
| 49 } | 48 } |
| 50 | 49 |
| 51 function TestGet2(handler, create) { | 50 function TestGet2(handler, create) { |
| 52 var o = create(handler) | 51 var p = create(handler) |
| 53 assertEquals(42, o.a) | 52 assertEquals(42, p.a) |
| 54 assertEquals(42, o["b"]) | 53 assertEquals(42, p["b"]) |
| 54 | |
| 55 // TODO(rossberg): inheritance from proxies not yet implemented. | |
| 56 // var o = Object.create(p, {x: {value: 88}}) | |
| 57 // assertEquals(42, o.a) | |
| 58 // assertEquals(42, o["b"]) | |
| 59 // assertEquals(88, o.x) | |
| 60 // assertEquals(88, o["x"]) | |
| 55 } | 61 } |
| 56 | 62 |
| 57 TestGet({ | 63 TestGet({ |
| 58 get: function(r, k) { return 42 } | 64 get: function(r, k) { return 42 } |
| 59 }) | 65 }) |
| 60 | 66 |
| 61 TestGet({ | 67 TestGet({ |
| 62 get: function(r, k) { return this.get2(r, k) }, | 68 get: function(r, k) { return this.get2(r, k) }, |
| 63 get2: function(r, k) { return 42 } | 69 get2: function(r, k) { return 42 } |
| 64 }) | 70 }) |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 151 } | 157 } |
| 152 }) | 158 }) |
| 153 | 159 |
| 154 TestGetCall(Proxy.create({ | 160 TestGetCall(Proxy.create({ |
| 155 get: function(pr, pk) { | 161 get: function(pr, pk) { |
| 156 return function(r, k) { return function() { return 55 } } | 162 return function(r, k) { return function() { return 55 } } |
| 157 } | 163 } |
| 158 })) | 164 })) |
| 159 | 165 |
| 160 | 166 |
| 167 function TestGetThrow(handler) { | |
| 168 TestWithProxies(TestGetThrow2, handler) | |
|
Kevin Millikin (Chromium)
2011/09/07 12:51:36
This is impressively indirect.
rossberg
2011/09/07 14:59:34
And still there is far too much duplication in the
| |
| 169 } | |
| 170 | |
| 171 function TestGetThrow2(handler, create) { | |
| 172 var p = create(handler) | |
| 173 assertThrows(function(){ p.a }, "myexn") | |
| 174 assertThrows(function(){ p["b"] }, "myexn") | |
| 175 } | |
| 176 | |
| 177 TestGetThrow({ | |
| 178 get: function(r, k) { throw "myexn" } | |
| 179 }) | |
| 180 | |
| 181 TestGetThrow({ | |
| 182 get: function(r, k) { return this.get2(r, k) }, | |
| 183 get2: function(r, k) { throw "myexn" } | |
| 184 }) | |
| 185 | |
| 186 TestGetThrow({ | |
| 187 getPropertyDescriptor: function(k) { throw "myexn" } | |
| 188 }) | |
| 189 | |
| 190 TestGetThrow({ | |
| 191 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, | |
| 192 getPropertyDescriptor2: function(k) { throw "myexn" } | |
| 193 }) | |
| 194 | |
| 195 TestGetThrow({ | |
| 196 getPropertyDescriptor: function(k) { | |
| 197 return {get value() { throw "myexn" }} | |
| 198 } | |
| 199 }) | |
| 200 | |
| 201 TestGetThrow({ | |
| 202 get: undefined, | |
| 203 getPropertyDescriptor: function(k) { throw "myexn" } | |
| 204 }) | |
| 205 | |
| 206 TestGetThrow(Proxy.create({ | |
| 207 get: function(pr, pk) { throw "myexn" } | |
| 208 })) | |
| 209 | |
| 210 TestGetThrow(Proxy.create({ | |
| 211 get: function(pr, pk) { | |
| 212 return function(r, k) { throw "myexn" } | |
| 213 } | |
| 214 })) | |
| 215 | |
| 216 | |
| 161 | 217 |
| 162 // Setters. | 218 // Setters. |
| 163 | 219 |
| 164 var key | 220 var key |
| 165 var val | 221 var val |
| 166 | 222 |
| 167 function TestSet(handler, create) { | 223 function TestSet(handler, create) { |
| 168 TestWithProxies(TestSet2, handler) | 224 TestWithProxies(TestSet2, handler) |
| 169 } | 225 } |
| 170 | 226 |
| 171 function TestSet2(handler, create) { | 227 function TestSet2(handler, create) { |
| 172 var o = create(handler) | 228 var p = create(handler) |
| 173 assertEquals(42, o.a = 42) | 229 assertEquals(42, p.a = 42) |
| 174 assertEquals("a", key) | 230 assertEquals("a", key) |
| 175 assertEquals(42, val) | 231 assertEquals(42, val) |
| 176 assertEquals(43, o["b"] = 43) | 232 assertEquals(43, p["b"] = 43) |
| 177 assertEquals("b", key) | 233 assertEquals("b", key) |
| 178 assertEquals(43, val) | 234 assertEquals(43, val) |
| 179 } | 235 } |
| 180 | 236 |
| 181 TestSet({ | 237 TestSet({ |
| 182 set: function(r, k, v) { key = k; val = v; return true } | 238 set: function(r, k, v) { key = k; val = v; return true } |
| 183 }) | 239 }) |
| 184 | 240 |
| 185 TestSet({ | 241 TestSet({ |
| 186 set: function(r, k, v) { return this.set2(r, k, v) }, | 242 set: function(r, k, v) { return this.set2(r, k, v) }, |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 242 }) | 298 }) |
| 243 | 299 |
| 244 TestSet(Proxy.create({ | 300 TestSet(Proxy.create({ |
| 245 get: function(pr, pk) { | 301 get: function(pr, pk) { |
| 246 return function(r, k, v) { key = k; val = v; return true } | 302 return function(r, k, v) { key = k; val = v; return true } |
| 247 } | 303 } |
| 248 })) | 304 })) |
| 249 | 305 |
| 250 | 306 |
| 251 | 307 |
| 308 function TestSetThrow(handler, create) { | |
| 309 TestWithProxies(TestSetThrow2, handler) | |
| 310 } | |
| 311 | |
| 312 function TestSetThrow2(handler, create) { | |
| 313 var p = create(handler) | |
| 314 assertThrows(function(){ p.a = 42 }, "myexn") | |
| 315 assertThrows(function(){ p["b"] = 42 }, "myexn") | |
| 316 } | |
| 317 | |
| 318 TestSetThrow({ | |
| 319 set: function(r, k, v) { throw "myexn" } | |
| 320 }) | |
| 321 | |
| 322 TestSetThrow({ | |
| 323 set: function(r, k, v) { return this.set2(r, k, v) }, | |
| 324 set2: function(r, k, v) { throw "myexn" } | |
| 325 }) | |
| 326 | |
| 327 TestSetThrow({ | |
| 328 getOwnPropertyDescriptor: function(k) { throw "myexn" }, | |
| 329 defineProperty: function(k, desc) { key = k; val = desc.value } | |
| 330 }) | |
| 331 | |
| 332 TestSetThrow({ | |
| 333 getOwnPropertyDescriptor: function(k) { return {writable: true} }, | |
| 334 defineProperty: function(k, desc) { throw "myexn" } | |
| 335 }) | |
| 336 | |
| 337 TestSetThrow({ | |
| 338 getOwnPropertyDescriptor: function(k) { | |
| 339 return this.getOwnPropertyDescriptor2(k) | |
| 340 }, | |
| 341 getOwnPropertyDescriptor2: function(k) { throw "myexn" }, | |
| 342 defineProperty: function(k, desc) { this.defineProperty2(k, desc) }, | |
| 343 defineProperty2: function(k, desc) { key = k; val = desc.value } | |
| 344 }) | |
| 345 | |
| 346 TestSetThrow({ | |
| 347 getOwnPropertyDescriptor: function(k) { | |
| 348 return this.getOwnPropertyDescriptor2(k) | |
| 349 }, | |
| 350 getOwnPropertyDescriptor2: function(k) { return {writable: true} }, | |
| 351 defineProperty: function(k, desc) { this.defineProperty2(k, desc) }, | |
| 352 defineProperty2: function(k, desc) { throw "myexn" } | |
| 353 }) | |
| 354 | |
| 355 TestSetThrow({ | |
| 356 getOwnPropertyDescriptor: function(k) { throw "myexn" }, | |
| 357 defineProperty: function(k, desc) { key = k; val = desc.value } | |
| 358 }) | |
| 359 | |
| 360 TestSetThrow({ | |
| 361 getOwnPropertyDescriptor: function(k) { | |
| 362 return {get writable() { return true }} | |
| 363 }, | |
| 364 defineProperty: function(k, desc) { throw "myexn" } | |
| 365 }) | |
| 366 | |
| 367 TestSetThrow({ | |
| 368 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
| 369 }) | |
| 370 | |
| 371 TestSetThrow({ | |
| 372 getOwnPropertyDescriptor: function(k) { | |
| 373 return {set: function(v) { throw "myexn" }} | |
| 374 } | |
| 375 }) | |
| 376 | |
| 377 TestSetThrow({ | |
| 378 getOwnPropertyDescriptor: function(k) { throw "myexn" }, | |
| 379 getPropertyDescriptor: function(k) { return {writable: true} }, | |
| 380 defineProperty: function(k, desc) { key = k; val = desc.value } | |
| 381 }) | |
| 382 | |
| 383 TestSetThrow({ | |
| 384 getOwnPropertyDescriptor: function(k) { return null }, | |
| 385 getPropertyDescriptor: function(k) { throw "myexn" }, | |
| 386 defineProperty: function(k, desc) { key = k; val = desc.value } | |
| 387 }) | |
| 388 | |
| 389 TestSetThrow({ | |
| 390 getOwnPropertyDescriptor: function(k) { return null }, | |
| 391 getPropertyDescriptor: function(k) { return {writable: true} }, | |
| 392 defineProperty: function(k, desc) { throw "myexn" } | |
| 393 }) | |
| 394 | |
| 395 TestSetThrow({ | |
| 396 getOwnPropertyDescriptor: function(k) { return null }, | |
| 397 getPropertyDescriptor: function(k) { | |
| 398 return {get writable() { throw "myexn" }} | |
| 399 }, | |
| 400 defineProperty: function(k, desc) { key = k; val = desc.value } | |
| 401 }) | |
| 402 | |
| 403 TestSetThrow({ | |
| 404 getOwnPropertyDescriptor: function(k) { return null }, | |
| 405 getPropertyDescriptor: function(k) { | |
| 406 return {set: function(v) { throw "myexn" }} | |
| 407 } | |
| 408 }) | |
| 409 | |
| 410 TestSetThrow({ | |
| 411 getOwnPropertyDescriptor: function(k) { return null }, | |
| 412 getPropertyDescriptor: function(k) { return null }, | |
| 413 defineProperty: function(k, desc) { throw "myexn" } | |
| 414 }) | |
| 415 | |
| 416 TestSetThrow(Proxy.create({ | |
| 417 get: function(pr, pk) { throw "myexn" } | |
| 418 })) | |
| 419 | |
| 420 TestSetThrow(Proxy.create({ | |
| 421 get: function(pr, pk) { | |
| 422 return function(r, k, v) { throw "myexn" } | |
| 423 } | |
| 424 })) | |
| 425 | |
| 426 | |
| 427 | |
| 252 // Property definition (Object.defineProperty and Object.defineProperties). | 428 // Property definition (Object.defineProperty and Object.defineProperties). |
| 253 | 429 |
| 254 var key | 430 var key |
| 255 var desc | 431 var desc |
| 256 | 432 |
| 257 function TestDefine(handler) { | 433 function TestDefine(handler) { |
| 258 TestWithProxies(TestDefine2, handler) | 434 TestWithProxies(TestDefine2, handler) |
| 259 } | 435 } |
| 260 | 436 |
| 261 function TestDefine2(handler, create) { | 437 function TestDefine2(handler, create) { |
| 262 var o = create(handler) | 438 var p = create(handler) |
| 263 assertEquals(o, Object.defineProperty(o, "a", {value: 44})) | 439 assertEquals(p, Object.defineProperty(p, "a", {value: 44})) |
| 264 assertEquals("a", key) | 440 assertEquals("a", key) |
| 265 assertEquals(1, Object.getOwnPropertyNames(desc).length) | 441 assertEquals(1, Object.getOwnPropertyNames(desc).length) |
| 266 assertEquals(44, desc.value) | 442 assertEquals(44, desc.value) |
| 267 | 443 |
| 268 assertEquals(o, Object.defineProperty(o, "b", {value: 45, writable: false})) | 444 assertEquals(p, Object.defineProperty(p, "b", {value: 45, writable: false})) |
| 269 assertEquals("b", key) | 445 assertEquals("b", key) |
| 270 assertEquals(2, Object.getOwnPropertyNames(desc).length) | 446 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
| 271 assertEquals(45, desc.value) | 447 assertEquals(45, desc.value) |
| 272 assertEquals(false, desc.writable) | 448 assertEquals(false, desc.writable) |
| 273 | 449 |
| 274 assertEquals(o, Object.defineProperty(o, "c", {value: 46, enumerable: false})) | 450 assertEquals(p, Object.defineProperty(p, "c", {value: 46, enumerable: false})) |
| 275 assertEquals("c", key) | 451 assertEquals("c", key) |
| 276 assertEquals(2, Object.getOwnPropertyNames(desc).length) | 452 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
| 277 assertEquals(46, desc.value) | 453 assertEquals(46, desc.value) |
| 278 assertEquals(false, desc.enumerable) | 454 assertEquals(false, desc.enumerable) |
| 279 | 455 |
| 280 var attributes = {configurable: true, mine: 66, minetoo: 23} | 456 var attributes = {configurable: true, mine: 66, minetoo: 23} |
| 281 assertEquals(o, Object.defineProperty(o, "d", attributes)) | 457 assertEquals(p, Object.defineProperty(p, "d", attributes)) |
| 282 assertEquals("d", key) | 458 assertEquals("d", key) |
| 283 // Modifying the attributes object after the fact should have no effect. | 459 // Modifying the attributes object after the fact should have no effect. |
| 284 attributes.configurable = false | 460 attributes.configurable = false |
| 285 attributes.mine = 77 | 461 attributes.mine = 77 |
| 286 delete attributes.minetoo | 462 delete attributes.minetoo |
| 287 assertEquals(3, Object.getOwnPropertyNames(desc).length) | 463 assertEquals(3, Object.getOwnPropertyNames(desc).length) |
| 288 assertEquals(true, desc.configurable) | 464 assertEquals(true, desc.configurable) |
| 289 assertEquals(66, desc.mine) | 465 assertEquals(66, desc.mine) |
| 290 assertEquals(23, desc.minetoo) | 466 assertEquals(23, desc.minetoo) |
| 291 | 467 |
| 292 assertEquals(o, Object.defineProperty(o, "e", {get: function(){ return 5 }})) | 468 assertEquals(p, Object.defineProperty(p, "e", {get: function(){ return 5 }})) |
| 293 assertEquals("e", key) | 469 assertEquals("e", key) |
| 294 assertEquals(1, Object.getOwnPropertyNames(desc).length) | 470 assertEquals(1, Object.getOwnPropertyNames(desc).length) |
| 295 assertEquals(5, desc.get()) | 471 assertEquals(5, desc.get()) |
| 296 | 472 |
| 297 assertEquals(o, Object.defineProperty(o, "zzz", {})) | 473 assertEquals(p, Object.defineProperty(p, "zzz", {})) |
| 298 assertEquals("zzz", key) | 474 assertEquals("zzz", key) |
| 299 assertEquals(0, Object.getOwnPropertyNames(desc).length) | 475 assertEquals(0, Object.getOwnPropertyNames(desc).length) |
| 300 | 476 |
| 301 // TODO(rossberg): This test requires for-in on proxies. | 477 // TODO(rossberg): This test requires for-in on proxies. |
| 302 // var d = create({ | 478 // var d = create({ |
| 303 // get: function(r, k) { return (k === "value") ? 77 : void 0 }, | 479 // get: function(r, k) { return (k === "value") ? 77 : void 0 }, |
| 304 // getOwnPropertyNames: function() { return ["value"] } | 480 // getOwnPropertyNames: function() { return ["value"] } |
| 305 // }) | 481 // }) |
| 306 // assertEquals(1, Object.getOwnPropertyNames(d).length) | 482 // assertEquals(1, Object.getOwnPropertyNames(d).length) |
| 307 // assertEquals(77, d.value) | 483 // assertEquals(77, d.value) |
| 308 // assertEquals(o, Object.defineProperty(o, "p", d)) | 484 // assertEquals(p, Object.defineProperty(p, "p", d)) |
| 309 // assertEquals("p", key) | 485 // assertEquals("p", key) |
| 310 // assertEquals(1, Object.getOwnPropertyNames(desc).length) | 486 // assertEquals(1, Object.getOwnPropertyNames(desc).length) |
| 311 // assertEquals(77, desc.value) | 487 // assertEquals(77, desc.value) |
| 312 | 488 |
| 313 var props = { | 489 var props = { |
| 314 'bla': {}, | 490 'bla': {}, |
| 315 blub: {get: function() { return true }}, | 491 blub: {get: function() { return true }}, |
| 316 '': {get value() { return 20 }}, | 492 '': {get value() { return 20 }}, |
| 317 last: {value: 21, configurable: true, mine: "eyes"} | 493 last: {value: 21, configurable: true, mine: "eyes"} |
| 318 } | 494 } |
| 319 Object.defineProperty(props, "hidden", {value: "hidden", enumerable: false}) | 495 Object.defineProperty(props, "hidden", {value: "hidden", enumerable: false}) |
| 320 assertEquals(o, Object.defineProperties(o, props)) | 496 assertEquals(p, Object.defineProperties(p, props)) |
| 321 assertEquals("last", key) | 497 assertEquals("last", key) |
| 322 assertEquals(2, Object.getOwnPropertyNames(desc).length) | 498 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
| 323 assertEquals(21, desc.value) | 499 assertEquals(21, desc.value) |
| 324 assertEquals(true, desc.configurable) | 500 assertEquals(true, desc.configurable) |
| 325 assertEquals(undefined, desc.mine) // Arguably a bug in the spec... | 501 assertEquals(undefined, desc.mine) // Arguably a bug in the spec... |
| 502 | |
| 503 var props = {bla: {get value() { throw "myexn" }}} | |
| 504 assertThrows(function(){ Object.defineProperties(p, props) }, "myexn") | |
| 326 } | 505 } |
| 327 | 506 |
| 328 TestDefine({ | 507 TestDefine({ |
| 329 defineProperty: function(k, d) { key = k; desc = d; return true } | 508 defineProperty: function(k, d) { key = k; desc = d; return true } |
| 330 }) | 509 }) |
| 331 | 510 |
| 332 TestDefine({ | 511 TestDefine({ |
| 333 defineProperty: function(k, d) { return this.defineProperty2(k, d) }, | 512 defineProperty: function(k, d) { return this.defineProperty2(k, d) }, |
| 334 defineProperty2: function(k, d) { key = k; desc = d; return true } | 513 defineProperty2: function(k, d) { key = k; desc = d; return true } |
| 335 }) | 514 }) |
| 336 | 515 |
| 337 TestDefine(Proxy.create({ | 516 TestDefine(Proxy.create({ |
| 338 get: function(pr, pk) { | 517 get: function(pr, pk) { |
| 339 return function(k, d) { key = k; desc = d; return true } | 518 return function(k, d) { key = k; desc = d; return true } |
| 340 } | 519 } |
| 341 })) | 520 })) |
| 342 | 521 |
| 343 | 522 |
| 523 function TestDefineThrow(handler) { | |
| 524 TestWithProxies(TestDefineThrow2, handler) | |
| 525 } | |
| 526 | |
| 527 function TestDefineThrow2(handler, create) { | |
| 528 var p = create(handler) | |
| 529 assertThrows(function(){ Object.defineProperty(p, "a", {value: 44})}, "myexn") | |
| 530 | |
| 531 // TODO(rossberg): These tests require for-in on proxies. | |
| 532 // var d1 = create({ | |
| 533 // get: function(r, k) { throw "myexn" }, | |
| 534 // getOwnPropertyNames: function() { return ["value"] } | |
| 535 // }) | |
| 536 // assertThrows(function(){ Object.defineProperty(p, "p", d1) }, "myexn") | |
| 537 // var d2 = create({ | |
| 538 // get: function(r, k) { return 77 }, | |
| 539 // getOwnPropertyNames: function() { throw "myexn" } | |
| 540 // }) | |
| 541 // assertThrows(function(){ Object.defineProperty(p, "p", d2) }, "myexn") | |
| 542 | |
| 543 var props = {bla: {get value() { throw "otherexn" }}} | |
| 544 assertThrows(function(){ Object.defineProperties(p, props) }, "otherexn") | |
| 545 } | |
| 546 | |
| 547 TestDefineThrow({ | |
| 548 defineProperty: function(k, d) { throw "myexn" } | |
| 549 }) | |
| 550 | |
| 551 TestDefineThrow({ | |
| 552 defineProperty: function(k, d) { return this.defineProperty2(k, d) }, | |
| 553 defineProperty2: function(k, d) { throw "myexn" } | |
| 554 }) | |
| 555 | |
| 556 TestDefineThrow(Proxy.create({ | |
| 557 get: function(pr, pk) { throw "myexn" } | |
| 558 })) | |
| 559 | |
| 560 TestDefineThrow(Proxy.create({ | |
| 561 get: function(pr, pk) { | |
| 562 return function(k, d) { throw "myexn" } | |
| 563 } | |
| 564 })) | |
| 565 | |
| 566 | |
| 344 | 567 |
| 345 // Property deletion (delete). | 568 // Property deletion (delete). |
| 346 | 569 |
| 347 var key | 570 var key |
| 348 | 571 |
| 349 function TestDelete(handler) { | 572 function TestDelete(handler) { |
| 350 TestWithProxies(TestDelete2, handler) | 573 TestWithProxies(TestDelete2, handler) |
| 351 } | 574 } |
| 352 | 575 |
| 353 function TestDelete2(handler, create) { | 576 function TestDelete2(handler, create) { |
| 354 var o = create(handler) | 577 var p = create(handler) |
| 355 assertEquals(true, delete o.a) | 578 assertEquals(true, delete p.a) |
| 356 assertEquals("a", key) | 579 assertEquals("a", key) |
| 357 assertEquals(true, delete o["b"]) | 580 assertEquals(true, delete p["b"]) |
| 358 assertEquals("b", key) | 581 assertEquals("b", key) |
| 359 | 582 |
| 360 assertEquals(false, delete o.z1) | 583 assertEquals(false, delete p.z1) |
| 361 assertEquals("z1", key) | 584 assertEquals("z1", key) |
| 362 assertEquals(false, delete o["z2"]) | 585 assertEquals(false, delete p["z2"]) |
| 363 assertEquals("z2", key); | 586 assertEquals("z2", key); |
| 364 | 587 |
| 365 (function() { | 588 (function() { |
| 366 "use strict" | 589 "use strict" |
| 367 assertEquals(true, delete o.c) | 590 assertEquals(true, delete p.c) |
| 368 assertEquals("c", key) | 591 assertEquals("c", key) |
| 369 assertEquals(true, delete o["d"]) | 592 assertEquals(true, delete p["d"]) |
| 370 assertEquals("d", key) | 593 assertEquals("d", key) |
| 371 | 594 |
| 372 assertThrows(function() { delete o.z3 }, TypeError) | 595 assertThrows(function(){ delete p.z3 }, TypeError) |
| 373 assertEquals("z3", key) | 596 assertEquals("z3", key) |
| 374 assertThrows(function() { delete o["z4"] }, TypeError) | 597 assertThrows(function(){ delete p["z4"] }, TypeError) |
| 375 assertEquals("z4", key) | 598 assertEquals("z4", key) |
| 376 })() | 599 })() |
| 377 } | 600 } |
| 378 | 601 |
| 379 TestDelete({ | 602 TestDelete({ |
| 380 'delete': function(k) { key = k; return k < "z" } | 603 delete: function(k) { key = k; return k < "z" } |
| 381 }) | 604 }) |
| 382 | 605 |
| 383 TestDelete({ | 606 TestDelete({ |
| 384 'delete': function(k) { return this.delete2(k) }, | 607 delete: function(k) { return this.delete2(k) }, |
| 385 delete2: function(k) { key = k; return k < "z" } | 608 delete2: function(k) { key = k; return k < "z" } |
| 386 }) | 609 }) |
| 387 | 610 |
| 388 TestDelete(Proxy.create({ | 611 TestDelete(Proxy.create({ |
| 389 get: function(pr, pk) { | 612 get: function(pr, pk) { |
| 390 return function(k) { key = k; return k < "z" } | 613 return function(k) { key = k; return k < "z" } |
| 391 } | 614 } |
| 392 })) | 615 })) |
| 393 | 616 |
| 394 | 617 |
| 618 function TestDeleteThrow(handler) { | |
| 619 TestWithProxies(TestDeleteThrow2, handler) | |
| 620 } | |
| 621 | |
| 622 function TestDeleteThrow2(handler, create) { | |
| 623 var p = create(handler) | |
| 624 assertThrows(function(){ delete p.a }, "myexn") | |
| 625 assertThrows(function(){ delete p["b"] }, "myexn"); | |
| 626 | |
| 627 (function() { | |
| 628 "use strict" | |
| 629 assertThrows(function(){ delete p.c }, "myexn") | |
| 630 assertThrows(function(){ delete p["d"] }, "myexn") | |
| 631 })() | |
| 632 } | |
| 633 | |
| 634 TestDeleteThrow({ | |
| 635 delete: function(k) { throw "myexn" } | |
| 636 }) | |
| 637 | |
| 638 TestDeleteThrow({ | |
| 639 delete: function(k) { return this.delete2(k) }, | |
| 640 delete2: function(k) { throw "myexn" } | |
| 641 }) | |
| 642 | |
| 643 TestDeleteThrow(Proxy.create({ | |
| 644 get: function(pr, pk) { throw "myexn" } | |
| 645 })) | |
| 646 | |
| 647 TestDeleteThrow(Proxy.create({ | |
| 648 get: function(pr, pk) { | |
| 649 return function(k) { throw "myexn" } | |
| 650 } | |
| 651 })) | |
| 652 | |
| 653 | |
| 395 | 654 |
| 396 // Property descriptors (Object.getOwnPropertyDescriptor). | 655 // Property descriptors (Object.getOwnPropertyDescriptor). |
| 397 | 656 |
| 398 function TestDescriptor(handler) { | 657 function TestDescriptor(handler) { |
| 399 TestWithProxies(TestDescriptor2, handler) | 658 TestWithProxies(TestDescriptor2, handler) |
| 400 } | 659 } |
| 401 | 660 |
| 402 function TestDescriptor2(handler, create) { | 661 function TestDescriptor2(handler, create) { |
| 403 var o = create(handler) | 662 var p = create(handler) |
| 404 var descs = [ | 663 var descs = [ |
| 405 {configurable: true}, | 664 {configurable: true}, |
| 406 {value: 34, enumerable: true, configurable: true}, | 665 {value: 34, enumerable: true, configurable: true}, |
| 407 {value: 3, writable: false, mine: "eyes", configurable: true}, | 666 {value: 3, writable: false, mine: "eyes", configurable: true}, |
| 408 {get value() { return 20 }, get configurable() { return true }}, | 667 {get value() { return 20 }, get configurable() { return true }}, |
| 409 {get: function() { "get" }, set: function() { "set" }, configurable: true} | 668 {get: function() { "get" }, set: function() { "set" }, configurable: true} |
| 410 ] | 669 ] |
| 411 for (var i = 0; i < descs.length; ++i) { | 670 for (var i = 0; i < descs.length; ++i) { |
| 412 assertEquals(o, Object.defineProperty(o, i, descs[i])) | 671 assertEquals(p, Object.defineProperty(p, i, descs[i])) |
| 413 var desc = Object.getOwnPropertyDescriptor(o, i) | 672 var desc = Object.getOwnPropertyDescriptor(p, i) |
| 414 for (p in descs[i]) { | 673 for (prop in descs[i]) { |
| 415 // TODO(rossberg): Ignore user attributes as long as the spec isn't | 674 // TODO(rossberg): Ignore user attributes as long as the spec isn't |
| 416 // fixed suitably. | 675 // fixed suitably. |
| 417 if (p != "mine") assertEquals(descs[i][p], desc[p]) | 676 if (prop != "mine") assertEquals(descs[i][prop], desc[prop]) |
| 418 } | 677 } |
| 419 assertEquals(undefined, Object.getOwnPropertyDescriptor(o, "absent")) | 678 assertEquals(undefined, Object.getOwnPropertyDescriptor(p, "absent")) |
| 420 } | 679 } |
| 421 } | 680 } |
| 422 | 681 |
| 423 TestDescriptor({ | 682 TestDescriptor({ |
| 424 defineProperty: function(k, d) { this["__" + k] = d; return true }, | 683 defineProperty: function(k, d) { this["__" + k] = d; return true }, |
| 425 getOwnPropertyDescriptor: function(k) { return this["__" + k] } | 684 getOwnPropertyDescriptor: function(k) { return this["__" + k] } |
| 426 }) | 685 }) |
| 427 | 686 |
| 428 TestDescriptor({ | 687 TestDescriptor({ |
| 429 defineProperty: function(k, d) { this["__" + k] = d; return true }, | 688 defineProperty: function(k, d) { this["__" + k] = d; return true }, |
| 430 getOwnPropertyDescriptor: function(k) { | 689 getOwnPropertyDescriptor: function(k) { |
| 431 return this.getOwnPropertyDescriptor2(k) | 690 return this.getOwnPropertyDescriptor2(k) |
| 432 }, | 691 }, |
| 433 getOwnPropertyDescriptor2: function(k) { return this["__" + k] } | 692 getOwnPropertyDescriptor2: function(k) { return this["__" + k] } |
| 434 }) | 693 }) |
| 435 | 694 |
| 436 | 695 |
| 696 function TestDescriptorThrow(handler) { | |
| 697 TestWithProxies(TestDescriptorThrow2, handler) | |
| 698 } | |
| 699 | |
| 700 function TestDescriptorThrow2(handler, create) { | |
| 701 var p = create(handler) | |
| 702 assertThrows(function(){ Object.getOwnPropertyDescriptor(p, "a") }, "myexn") | |
| 703 } | |
| 704 | |
| 705 TestDescriptorThrow({ | |
| 706 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
| 707 }) | |
| 708 | |
| 709 TestDescriptorThrow({ | |
| 710 getOwnPropertyDescriptor: function(k) { | |
| 711 return this.getOwnPropertyDescriptor2(k) | |
| 712 }, | |
| 713 getOwnPropertyDescriptor2: function(k) { throw "myexn" } | |
| 714 }) | |
| 715 | |
| 716 | |
| 437 | 717 |
| 438 // Comparison. | 718 // Comparison. |
| 439 | 719 |
| 440 function TestComparison(eq) { | 720 function TestComparison(eq) { |
| 441 TestWithProxies(TestComparison2, eq) | 721 TestWithProxies(TestComparison2, eq) |
| 442 } | 722 } |
| 443 | 723 |
| 444 function TestComparison2(eq, create) { | 724 function TestComparison2(eq, create) { |
| 445 var o1 = create({}) | 725 var p1 = create({}) |
| 446 var o2 = create({}) | 726 var p2 = create({}) |
| 447 | 727 |
| 448 assertTrue(eq(o1, o1)) | 728 assertTrue(eq(p1, p1)) |
| 449 assertTrue(eq(o2, o2)) | 729 assertTrue(eq(p2, p2)) |
| 450 assertTrue(!eq(o1, o2)) | 730 assertTrue(!eq(p1, p2)) |
| 451 assertTrue(!eq(o1, {})) | 731 assertTrue(!eq(p1, {})) |
| 452 assertTrue(!eq({}, o2)) | 732 assertTrue(!eq({}, p2)) |
| 453 assertTrue(!eq({}, {})) | 733 assertTrue(!eq({}, {})) |
| 454 } | 734 } |
| 455 | 735 |
| 456 TestComparison(function(o1, o2) { return o1 == o2 }) | 736 TestComparison(function(o1, o2) { return o1 == o2 }) |
| 457 TestComparison(function(o1, o2) { return o1 === o2 }) | 737 TestComparison(function(o1, o2) { return o1 === o2 }) |
| 458 TestComparison(function(o1, o2) { return !(o1 != o2) }) | 738 TestComparison(function(o1, o2) { return !(o1 != o2) }) |
| 459 TestComparison(function(o1, o2) { return !(o1 !== o2) }) | 739 TestComparison(function(o1, o2) { return !(o1 !== o2) }) |
| 460 | 740 |
| 461 | 741 |
| 462 | 742 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 478 | 758 |
| 479 // Membership test (in). | 759 // Membership test (in). |
| 480 | 760 |
| 481 var key | 761 var key |
| 482 | 762 |
| 483 function TestIn(handler) { | 763 function TestIn(handler) { |
| 484 TestWithProxies(TestIn2, handler) | 764 TestWithProxies(TestIn2, handler) |
| 485 } | 765 } |
| 486 | 766 |
| 487 function TestIn2(handler, create) { | 767 function TestIn2(handler, create) { |
| 488 var o = create(handler) | 768 var p = create(handler) |
| 489 assertTrue("a" in o) | 769 assertTrue("a" in p) |
| 490 assertEquals("a", key) | 770 assertEquals("a", key) |
| 491 assertTrue(99 in o) | 771 assertTrue(99 in p) |
| 492 assertEquals("99", key) | 772 assertEquals("99", key) |
| 493 assertFalse("z" in o) | 773 assertFalse("z" in p) |
| 494 assertEquals("z", key) | 774 assertEquals("z", key) |
| 495 | 775 |
| 496 if ("b" in o) { | 776 assertEquals(2, ("a" in p) ? 2 : 0) |
| 777 assertEquals(0, !("a" in p) ? 2 : 0) | |
| 778 assertEquals(0, ("zzz" in p) ? 2 : 0) | |
| 779 assertEquals(2, !("zzz" in p) ? 2 : 0) | |
| 780 | |
| 781 if ("b" in p) { | |
| 497 } else { | 782 } else { |
| 498 assertTrue(false) | 783 assertTrue(false) |
| 499 } | 784 } |
| 500 assertEquals("b", key) | 785 assertEquals("b", key) |
| 501 | 786 |
| 502 if ("zz" in o) { | 787 if ("zz" in p) { |
| 503 assertTrue(false) | 788 assertTrue(false) |
| 504 } | 789 } |
| 505 assertEquals("zz", key) | 790 assertEquals("zz", key) |
| 506 | 791 |
| 507 if (!("c" in o)) { | 792 if (!("c" in p)) { |
| 508 assertTrue(false) | 793 assertTrue(false) |
| 509 } | 794 } |
| 510 assertEquals("c", key) | 795 assertEquals("c", key) |
| 511 | 796 |
| 512 if (!("zzz" in o)) { | 797 if (!("zzz" in p)) { |
| 513 } else { | 798 } else { |
| 514 assertTrue(false) | 799 assertTrue(false) |
| 515 } | 800 } |
| 516 assertEquals("zzz", key) | 801 assertEquals("zzz", key) |
| 517 } | 802 } |
| 518 | 803 |
| 519 TestIn({ | 804 TestIn({ |
| 520 has: function(k) { key = k; return k < "z" } | 805 has: function(k) { key = k; return k < "z" } |
| 521 }) | 806 }) |
| 522 | 807 |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 551 } | 836 } |
| 552 }) | 837 }) |
| 553 | 838 |
| 554 TestIn(Proxy.create({ | 839 TestIn(Proxy.create({ |
| 555 get: function(pr, pk) { | 840 get: function(pr, pk) { |
| 556 return function(k) { key = k; return k < "z" } | 841 return function(k) { key = k; return k < "z" } |
| 557 } | 842 } |
| 558 })) | 843 })) |
| 559 | 844 |
| 560 | 845 |
| 846 function TestInThrow(handler) { | |
| 847 TestWithProxies(TestInThrow2, handler) | |
| 848 } | |
| 849 | |
| 850 function TestInThrow2(handler, create) { | |
| 851 var p = create(handler) | |
| 852 assertThrows(function(){ return "a" in o }, "myexn") | |
| 853 assertThrows(function(){ return !("a" in o) }, "myexn") | |
| 854 assertThrows(function(){ return ("a" in o) ? 2 : 3 }, "myexn") | |
| 855 assertThrows(function(){ if ("b" in o) {} }, "myexn") | |
| 856 assertThrows(function(){ if (!("b" in o)) {} }, "myexn") | |
| 857 assertThrows(function(){ if ("zzz" in o) {} }, "myexn") | |
| 858 } | |
| 859 | |
| 860 TestInThrow({ | |
| 861 has: function(k) { throw "myexn" } | |
| 862 }) | |
| 863 | |
| 864 TestInThrow({ | |
| 865 has: function(k) { return this.has2(k) }, | |
| 866 has2: function(k) { throw "myexn" } | |
| 867 }) | |
| 868 | |
| 869 TestInThrow({ | |
| 870 getPropertyDescriptor: function(k) { throw "myexn" } | |
| 871 }) | |
| 872 | |
| 873 TestInThrow({ | |
| 874 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, | |
| 875 getPropertyDescriptor2: function(k) { throw "myexn" } | |
| 876 }) | |
| 877 | |
| 878 TestInThrow({ | |
| 879 get: undefined, | |
| 880 getPropertyDescriptor: function(k) { throw "myexn" } | |
| 881 }) | |
| 882 | |
| 883 TestInThrow(Proxy.create({ | |
| 884 get: function(pr, pk) { throw "myexn" } | |
| 885 })) | |
| 886 | |
| 887 TestInThrow(Proxy.create({ | |
| 888 get: function(pr, pk) { | |
| 889 return function(k) { throw "myexn" } | |
| 890 } | |
| 891 })) | |
| 892 | |
| 893 | |
| 561 | 894 |
| 562 // Own Properties (Object.prototype.hasOwnProperty). | 895 // Own Properties (Object.prototype.hasOwnProperty). |
| 563 | 896 |
| 564 var key | 897 var key |
| 565 | 898 |
| 566 function TestHasOwn(handler) { | 899 function TestHasOwn(handler) { |
| 567 TestWithProxies(TestHasOwn2, handler) | 900 TestWithProxies(TestHasOwn2, handler) |
| 568 } | 901 } |
| 569 | 902 |
| 570 function TestHasOwn2(handler, create) { | 903 function TestHasOwn2(handler, create) { |
| 571 var o = create(handler) | 904 var p = create(handler) |
| 572 assertTrue(Object.prototype.hasOwnProperty.call(o, "a")) | 905 assertTrue(Object.prototype.hasOwnProperty.call(p, "a")) |
| 573 assertEquals("a", key) | 906 assertEquals("a", key) |
| 574 assertTrue(Object.prototype.hasOwnProperty.call(o, 99)) | 907 assertTrue(Object.prototype.hasOwnProperty.call(p, 99)) |
| 575 assertEquals("99", key) | 908 assertEquals("99", key) |
| 576 assertFalse(Object.prototype.hasOwnProperty.call(o, "z")) | 909 assertFalse(Object.prototype.hasOwnProperty.call(p, "z")) |
| 577 assertEquals("z", key) | 910 assertEquals("z", key) |
| 578 } | 911 } |
| 579 | 912 |
| 580 TestHasOwn({ | 913 TestHasOwn({ |
| 581 hasOwn: function(k) { key = k; return k < "z" } | 914 hasOwn: function(k) { key = k; return k < "z" } |
| 582 }) | 915 }) |
| 583 | 916 |
| 584 TestHasOwn({ | 917 TestHasOwn({ |
| 585 hasOwn: function(k) { return this.hasOwn2(k) }, | 918 hasOwn: function(k) { return this.hasOwn2(k) }, |
| 586 hasOwn2: function(k) { key = k; return k < "z" } | 919 hasOwn2: function(k) { key = k; return k < "z" } |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 614 } | 947 } |
| 615 }) | 948 }) |
| 616 | 949 |
| 617 TestHasOwn(Proxy.create({ | 950 TestHasOwn(Proxy.create({ |
| 618 get: function(pr, pk) { | 951 get: function(pr, pk) { |
| 619 return function(k) { key = k; return k < "z" } | 952 return function(k) { key = k; return k < "z" } |
| 620 } | 953 } |
| 621 })) | 954 })) |
| 622 | 955 |
| 623 | 956 |
| 957 function TestHasOwnThrow(handler) { | |
| 958 TestWithProxies(TestHasOwnThrow2, handler) | |
| 959 } | |
| 960 | |
| 961 function TestHasOwnThrow2(handler, create) { | |
| 962 var p = create(handler) | |
| 963 assertThrows(function(){ Object.prototype.hasOwnProperty.call(p, "a")}, | |
| 964 "myexn") | |
| 965 assertThrows(function(){ Object.prototype.hasOwnProperty.call(p, 99)}, | |
| 966 "myexn") | |
| 967 } | |
| 968 | |
| 969 TestHasOwnThrow({ | |
| 970 hasOwn: function(k) { throw "myexn" } | |
| 971 }) | |
| 972 | |
| 973 TestHasOwnThrow({ | |
| 974 hasOwn: function(k) { return this.hasOwn2(k) }, | |
| 975 hasOwn2: function(k) { throw "myexn" } | |
| 976 }) | |
| 977 | |
| 978 TestHasOwnThrow({ | |
| 979 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
| 980 }) | |
| 981 | |
| 982 TestHasOwnThrow({ | |
| 983 getOwnPropertyDescriptor: function(k) { | |
| 984 return this.getOwnPropertyDescriptor2(k) | |
| 985 }, | |
| 986 getOwnPropertyDescriptor2: function(k) { throw "myexn" } | |
| 987 }) | |
| 988 | |
| 989 TestHasOwnThrow({ | |
| 990 hasOwn: undefined, | |
| 991 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
| 992 }) | |
| 993 | |
| 994 TestHasOwnThrow(Proxy.create({ | |
| 995 get: function(pr, pk) { throw "myexn" } | |
| 996 })) | |
| 997 | |
| 998 TestHasOwnThrow(Proxy.create({ | |
| 999 get: function(pr, pk) { | |
| 1000 return function(k) { throw "myexn" } | |
| 1001 } | |
| 1002 })) | |
| 1003 | |
| 1004 | |
| 624 | 1005 |
| 625 // Instanceof (instanceof) | 1006 // Instanceof (instanceof) |
| 626 | 1007 |
| 627 function TestInstanceof() { | 1008 function TestInstanceof() { |
| 628 var o = {} | 1009 var o = {} |
| 629 var p1 = Proxy.create({}) | 1010 var p1 = Proxy.create({}) |
| 630 var p2 = Proxy.create({}, o) | 1011 var p2 = Proxy.create({}, o) |
| 631 var p3 = Proxy.create({}, p2) | 1012 var p3 = Proxy.create({}, p2) |
| 632 | 1013 |
| 633 var f0 = function() {} | 1014 var f0 = function() {} |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 737 getOwnPropertyNames2: function() { return ["throw", "function "] } | 1118 getOwnPropertyNames2: function() { return ["throw", "function "] } |
| 738 }) | 1119 }) |
| 739 | 1120 |
| 740 TestPropertyNames(["[object Object]"], { | 1121 TestPropertyNames(["[object Object]"], { |
| 741 get getOwnPropertyNames() { | 1122 get getOwnPropertyNames() { |
| 742 return function() { return [{}] } | 1123 return function() { return [{}] } |
| 743 } | 1124 } |
| 744 }) | 1125 }) |
| 745 | 1126 |
| 746 | 1127 |
| 1128 function TestPropertyNamesThrow(handler) { | |
| 1129 TestWithProxies(TestPropertyNamesThrow2, handler) | |
| 1130 } | |
| 1131 | |
| 1132 function TestPropertyNamesThrow2(handler, create) { | |
| 1133 var p = create(handler) | |
| 1134 assertThrows(function(){ Object.getOwnPropertyNames(p) }, "myexn") | |
| 1135 } | |
| 1136 | |
| 1137 TestPropertyNamesThrow({ | |
| 1138 getOwnPropertyNames: function() { throw "myexn" } | |
| 1139 }) | |
| 1140 | |
| 1141 TestPropertyNamesThrow({ | |
| 1142 getOwnPropertyNames: function() { return this.getOwnPropertyNames2() }, | |
| 1143 getOwnPropertyNames2: function() { throw "myexn" } | |
| 1144 }) | |
| 1145 | |
| 1146 | |
| 747 function TestKeys(names, handler) { | 1147 function TestKeys(names, handler) { |
| 748 TestWithProxies(TestKeys2, [names, handler]) | 1148 TestWithProxies(TestKeys2, [names, handler]) |
| 749 } | 1149 } |
| 750 | 1150 |
| 751 function TestKeys2(names_handler, create) { | 1151 function TestKeys2(names_handler, create) { |
| 752 var p = create(names_handler[1]) | 1152 var p = create(names_handler[1]) |
| 753 assertArrayEquals(names_handler[0], Object.keys(p)) | 1153 assertArrayEquals(names_handler[0], Object.keys(p)) |
| 754 } | 1154 } |
| 755 | 1155 |
| 756 TestKeys([], { | 1156 TestKeys([], { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 796 }) | 1196 }) |
| 797 | 1197 |
| 798 TestKeys([], { | 1198 TestKeys([], { |
| 799 get getOwnPropertyNames() { | 1199 get getOwnPropertyNames() { |
| 800 return function() { return ["a", "b", "c"] } | 1200 return function() { return ["a", "b", "c"] } |
| 801 }, | 1201 }, |
| 802 getOwnPropertyDescriptor: function(k) { return {} } | 1202 getOwnPropertyDescriptor: function(k) { return {} } |
| 803 }) | 1203 }) |
| 804 | 1204 |
| 805 | 1205 |
| 1206 function TestKeysThrow(handler) { | |
| 1207 TestWithProxies(TestKeysThrow2, handler) | |
| 1208 } | |
| 1209 | |
| 1210 function TestKeysThrow2(handler, create) { | |
| 1211 var p = create(handler) | |
| 1212 assertThrows(function(){ Object.keys(p) }, "myexn") | |
| 1213 } | |
| 1214 | |
| 1215 TestKeysThrow({ | |
| 1216 keys: function() { throw "myexn" } | |
| 1217 }) | |
| 1218 | |
| 1219 TestKeysThrow({ | |
| 1220 keys: function() { return this.keys2() }, | |
| 1221 keys2: function() { throw "myexn" } | |
| 1222 }) | |
| 1223 | |
| 1224 TestKeysThrow({ | |
| 1225 getOwnPropertyNames: function() { throw "myexn" }, | |
| 1226 getOwnPropertyDescriptor: function(k) { return true } | |
| 1227 }) | |
| 1228 | |
| 1229 TestKeysThrow({ | |
| 1230 getOwnPropertyNames: function() { return [1, 2] }, | |
| 1231 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
| 1232 }) | |
| 1233 | |
| 1234 TestKeysThrow({ | |
| 1235 getOwnPropertyNames: function() { return this.getOwnPropertyNames2() }, | |
| 1236 getOwnPropertyNames2: function() { throw "myexn" }, | |
| 1237 }) | |
| 1238 | |
| 1239 TestKeysThrow({ | |
| 1240 getOwnPropertyNames: function() { return this.getOwnPropertyNames2() }, | |
| 1241 getOwnPropertyNames2: function() { return [1, 2] }, | |
| 1242 getOwnPropertyDescriptor: function(k) { | |
| 1243 return this.getOwnPropertyDescriptor2(k) | |
| 1244 }, | |
| 1245 getOwnPropertyDescriptor2: function(k) { throw "myexn" } | |
| 1246 }) | |
| 1247 | |
| 1248 TestKeysThrow({ | |
| 1249 get getOwnPropertyNames() { throw "myexn" } | |
| 1250 }) | |
| 1251 | |
| 1252 TestKeysThrow({ | |
| 1253 get getOwnPropertyNames() { | |
| 1254 return function() { throw "myexn" } | |
| 1255 }, | |
| 1256 }) | |
| 1257 | |
| 1258 TestKeysThrow([], { | |
| 1259 get getOwnPropertyNames() { | |
| 1260 return function() { return [1, 2] } | |
| 1261 }, | |
| 1262 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
| 1263 }) | |
| 1264 | |
| 1265 | |
| 806 | 1266 |
| 807 // Fixing (Object.freeze, Object.seal, Object.preventExtensions, | 1267 // Fixing (Object.freeze, Object.seal, Object.preventExtensions, |
| 808 // Object.isFrozen, Object.isSealed, Object.isExtensible) | 1268 // Object.isFrozen, Object.isSealed, Object.isExtensible) |
| 809 | 1269 |
| 1270 // TODO(rossberg): use TestWithProxies to include funciton proxies | |
| 810 function TestFix(names, handler) { | 1271 function TestFix(names, handler) { |
| 811 var proto = {p: 77} | 1272 var proto = {p: 77} |
| 812 var assertFixing = function(o, s, f, e) { | 1273 var assertFixing = function(o, s, f, e) { |
| 813 assertEquals(s, Object.isSealed(o)) | 1274 assertEquals(s, Object.isSealed(o)) |
| 814 assertEquals(f, Object.isFrozen(o)) | 1275 assertEquals(f, Object.isFrozen(o)) |
| 815 assertEquals(e, Object.isExtensible(o)) | 1276 assertEquals(e, Object.isExtensible(o)) |
| 816 } | 1277 } |
| 817 | 1278 |
| 818 var o1 = Proxy.create(handler, proto) | 1279 var p1 = Proxy.create(handler, proto) |
| 819 assertFixing(o1, false, false, true) | 1280 assertFixing(p1, false, false, true) |
| 820 Object.seal(o1) | 1281 Object.seal(p1) |
| 821 assertFixing(o1, true, names.length === 0, false) | 1282 assertFixing(p1, true, names.length === 0, false) |
| 822 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(o1).sort()) | 1283 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p1).sort()) |
| 823 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), | 1284 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
| 824 Object.keys(o1).sort()) | 1285 Object.keys(p1).sort()) |
| 825 assertEquals(proto, Object.getPrototypeOf(o1)) | 1286 assertEquals(proto, Object.getPrototypeOf(p1)) |
| 826 assertEquals(77, o1.p) | 1287 assertEquals(77, p1.p) |
| 827 for (var n in o1) { | 1288 for (var n in p1) { |
| 828 var desc = Object.getOwnPropertyDescriptor(o1, n) | 1289 var desc = Object.getOwnPropertyDescriptor(p1, n) |
| 829 if (desc !== undefined) assertFalse(desc.configurable) | 1290 if (desc !== undefined) assertFalse(desc.configurable) |
| 830 } | 1291 } |
| 831 | 1292 |
| 832 var o2 = Proxy.create(handler, proto) | 1293 var p2 = Proxy.create(handler, proto) |
| 833 assertFixing(o2, false, false, true) | 1294 assertFixing(p2, false, false, true) |
| 834 Object.freeze(o2) | 1295 Object.freeze(p2) |
| 835 assertFixing(o2, true, true, false) | 1296 assertFixing(p2, true, true, false) |
| 836 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(o2).sort()) | 1297 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p2).sort()) |
| 837 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), | 1298 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
| 838 Object.keys(o2).sort()) | 1299 Object.keys(p2).sort()) |
| 839 assertEquals(proto, Object.getPrototypeOf(o2)) | 1300 assertEquals(proto, Object.getPrototypeOf(p2)) |
| 840 assertEquals(77, o2.p) | 1301 assertEquals(77, p2.p) |
| 841 for (var n in o2) { | 1302 for (var n in p2) { |
| 842 var desc = Object.getOwnPropertyDescriptor(o2, n) | 1303 var desc = Object.getOwnPropertyDescriptor(p2, n) |
| 843 if (desc !== undefined) assertFalse(desc.writable) | 1304 if (desc !== undefined) assertFalse(desc.writable) |
| 844 if (desc !== undefined) assertFalse(desc.configurable) | 1305 if (desc !== undefined) assertFalse(desc.configurable) |
| 845 } | 1306 } |
| 846 | 1307 |
| 847 var o3 = Proxy.create(handler, proto) | 1308 var p3 = Proxy.create(handler, proto) |
| 848 assertFixing(o3, false, false, true) | 1309 assertFixing(p3, false, false, true) |
| 849 Object.preventExtensions(o3) | 1310 Object.preventExtensions(p3) |
| 850 assertFixing(o3, names.length === 0, names.length === 0, false) | 1311 assertFixing(p3, names.length === 0, names.length === 0, false) |
| 851 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(o3).sort()) | 1312 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p3).sort()) |
| 852 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), | 1313 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
| 853 Object.keys(o3).sort()) | 1314 Object.keys(p3).sort()) |
| 854 assertEquals(proto, Object.getPrototypeOf(o3)) | 1315 assertEquals(proto, Object.getPrototypeOf(p3)) |
| 855 assertEquals(77, o3.p) | 1316 assertEquals(77, p3.p) |
| 856 } | 1317 } |
| 857 | 1318 |
| 858 TestFix([], { | 1319 TestFix([], { |
| 859 fix: function() { return {} } | 1320 fix: function() { return {} } |
| 860 }) | 1321 }) |
| 861 | 1322 |
| 862 TestFix(["a", "b", "c", "d", "zz"], { | 1323 TestFix(["a", "b", "c", "d", "zz"], { |
| 863 fix: function() { | 1324 fix: function() { |
| 864 return { | 1325 return { |
| 865 a: {value: "a", writable: true, configurable: false, enumerable: true}, | 1326 a: {value: "a", writable: true, configurable: false, enumerable: true}, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 905 }, function() {}) | 1366 }, function() {}) |
| 906 fix(f3) | 1367 fix(f3) |
| 907 assertEquals(0, f1.length) | 1368 assertEquals(0, f1.length) |
| 908 } | 1369 } |
| 909 | 1370 |
| 910 TestFixFunction(Object.seal) | 1371 TestFixFunction(Object.seal) |
| 911 TestFixFunction(Object.freeze) | 1372 TestFixFunction(Object.freeze) |
| 912 TestFixFunction(Object.preventExtensions) | 1373 TestFixFunction(Object.preventExtensions) |
| 913 | 1374 |
| 914 | 1375 |
| 1376 function TestFixThrow(handler) { | |
| 1377 TestWithProxies(TestFixThrow2, handler) | |
| 1378 } | |
| 1379 | |
| 1380 function TestFixThrow2(handler) { | |
| 1381 var p = Proxy.create(handler, {}) | |
| 1382 assertThrows(function(){ Object.seal(p) }, "myexn") | |
| 1383 assertThrows(function(){ Object.freeze(p) }, "myexn") | |
| 1384 assertThrows(function(){ Object.preventExtensions(p) }, "myexn") | |
| 1385 } | |
| 1386 | |
| 1387 TestFixThrow({ | |
| 1388 fix: function() { throw "myexn" } | |
| 1389 }) | |
| 1390 | |
| 1391 TestFixThrow({ | |
| 1392 fix: function() { return this.fix2() }, | |
| 1393 fix2: function() { throw "myexn" } | |
| 1394 }) | |
| 1395 | |
| 1396 TestFixThrow({ | |
| 1397 get fix() { throw "myexn" } | |
| 1398 }) | |
| 1399 | |
| 1400 TestFixThrow({ | |
| 1401 get fix() { | |
| 1402 return function() { throw "myexn" } | |
| 1403 } | |
| 1404 }) | |
| 1405 | |
| 1406 | |
| 915 | 1407 |
| 916 // String conversion (Object.prototype.toString, Object.prototype.toLocaleString ) | 1408 // String conversion (Object.prototype.toString, Object.prototype.toLocaleString ) |
| 917 | 1409 |
| 918 var key | 1410 var key |
| 919 | 1411 |
| 920 function TestToString(handler) { | 1412 function TestToString(handler) { |
| 921 var o = Proxy.create(handler) | 1413 var p = Proxy.create(handler) |
| 922 key = "" | 1414 key = "" |
| 923 assertEquals("[object Object]", Object.prototype.toString.call(o)) | 1415 assertEquals("[object Object]", Object.prototype.toString.call(p)) |
| 924 assertEquals("", key) | 1416 assertEquals("", key) |
| 925 assertEquals("my_proxy", Object.prototype.toLocaleString.call(o)) | 1417 assertEquals("my_proxy", Object.prototype.toLocaleString.call(p)) |
| 926 assertEquals("toString", key) | 1418 assertEquals("toString", key) |
| 927 | 1419 |
| 928 var f = Proxy.createFunction(handler, function() {}) | 1420 var f = Proxy.createFunction(handler, function() {}) |
| 929 key = "" | 1421 key = "" |
| 930 assertEquals("[object Function]", Object.prototype.toString.call(f)) | 1422 assertEquals("[object Function]", Object.prototype.toString.call(f)) |
| 931 assertEquals("", key) | 1423 assertEquals("", key) |
| 932 assertEquals("my_proxy", Object.prototype.toLocaleString.call(o)) | 1424 assertEquals("my_proxy", Object.prototype.toLocaleString.call(f)) |
| 933 assertEquals("toString", key) | 1425 assertEquals("toString", key) |
| 934 } | 1426 } |
| 935 | 1427 |
| 936 TestToString({ | 1428 TestToString({ |
| 937 get: function(r, k) { key = k; return function() { return "my_proxy" } } | 1429 get: function(r, k) { key = k; return function() { return "my_proxy" } } |
| 938 }) | 1430 }) |
| 939 | 1431 |
| 940 TestToString({ | 1432 TestToString({ |
| 941 get: function(r, k) { return this.get2(r, k) }, | 1433 get: function(r, k) { return this.get2(r, k) }, |
| 942 get2: function(r, k) { key = k; return function() { return "my_proxy" } } | 1434 get2: function(r, k) { key = k; return function() { return "my_proxy" } } |
| 943 }) | 1435 }) |
| 944 | 1436 |
| 945 TestToString(Proxy.create({ | 1437 TestToString(Proxy.create({ |
| 946 get: function(pr, pk) { | 1438 get: function(pr, pk) { |
| 947 return function(r, k) { key = k; return function() { return "my_proxy" } } | 1439 return function(r, k) { key = k; return function() { return "my_proxy" } } |
| 948 } | 1440 } |
| 949 })) | 1441 })) |
| 950 | 1442 |
| 951 | 1443 |
| 1444 function TestToStringThrow(handler) { | |
| 1445 var p = Proxy.create(handler) | |
| 1446 assertEquals("[object Object]", Object.prototype.toString.call(p)) | |
| 1447 assertThrows(function(){ Object.prototype.toLocaleString.call(p) }, "myexn") | |
| 1448 | |
| 1449 var f = Proxy.createFunction(handler, function() {}) | |
| 1450 assertEquals("[object Function]", Object.prototype.toString.call(f)) | |
| 1451 assertThrows(function(){ Object.prototype.toLocaleString.call(f) }, "myexn") | |
| 1452 } | |
| 1453 | |
| 1454 TestToStringThrow({ | |
| 1455 get: function(r, k) { throw "myexn" } | |
| 1456 }) | |
| 1457 | |
| 1458 TestToStringThrow({ | |
| 1459 get: function(r, k) { return function() { throw "myexn" } } | |
| 1460 }) | |
| 1461 | |
| 1462 TestToStringThrow({ | |
| 1463 get: function(r, k) { return this.get2(r, k) }, | |
| 1464 get2: function(r, k) { throw "myexn" } | |
| 1465 }) | |
| 1466 | |
| 1467 TestToStringThrow(Proxy.create({ | |
| 1468 get: function(pr, pk) { throw "myexn" } | |
| 1469 })) | |
| 1470 | |
| 1471 TestToStringThrow(Proxy.create({ | |
| 1472 get: function(pr, pk) { | |
| 1473 return function(r, k) { throw "myexn" } | |
| 1474 } | |
| 1475 })) | |
| 1476 | |
| 1477 | |
| 952 | 1478 |
| 953 // Value conversion (Object.prototype.toValue) | 1479 // Value conversion (Object.prototype.toValue) |
| 954 | 1480 |
| 955 function TestValueOf(handler) { | 1481 function TestValueOf(handler) { |
| 956 TestWithProxies(TestValueOf2, handler) | 1482 TestWithProxies(TestValueOf2, handler) |
| 957 } | 1483 } |
| 958 | 1484 |
| 959 function TestValueOf2(handler, create) { | 1485 function TestValueOf2(handler, create) { |
| 960 var o = create(handler) | 1486 var p = create(handler) |
| 961 assertSame(o, Object.prototype.valueOf.call(o)) | 1487 assertSame(p, Object.prototype.valueOf.call(p)) |
| 962 } | 1488 } |
| 963 | 1489 |
| 964 TestValueOf({}) | 1490 TestValueOf({}) |
| 965 | 1491 |
| 966 | 1492 |
| 967 | 1493 |
| 968 // Enumerability (Object.prototype.propertyIsEnumerable) | 1494 // Enumerability (Object.prototype.propertyIsEnumerable) |
| 969 | 1495 |
| 970 var key | 1496 var key |
| 971 | 1497 |
| 972 function TestIsEnumerable(handler) { | 1498 function TestIsEnumerable(handler) { |
| 973 TestWithProxies(TestIsEnumerable2, handler) | 1499 TestWithProxies(TestIsEnumerable2, handler) |
| 974 } | 1500 } |
| 975 | 1501 |
| 976 function TestIsEnumerable2(handler, create) { | 1502 function TestIsEnumerable2(handler, create) { |
| 977 var o = create(handler) | 1503 var p = create(handler) |
| 978 assertTrue(Object.prototype.propertyIsEnumerable.call(o, "a")) | 1504 assertTrue(Object.prototype.propertyIsEnumerable.call(p, "a")) |
| 979 assertEquals("a", key) | 1505 assertEquals("a", key) |
| 980 assertTrue(Object.prototype.propertyIsEnumerable.call(o, 2)) | 1506 assertTrue(Object.prototype.propertyIsEnumerable.call(p, 2)) |
| 981 assertEquals("2", key) | 1507 assertEquals("2", key) |
| 982 assertFalse(Object.prototype.propertyIsEnumerable.call(o, "z")) | 1508 assertFalse(Object.prototype.propertyIsEnumerable.call(p, "z")) |
| 983 assertEquals("z", key) | 1509 assertEquals("z", key) |
| 984 } | 1510 } |
| 985 | 1511 |
| 986 TestIsEnumerable({ | 1512 TestIsEnumerable({ |
| 987 getOwnPropertyDescriptor: function(k) { | 1513 getOwnPropertyDescriptor: function(k) { |
| 988 key = k; return {enumerable: k < "z", configurable: true} | 1514 key = k; return {enumerable: k < "z", configurable: true} |
| 989 }, | 1515 }, |
| 990 }) | 1516 }) |
| 991 | 1517 |
| 992 TestIsEnumerable({ | 1518 TestIsEnumerable({ |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1006 | 1532 |
| 1007 TestIsEnumerable(Proxy.create({ | 1533 TestIsEnumerable(Proxy.create({ |
| 1008 get: function(pr, pk) { | 1534 get: function(pr, pk) { |
| 1009 return function(k) { | 1535 return function(k) { |
| 1010 key = k; return {enumerable: k < "z", configurable: true} | 1536 key = k; return {enumerable: k < "z", configurable: true} |
| 1011 } | 1537 } |
| 1012 } | 1538 } |
| 1013 })) | 1539 })) |
| 1014 | 1540 |
| 1015 | 1541 |
| 1542 function TestIsEnumerableThrow(handler) { | |
| 1543 TestWithProxies(TestIsEnumerableThrow2, handler) | |
| 1544 } | |
| 1545 | |
| 1546 function TestIsEnumerableThrow2(handler, create) { | |
| 1547 var p = create(handler) | |
| 1548 assertThrows(function(){ Object.prototype.propertyIsEnumerable.call(p, "a") }, | |
| 1549 "myexn") | |
| 1550 assertThrows(function(){ Object.prototype.propertyIsEnumerable.call(p, 11) }, | |
| 1551 "myexn") | |
| 1552 } | |
| 1553 | |
| 1554 TestIsEnumerableThrow({ | |
| 1555 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
| 1556 }) | |
| 1557 | |
| 1558 TestIsEnumerableThrow({ | |
| 1559 getOwnPropertyDescriptor: function(k) { | |
| 1560 return this.getOwnPropertyDescriptor2(k) | |
| 1561 }, | |
| 1562 getOwnPropertyDescriptor2: function(k) { throw "myexn" } | |
| 1563 }) | |
| 1564 | |
| 1565 TestIsEnumerableThrow({ | |
| 1566 getOwnPropertyDescriptor: function(k) { | |
| 1567 return {get enumerable() { throw "myexn" }, configurable: true} | |
| 1568 }, | |
| 1569 }) | |
| 1570 | |
| 1571 TestIsEnumerableThrow(Proxy.create({ | |
| 1572 get: function(pr, pk) { throw "myexn" } | |
| 1573 })) | |
| 1574 | |
| 1575 TestIsEnumerableThrow(Proxy.create({ | |
| 1576 get: function(pr, pk) { | |
| 1577 return function(k) { throw "myexn" } | |
| 1578 } | |
| 1579 })) | |
| 1580 | |
| 1581 | |
| 1016 | 1582 |
| 1017 // Calling (call, Function.prototype.call, Function.prototype.apply, | 1583 // Calling (call, Function.prototype.call, Function.prototype.apply, |
| 1018 // Function.prototype.bind). | 1584 // Function.prototype.bind). |
| 1019 | 1585 |
| 1020 var global = this | 1586 var global = this |
| 1021 var receiver | 1587 var receiver |
| 1022 | 1588 |
| 1023 function TestCall(isStrict, callTrap) { | 1589 function TestCall(isStrict, callTrap) { |
| 1024 assertEquals(42, callTrap(5, 37)) | 1590 assertEquals(42, callTrap(5, 37)) |
| 1025 // TODO(rossberg): unrelated bug: this does not succeed for optimized code. | 1591 // TODO(rossberg): unrelated bug: this does not succeed for optimized code. |
| 1026 // assertEquals(isStrict ? undefined : global, receiver) | 1592 // assertEquals(isStrict ? undefined : global, receiver) |
| 1027 | 1593 |
| 1028 var f = Proxy.createFunction({fix: function() { return {} }}, callTrap) | 1594 var f = Proxy.createFunction({fix: function() { return {} }}, callTrap) |
| 1029 | |
| 1030 receiver = 333 | 1595 receiver = 333 |
| 1031 assertEquals(42, f(11, 31)) | 1596 assertEquals(42, f(11, 31)) |
| 1032 assertEquals(isStrict ? undefined : global, receiver) | 1597 assertEquals(isStrict ? undefined : global, receiver) |
| 1033 var o = {} | 1598 var o = {} |
| 1034 assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) | 1599 assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) |
| 1035 assertEquals(o, receiver) | 1600 assertEquals(o, receiver) |
| 1036 receiver = 333 | 1601 receiver = 333 |
| 1037 assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) | 1602 assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) |
| 1038 assertEquals(o, receiver) | 1603 assertEquals(o, receiver) |
| 1039 var ff = Function.prototype.bind.call(f, o, 12) | 1604 var ff = Function.prototype.bind.call(f, o, 12) |
| 1040 receiver = 333 | 1605 receiver = 333 |
| 1041 assertEquals(42, ff(30)) | 1606 assertEquals(42, ff(30)) |
| 1042 assertEquals(o, receiver) | 1607 assertEquals(o, receiver) |
| 1043 receiver = 333 | 1608 receiver = 333 |
| 1044 assertEquals(32, Function.prototype.apply.call(ff, {}, [20])) | 1609 assertEquals(32, Function.prototype.apply.call(ff, {}, [20])) |
| 1045 assertEquals(o, receiver) | 1610 assertEquals(o, receiver) |
| 1046 | 1611 |
| 1047 Object.freeze(f) | 1612 Object.freeze(f) |
| 1048 | |
| 1049 receiver = 333 | 1613 receiver = 333 |
| 1050 assertEquals(42, f(11, 31)) | 1614 assertEquals(42, f(11, 31)) |
| 1051 // TODO(rossberg): unrelated bug: this does not succeed for optimized code. | 1615 // TODO(rossberg): unrelated bug: this does not succeed for optimized code. |
| 1052 // assertEquals(isStrict ? undefined : global, receiver) | 1616 // assertEquals(isStrict ? undefined : global, receiver) |
| 1053 receiver = 333 | 1617 receiver = 333 |
| 1054 assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) | 1618 assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) |
| 1055 assertEquals(o, receiver) | 1619 assertEquals(o, receiver) |
| 1056 receiver = 333 | 1620 receiver = 333 |
| 1057 assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) | 1621 assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) |
| 1058 assertEquals(o, receiver) | 1622 assertEquals(o, receiver) |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 1080 TestCall(true, Proxy.createFunction({}, function(x, y) { | 1644 TestCall(true, Proxy.createFunction({}, function(x, y) { |
| 1081 "use strict"; | 1645 "use strict"; |
| 1082 receiver = this; return x + y | 1646 receiver = this; return x + y |
| 1083 })) | 1647 })) |
| 1084 | 1648 |
| 1085 var p = Proxy.createFunction({fix: function() {return {}}}, function(x, y) { | 1649 var p = Proxy.createFunction({fix: function() {return {}}}, function(x, y) { |
| 1086 receiver = this; return x + y | 1650 receiver = this; return x + y |
| 1087 }) | 1651 }) |
| 1088 Object.freeze(p) | 1652 Object.freeze(p) |
| 1089 TestCall(false, p) | 1653 TestCall(false, p) |
| 1654 | |
| 1655 | |
| 1656 function TestCallThrow(callTrap) { | |
| 1657 var f = Proxy.createFunction({fix: function() {return {}}}, callTrap) | |
| 1658 assertThrows(function(){ f(11) }, "myexn") | |
| 1659 assertThrows(function(){ Function.prototype.call.call(f, {}, 2) }, "myexn") | |
| 1660 assertThrows(function(){ Function.prototype.apply.call(f, {}, [1]) }, "myexn") | |
| 1661 | |
| 1662 Object.freeze(f) | |
| 1663 assertThrows(function(){ f(11) }, "myexn") | |
| 1664 assertThrows(function(){ Function.prototype.call.call(f, {}, 2) }, "myexn") | |
| 1665 assertThrows(function(){ Function.prototype.apply.call(f, {}, [1]) }, "myexn") | |
| 1666 } | |
| 1667 | |
| 1668 TestCallThrow(function() { throw "myexn" }) | |
| 1669 TestCallThrow(Proxy.createFunction({}, function() { throw "myexn" })) | |
| 1670 | |
| 1671 var p = Proxy.createFunction( | |
| 1672 {fix: function() {return {}}}, function() { throw "myexn" }) | |
| 1673 Object.freeze(p) | |
| 1674 TestCallThrow(p) | |
| OLD | NEW |