13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 23fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Redistribution and use in source and binary forms, with or without 33fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// modification, are permitted provided that the following conditions are 43fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// met: 53fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// 63fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// * Redistributions of source code must retain the above copyright 73fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// notice, this list of conditions and the following disclaimer. 83fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// * Redistributions in binary form must reproduce the above 93fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// copyright notice, this list of conditions and the following 103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// disclaimer in the documentation and/or other materials provided 113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// with the distribution. 123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// * Neither the name of Google Inc. nor the names of its 133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// contributors may be used to endorse or promote products derived 143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// from this software without specific prior written permission. 153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// 163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 28589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Flags: --harmony-proxies 29589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Helper. 32592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestWithProxies(test, x, y, z) { 343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch test(Proxy.create, x, y, z) 353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch test(function(h) {return Proxy.createFunction(h, function() {})}, x, y, z) 363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 37592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 38592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Getting property descriptors (Object.getOwnPropertyDescriptor). 413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar key 433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestGetOwnProperty(handler) { 453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestWithProxies(TestGetOwnProperty2, handler) 463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestGetOwnProperty2(create, handler) { 493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(42, Object.getOwnPropertyDescriptor(p, "a").value) 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("a", key) 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(42, Object.getOwnPropertyDescriptor(p, 99).value) 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("99", key) 54592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 55592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestGetOwnProperty({ 573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor: function(k) { 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = k 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return {value: 42, configurable: true} 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 633ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestGetOwnProperty({ 643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor: function(k) { 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this.getOwnPropertyDescriptor2(k) 663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }, 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor2: function(k) { 683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = k 693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return {value: 42, configurable: true} 703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestGetOwnProperty({ 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor: function(k) { 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = k 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return {get value() { return 42 }, get configurable() { return true }} 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestGetOwnProperty(Proxy.create({ 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get: function(pr, pk) { 823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return function(k) { key = k; return {value: 42, configurable: true} } 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})) 85592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestGetOwnPropertyThrow(handler) { 883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestWithProxies(TestGetOwnPropertyThrow2, handler) 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestGetOwnPropertyThrow2(create, handler) { 923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ Object.getOwnPropertyDescriptor(p, "a") }, "myexn") 943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ Object.getOwnPropertyDescriptor(p, 77) }, "myexn") 953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestGetOwnPropertyThrow({ 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor: function(k) { throw "myexn" } 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestGetOwnPropertyThrow({ 1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor: function(k) { 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this.getPropertyDescriptor2(k) 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }, 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor2: function(k) { throw "myexn" } 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestGetOwnPropertyThrow({ 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor: function(k) { 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return {get value() { throw "myexn" }} 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestGetOwnPropertyThrow(Proxy.create({ 1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get: function(pr, pk) { 1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return function(k) { throw "myexn" } 1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})) 1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Getters (dot, brackets). 1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar key 1253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestGet(handler) { 127589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestGet2, handler) 128589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 129589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestGet2(create, handler) { 131589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 132589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(42, p.a) 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("a", key) 134589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(42, p["b"]) 1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("b", key) 1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(42, p[99]) 1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("99", key) 1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(42, (function(n) { return p[n] })("c")) 1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("c", key) 1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(42, (function(n) { return p[n] })(101)) 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("101", key) 142589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p, {x: {value: 88}}) 1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(42, o.a) 1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("a", key) 1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(42, o["b"]) 1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("b", key) 1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(42, o[99]) 1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("99", key) 1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(88, o.x) 1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(88, o["x"]) 1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(42, (function(n) { return o[n] })("c")) 1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("c", key) 1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(42, (function(n) { return o[n] })(101)) 1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("101", key) 1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(88, (function(n) { return o[n] })("x")) 1573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 1583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1593fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGet({ 1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get: function(r, k) { key = k; return 42 } 1613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 16269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1633fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGet({ 1643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get: function(r, k) { return this.get2(r, k) }, 1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get2: function(r, k) { key = k; return 42 } 1663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 16769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1683fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGet({ 1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function(k) { key = k; return {value: 42} } 1703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 17169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1723fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGet({ 1733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, 1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor2: function(k) { key = k; return {value: 42} } 1753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 17669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1773fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGet({ 1783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { 1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = k; 1803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return {get value() { return 42 }} 1813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 1823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 18369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1843fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGet({ 1853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get: undefined, 1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function(k) { key = k; return {value: 42} } 1873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 1883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1893fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGet(Proxy.create({ 1903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get: function(pr, pk) { 1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return function(r, k) { key = k; return 42 } 1923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 1933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch})) 1943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestGetCall(handler) { 197589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestGetCall2, handler) 198589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 199589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestGetCall2(create, handler) { 201589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 2023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(55, p.f()) 2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, p["f"]()) 2043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(55, p.f("unused", "arguments")) 2053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(55, p.f.call(p)) 2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, p["f"].call(p)) 2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, p[101].call(p)) 2083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(55, p.withargs(45, 5)) 2093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(55, p.withargs.call(p, 11, 22)) 2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, (function(n) { return p[n]() })("f")) 2113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, (function(n) { return p[n].call(p) })("f")) 2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, (function(n) { return p[n](15, 20) })("withargs")) 2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, (function(n) { return p[n].call(p, 13, 21) })("withargs")) 2143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("6655", "66" + p) // calls p.toString 2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p, {g: {value: function(x) { return x + 88 }}}) 2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, o.f()) 2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, o["f"]()) 2193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, o.f("unused", "arguments")) 2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, o.f.call(o)) 2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, o.f.call(p)) 2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, o["f"].call(p)) 2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, o[101].call(p)) 2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, o.withargs(45, 5)) 2253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, o.withargs.call(p, 11, 22)) 2263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(90, o.g(2)) 2273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(91, o.g.call(o, 3)) 2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(92, o.g.call(p, 4)) 2293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, (function(n) { return o[n]() })("f")) 2303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, (function(n) { return o[n].call(o) })("f")) 2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, (function(n) { return o[n](15, 20) })("withargs")) 2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(55, (function(n) { return o[n].call(o, 13, 21) })("withargs")) 2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(93, (function(n) { return o[n](5) })("g")) 2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(94, (function(n) { return o[n].call(o, 6) })("g")) 2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(95, (function(n) { return o[n].call(p, 7) })("g")) 2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("6655", "66" + o) // calls o.toString 2373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 2383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2393fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGetCall({ 2403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get: function(r, k) { return function() { return 55 } } 2413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 24269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2433fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGetCall({ 2443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get: function(r, k) { return this.get2(r, k) }, 2453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get2: function(r, k) { return function() { return 55 } } 2463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 24769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2483fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGetCall({ 2493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { 2503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return {value: function() { return 55 }} 2513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 25369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2543fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGetCall({ 2553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, 2563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor2: function(k) { 2573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return {value: function() { return 55 }} 2583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 26069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2613fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGetCall({ 2623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { 2633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return {get value() { return function() { return 55 } }} 2643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 26669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2673fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGetCall({ 2683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get: undefined, 2693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { 2703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return {value: function() { return 55 }} 2713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 27369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2743fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGetCall({ 2753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get: function(r, k) { 2763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (k == "gg") { 2773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return function() { return 55 } 2783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (k == "withargs") { 2793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return function(n, m) { return n + m * 2 } 2803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 2813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return function() { return this.gg() } 2823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 2853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2863fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestGetCall(Proxy.create({ 2873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get: function(pr, pk) { 2883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return function(r, k) { return function() { return 55 } } 2893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch})) 2913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 293589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestGetThrow(handler) { 294589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestGetThrow2, handler) 295589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 296589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestGetThrow2(create, handler) { 298589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 299589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ p.a }, "myexn") 300589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ p["b"] }, "myexn") 3013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ p[3] }, "myexn") 3023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ (function(n) { p[n] })("c") }, "myexn") 3033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ (function(n) { p[n] })(99) }, "myexn") 3043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p, {x: {value: 88}, '4': {value: 89}}) 3063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ o.a }, "myexn") 3073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ o["b"] }, "myexn") 3083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ o[3] }, "myexn") 3093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ (function(n) { o[n] })("c") }, "myexn") 3103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ (function(n) { o[n] })(99) }, "myexn") 311589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 312589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 313589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestGetThrow({ 314589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(r, k) { throw "myexn" } 315589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 316589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 317589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestGetThrow({ 318589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(r, k) { return this.get2(r, k) }, 319589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get2: function(r, k) { throw "myexn" } 320589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 321589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 322589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestGetThrow({ 323589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { throw "myexn" } 324589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 325589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 326589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestGetThrow({ 327589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, 328589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor2: function(k) { throw "myexn" } 329589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 330589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 331589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestGetThrow({ 332589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { 333589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return {get value() { throw "myexn" }} 334589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 335589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 336589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 337589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestGetThrow({ 338589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: undefined, 339589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { throw "myexn" } 340589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 341589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 342589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestGetThrow(Proxy.create({ 343589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { throw "myexn" } 344589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 345589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 346589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestGetThrow(Proxy.create({ 347589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { 348589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return function(r, k) { throw "myexn" } 349589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 350589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 351589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 352589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 3533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Setters. 3553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar key 3573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar val 358589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 3593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestSet(handler) { 360589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestSet2, handler) 361589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 362589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 3633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestSet2(create, handler) { 364589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 365589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(42, p.a = 42) 3663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("a", key) 3673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(42, val) 368589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(43, p["b"] = 43) 3693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("b", key) 3703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(43, val) 3713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(44, p[77] = 44) 3723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("77", key) 3733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(44, val) 3743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(45, (function(n) { return p[n] = 45 })("c")) 3763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("c", key) 3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(45, val) 3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(46, (function(n) { return p[n] = 46 })(99)) 3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("99", key) 3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(46, val) 3813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 3823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3833fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestSet({ 3843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set: function(r, k, v) { key = k; val = v; return true } 3853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 38669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 3873fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestSet({ 3883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set: function(r, k, v) { return this.set2(r, k, v) }, 3893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set2: function(r, k, v) { key = k; val = v; return true } 3903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 39169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 3923fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestSet({ 3933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor: function(k) { return {writable: true} }, 3943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch defineProperty: function(k, desc) { key = k; val = desc.value } 3953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 39669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 3973fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestSet({ 3983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor: function(k) { 3993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return this.getOwnPropertyDescriptor2(k) 4003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }, 4013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor2: function(k) { return {writable: true} }, 4023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch defineProperty: function(k, desc) { this.defineProperty2(k, desc) }, 4033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch defineProperty2: function(k, desc) { key = k; val = desc.value } 4043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 40569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4063fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestSet({ 4073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor: function(k) { 4083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return {get writable() { return true }} 4093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }, 4103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch defineProperty: function(k, desc) { key = k; val = desc.value } 4113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 41269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4133fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestSet({ 4143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor: function(k) { 4153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return {set: function(v) { key = k; val = v }} 4163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 4173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 41869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4193fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestSet({ 4203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor: function(k) { return null }, 4213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { return {writable: true} }, 4223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch defineProperty: function(k, desc) { key = k; val = desc.value } 4233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 42469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4253fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestSet({ 4263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor: function(k) { return null }, 4273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { 4283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return {get writable() { return true }} 4293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }, 4303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch defineProperty: function(k, desc) { key = k; val = desc.value } 4313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 43269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4333fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestSet({ 4343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor: function(k) { return null }, 4353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { 4363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return {set: function(v) { key = k; val = v }} 4373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 4383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 43969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4403fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestSet({ 4413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor: function(k) { return null }, 4423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { return null }, 4433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch defineProperty: function(k, desc) { key = k, val = desc.value } 4443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 4453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4463fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestSet(Proxy.create({ 4473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get: function(pr, pk) { 4483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return function(r, k, v) { key = k; val = v; return true } 4493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 4503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch})) 4513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestSetThrow(handler) { 454589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestSetThrow2, handler) 455589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 456589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestSetThrow2(create, handler) { 458589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 459589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ p.a = 42 }, "myexn") 460589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ p["b"] = 42 }, "myexn") 4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ p[22] = 42 }, "myexn") 4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ (function(n) { p[n] = 45 })("c") }, "myexn") 4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ (function(n) { p[n] = 46 })(99) }, "myexn") 464589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 465589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 466589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 467589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch set: function(r, k, v) { throw "myexn" } 468589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 469589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 470589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 471589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch set: function(r, k, v) { return this.set2(r, k, v) }, 472589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch set2: function(r, k, v) { throw "myexn" } 473589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 474589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 475589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 476589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { throw "myexn" }, 477589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, desc) { key = k; val = desc.value } 478589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 479589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 480589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 481589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { return {writable: true} }, 482589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, desc) { throw "myexn" } 483589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 484589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 485589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 486589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { 487589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return this.getOwnPropertyDescriptor2(k) 488589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, 489589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor2: function(k) { throw "myexn" }, 490589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, desc) { this.defineProperty2(k, desc) }, 491589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty2: function(k, desc) { key = k; val = desc.value } 492589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 493589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 494589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 495589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { 496589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return this.getOwnPropertyDescriptor2(k) 497589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, 498589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor2: function(k) { return {writable: true} }, 499589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, desc) { this.defineProperty2(k, desc) }, 500589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty2: function(k, desc) { throw "myexn" } 501589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 502589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 503589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 504589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { throw "myexn" }, 505589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, desc) { key = k; val = desc.value } 506589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 507589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 508589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 509589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { 510589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return {get writable() { return true }} 511589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, 512589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, desc) { throw "myexn" } 513589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 514589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 515589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 516589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { throw "myexn" } 517589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 518589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 519589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 520589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { 521589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return {set: function(v) { throw "myexn" }} 522589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 523589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 524589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 525589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 526589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { throw "myexn" }, 527589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { return {writable: true} }, 528589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, desc) { key = k; val = desc.value } 529589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 530589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 531589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 532589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { return null }, 533589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { throw "myexn" }, 534589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, desc) { key = k; val = desc.value } 535589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 536589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 537589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 538589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { return null }, 539589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { return {writable: true} }, 540589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, desc) { throw "myexn" } 541589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 542589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 543589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 544589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { return null }, 545589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { 546589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return {get writable() { throw "myexn" }} 547589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, 548589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, desc) { key = k; val = desc.value } 549589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 550589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 551589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 552589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { return null }, 553589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { 554589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return {set: function(v) { throw "myexn" }} 555589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 556589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 557589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 558589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow({ 559589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { return null }, 560589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { return null }, 561589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, desc) { throw "myexn" } 562589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 563589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 564589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow(Proxy.create({ 565589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { throw "myexn" } 566589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 567589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 568589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestSetThrow(Proxy.create({ 569589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { 570589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return function(r, k, v) { throw "myexn" } 571589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 572589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 573589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 574589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 5753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar key 5763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar val 5773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestSetForDerived(handler) { 5793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestWithProxies(TestSetForDerived2, handler) 5803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestSetForDerived2(create, handler) { 5833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 5843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p, {x: {value: 88, writable: true}, 5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch '1': {value: 89, writable: true}}) 5863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = "" 5883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(48, o.x = 48) 5893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("", key) // trap not invoked 5903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(48, o.x) 5913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(47, o[1] = 47) 5933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("", key) // trap not invoked 5943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(47, o[1]) 5953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(49, o.y = 49) 5973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("y", key) 5983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(49, o.y) 5993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(50, o[2] = 50) 6013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("2", key) 6023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(50, o[2]) 6033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(44, o.p_writable = 44) 6053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("p_writable", key) 6063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(44, o.p_writable) 6073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(45, o.p_nonwritable = 45) 6093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("p_nonwritable", key) 6103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(45, o.p_nonwritable) 6113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(46, o.p_setter = 46) 6133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("p_setter", key) 6143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(46, val) // written to parent 6153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.hasOwnProperty.call(o, "p_setter")) 6163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch val = "" 6183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(47, o.p_nosetter = 47) 6193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("p_nosetter", key) 6203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("", val) // not written at all 6213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.hasOwnProperty.call(o, "p_nosetter")); 6223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = "" 6243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ "use strict"; o.p_nosetter = 50 }, TypeError) 6253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("p_nosetter", key) 6263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("", val) // not written at all 6273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ o.p_nonconf = 53 }, TypeError) 6293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("p_nonconf", key) 6303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ o.p_throw = 51 }, "myexn") 6323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("p_throw", key) 6333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ o.p_setterthrow = 52 }, "myexn") 6353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("p_setterthrow", key) 6363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestSetForDerived({ 6393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function(k) { 6403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = k; 6413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (k) { 6423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "p_writable": return {writable: true, configurable: true} 6433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "p_nonwritable": return {writable: false, configurable: true} 6443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "p_setter":return {set: function(x) { val = x }, configurable: true} 6453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "p_nosetter": return {get: function() { return 1 }, configurable: true} 6463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "p_nonconf":return {} 6473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "p_throw": throw "myexn" 6483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "p_setterthrow": return {set: function(x) { throw "myexn" }} 6493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch default: return undefined 6503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 6533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Evil proxy-induced side-effects shouldn't crash. 6563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// TODO(rossberg): proper behaviour isn't really spec'ed yet, so ignore results. 6573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestWithProxies(function(create) { 6593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var calls = 0 6603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 6613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function() { 6623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ++calls 6633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return (calls % 2 == 1) 6643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? {get: function() { return 5 }, configurable: true} 6653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : {set: function() { return false }, configurable: true} 6663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 6693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p) 6703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Make proxy prototype property read-only after CanPut check. 6713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { o.x = 4 } catch (e) { assertInstanceof(e, Error) } 6723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 6733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestWithProxies(function(create) { 6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function() { 6773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object.defineProperty(o, "x", {get: function() { return 5 }}); 6783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return {set: function() {}} 6793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 6823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p) 6833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Make object property read-only after CanPut check. 6843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { o.x = 4 } catch (e) { assertInstanceof(e, Error) } 6853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 6863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// TODO(rossberg): TestSetReject, returning false 6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// TODO(rossberg): TestGetProperty, TestSetProperty 6913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 693589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 6943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Property definition (Object.defineProperty and Object.defineProperties). 6953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar key 6973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar desc 698589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 6993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestDefine(handler) { 700589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestDefine2, handler) 701589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 702589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 7033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestDefine2(create, handler) { 704589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 705589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(p, Object.defineProperty(p, "a", {value: 44})) 7063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("a", key) 7073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(1, Object.getOwnPropertyNames(desc).length) 7083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(44, desc.value) 7093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 710589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(p, Object.defineProperty(p, "b", {value: 45, writable: false})) 7113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("b", key) 7123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(2, Object.getOwnPropertyNames(desc).length) 7133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(45, desc.value) 7143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(false, desc.writable) 7153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 716589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(p, Object.defineProperty(p, "c", {value: 46, enumerable: false})) 7173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("c", key) 7183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(2, Object.getOwnPropertyNames(desc).length) 7193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(46, desc.value) 7203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(false, desc.enumerable) 7213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(p, Object.defineProperty(p, 101, {value: 47, enumerable: false})) 7233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("101", key) 7243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(2, Object.getOwnPropertyNames(desc).length) 7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(47, desc.value) 7263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(false, desc.enumerable) 7273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var attributes = {configurable: true, mine: 66, minetoo: 23} 729589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(p, Object.defineProperty(p, "d", attributes)) 7303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("d", key) 7313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Modifying the attributes object after the fact should have no effect. 7323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch attributes.configurable = false 7333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch attributes.mine = 77 7343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch delete attributes.minetoo 7353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(3, Object.getOwnPropertyNames(desc).length) 7363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(true, desc.configurable) 7373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(66, desc.mine) 7383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(23, desc.minetoo) 7393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 740589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(p, Object.defineProperty(p, "e", {get: function(){ return 5 }})) 7413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("e", key) 7423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(1, Object.getOwnPropertyNames(desc).length) 7433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(5, desc.get()) 7443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 745589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(p, Object.defineProperty(p, "zzz", {})) 7463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("zzz", key) 7473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(0, Object.getOwnPropertyNames(desc).length) 7483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var d = create({ 7503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get: function(r, k) { return (k === "value") ? 77 : void 0 }, 7513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyNames: function() { return ["value"] }, 7523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enumerate: function() { return ["value"] } 7533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }) 7543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(1, Object.getOwnPropertyNames(d).length) 7553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(77, d.value) 7563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(p, Object.defineProperty(p, "p", d)) 7573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("p", key) 7583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(1, Object.getOwnPropertyNames(desc).length) 7593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(77, desc.value) 7603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var props = { 7623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch '11': {}, 7633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch blub: {get: function() { return true }}, 7643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch '': {get value() { return 20 }}, 7653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch last: {value: 21, configurable: true, mine: "eyes"} 7663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 7673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Object.defineProperty(props, "hidden", {value: "hidden", enumerable: false}) 768589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(p, Object.defineProperties(p, props)) 7693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("last", key) 7703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(2, Object.getOwnPropertyNames(desc).length) 7713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(21, desc.value) 7723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(true, desc.configurable) 7733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(undefined, desc.mine) // Arguably a bug in the spec... 774589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 775589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var props = {bla: {get value() { throw "myexn" }}} 776589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.defineProperties(p, props) }, "myexn") 7773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 7783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7793fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestDefine({ 7803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch defineProperty: function(k, d) { key = k; desc = d; return true } 7813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 78269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 7833fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestDefine({ 7843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch defineProperty: function(k, d) { return this.defineProperty2(k, d) }, 7853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch defineProperty2: function(k, d) { key = k; desc = d; return true } 7863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 78769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 7883fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestDefine(Proxy.create({ 7893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get: function(pr, pk) { 7903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return function(k, d) { key = k; desc = d; return true } 7913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 7923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch})) 7933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 795589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestDefineThrow(handler) { 796589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestDefineThrow2, handler) 797589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 798589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 7993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestDefineThrow2(create, handler) { 800589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 801589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.defineProperty(p, "a", {value: 44})}, "myexn") 8023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ Object.defineProperty(p, 0, {value: 44})}, "myexn") 8033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var d1 = create({ 8053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get: function(r, k) { throw "myexn" }, 8063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyNames: function() { return ["value"] } 8073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }) 8083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ Object.defineProperty(p, "p", d1) }, "myexn") 8093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var d2 = create({ 8103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get: function(r, k) { return 77 }, 8113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyNames: function() { throw "myexn" } 8123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }) 8133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ Object.defineProperty(p, "p", d2) }, "myexn") 814589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 815589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var props = {bla: {get value() { throw "otherexn" }}} 816589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.defineProperties(p, props) }, "otherexn") 817589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 818589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 819589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestDefineThrow({ 820589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, d) { throw "myexn" } 821589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 822589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 823589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestDefineThrow({ 824589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty: function(k, d) { return this.defineProperty2(k, d) }, 825589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch defineProperty2: function(k, d) { throw "myexn" } 826589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 827589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 828589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestDefineThrow(Proxy.create({ 829589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { throw "myexn" } 830589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 831589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 832589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestDefineThrow(Proxy.create({ 833589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { 834589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return function(k, d) { throw "myexn" } 835589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 836589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 837589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 838589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 8393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Property deletion (delete). 8413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar key 843589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 8443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestDelete(handler) { 845589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestDelete2, handler) 846589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 847589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 8483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestDelete2(create, handler) { 849589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 850589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(true, delete p.a) 8513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("a", key) 852589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(true, delete p["b"]) 8533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("b", key) 8543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(true, delete p[1]) 8553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("1", key) 8563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 857589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(false, delete p.z1) 8583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("z1", key) 859589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(false, delete p["z2"]) 8603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("z2", key); 8613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch (function() { 8633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch "use strict" 864589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(true, delete p.c) 8653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("c", key) 866589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(true, delete p["d"]) 8673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("d", key) 8683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(true, delete p[2]) 8693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("2", key) 8703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 871589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ delete p.z3 }, TypeError) 8723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("z3", key) 873589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ delete p["z4"] }, TypeError) 8743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("z4", key) 8753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch })() 8763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 8773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8783fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestDelete({ 879589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch delete: function(k) { key = k; return k < "z" } 8803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 88169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 8823fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestDelete({ 883589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch delete: function(k) { return this.delete2(k) }, 8843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch delete2: function(k) { key = k; return k < "z" } 8853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 88669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 8873fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestDelete(Proxy.create({ 8883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get: function(pr, pk) { 8893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return function(k) { key = k; return k < "z" } 8903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 8913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch})) 8923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 894589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestDeleteThrow(handler) { 895589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestDeleteThrow2, handler) 896589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 897589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 8983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestDeleteThrow2(create, handler) { 899589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 900589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ delete p.a }, "myexn") 901589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ delete p["b"] }, "myexn"); 9023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ delete p[3] }, "myexn"); 903589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 904589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch (function() { 905589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch "use strict" 906589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ delete p.c }, "myexn") 907589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ delete p["d"] }, "myexn") 9083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ delete p[4] }, "myexn"); 909589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch })() 910589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 911589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 912589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestDeleteThrow({ 913589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch delete: function(k) { throw "myexn" } 914589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 915589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 916589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestDeleteThrow({ 917589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch delete: function(k) { return this.delete2(k) }, 918589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch delete2: function(k) { throw "myexn" } 919589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 920589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 921589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestDeleteThrow(Proxy.create({ 922589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { throw "myexn" } 923589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 924589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 925589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestDeleteThrow(Proxy.create({ 926589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { 927589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return function(k) { throw "myexn" } 928589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 929589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 930589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 931589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 9323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Property descriptors (Object.getOwnPropertyDescriptor). 9343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestDescriptor(handler) { 936589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestDescriptor2, handler) 937589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 938589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 9393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestDescriptor2(create, handler) { 940589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 9413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var descs = [ 9423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch {configurable: true}, 9433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch {value: 34, enumerable: true, configurable: true}, 9443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch {value: 3, writable: false, mine: "eyes", configurable: true}, 9453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch {get value() { return 20 }, get configurable() { return true }}, 9463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch {get: function() { "get" }, set: function() { "set" }, configurable: true} 9473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ] 9483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (var i = 0; i < descs.length; ++i) { 949589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(p, Object.defineProperty(p, i, descs[i])) 950589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var desc = Object.getOwnPropertyDescriptor(p, i) 951589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch for (prop in descs[i]) { 9523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // TODO(rossberg): Ignore user attributes as long as the spec isn't 9533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // fixed suitably. 954589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch if (prop != "mine") assertEquals(descs[i][prop], desc[prop]) 9553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 956589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(undefined, Object.getOwnPropertyDescriptor(p, "absent")) 9573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 9583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 9593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9603fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestDescriptor({ 9613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch defineProperty: function(k, d) { this["__" + k] = d; return true }, 9623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor: function(k) { return this["__" + k] } 9633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 96469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 9653fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestDescriptor({ 9663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch defineProperty: function(k, d) { this["__" + k] = d; return true }, 9673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor: function(k) { 9683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return this.getOwnPropertyDescriptor2(k) 9693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }, 9703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor2: function(k) { return this["__" + k] } 9713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 9723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 974589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestDescriptorThrow(handler) { 975589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestDescriptorThrow2, handler) 976589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 977589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 9783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestDescriptorThrow2(create, handler) { 979589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 980589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.getOwnPropertyDescriptor(p, "a") }, "myexn") 981589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 982589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 983589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestDescriptorThrow({ 984589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { throw "myexn" } 985589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 986589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 987589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestDescriptorThrow({ 988589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { 989589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return this.getOwnPropertyDescriptor2(k) 990589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, 991589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor2: function(k) { throw "myexn" } 992589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 993589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 994589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 9953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Comparison. 9973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestComparison(eq) { 999589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestComparison2, eq) 1000589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1001589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 10023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestComparison2(create, eq) { 1003589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p1 = create({}) 1004589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p2 = create({}) 1005589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1006589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(eq(p1, p1)) 1007589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(eq(p2, p2)) 1008589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(!eq(p1, p2)) 1009589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(!eq(p1, {})) 1010589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(!eq({}, p2)) 10113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(!eq({}, {})) 10123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 10133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10143fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestComparison(function(o1, o2) { return o1 == o2 }) 10153fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestComparison(function(o1, o2) { return o1 === o2 }) 10163fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestComparison(function(o1, o2) { return !(o1 != o2) }) 10173fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestComparison(function(o1, o2) { return !(o1 !== o2) }) 10183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1021589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Type (typeof). 10223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1023589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestTypeof() { 1024589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals("object", typeof Proxy.create({})) 1025589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(typeof Proxy.create({}) == "object") 1026589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue("object" == typeof Proxy.create({})) 10273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1028589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals("function", typeof Proxy.createFunction({}, function() {})) 1029589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(typeof Proxy.createFunction({}, function() {}) == "function") 1030589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue("function" == typeof Proxy.createFunction({}, function() {})) 1031589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1032589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1033589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestTypeof() 10343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 103769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Membership test (in). 10383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar key 1040589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 10413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestIn(handler) { 1042589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestIn2, handler) 1043589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1044589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 10453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestIn2(create, handler) { 1046589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 1047589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue("a" in p) 10483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("a", key) 1049589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(99 in p) 10503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("99", key) 1051589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertFalse("z" in p) 10523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("z", key) 10533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1054589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(2, ("a" in p) ? 2 : 0) 1055589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(0, !("a" in p) ? 2 : 0) 1056589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(0, ("zzz" in p) ? 2 : 0) 1057589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(2, !("zzz" in p) ? 2 : 0) 1058589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 10593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Test compilation in conditionals. 1060589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch if ("b" in p) { 10613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 10623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(false) 10633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 10643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("b", key) 10653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1066589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch if ("zz" in p) { 10673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(false) 10683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 10693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("zz", key) 10703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1071589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch if (!("c" in p)) { 10723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(false) 10733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 10743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("c", key) 10753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1076589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch if (!("zzz" in p)) { 10773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 10783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(false) 10793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 10803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals("zzz", key) 10813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 10823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10833fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestIn({ 10843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch has: function(k) { key = k; return k < "z" } 10853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 108669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10873fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestIn({ 10883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch has: function(k) { return this.has2(k) }, 10893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch has2: function(k) { key = k; return k < "z" } 10903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 109169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10923fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestIn({ 10933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { 10943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch key = k; return k < "z" ? {value: 42} : void 0 10953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 10963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 109769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10983fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestIn({ 10993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, 11003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor2: function(k) { 11013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch key = k; return k < "z" ? {value: 42} : void 0 11023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 11033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 110469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 11053fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestIn({ 11063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { 11073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch key = k; return k < "z" ? {get value() { return 42 }} : void 0 11083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 11093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 111069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 11113fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestIn({ 11123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch has: undefined, 11133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getPropertyDescriptor: function(k) { 11143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch key = k; return k < "z" ? {value: 42} : void 0 11153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 11163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 11173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11183fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestIn(Proxy.create({ 11193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get: function(pr, pk) { 11203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return function(k) { key = k; return k < "z" } 11213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 11223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch})) 11233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1125589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestInThrow(handler) { 1126589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestInThrow2, handler) 1127589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1128589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 11293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestInThrow2(create, handler) { 1130589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 1131589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ return "a" in o }, "myexn") 11323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ return 99 in o }, "myexn") 1133589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ return !("a" in o) }, "myexn") 1134589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ return ("a" in o) ? 2 : 3 }, "myexn") 1135589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ if ("b" in o) {} }, "myexn") 1136589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ if (!("b" in o)) {} }, "myexn") 1137589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ if ("zzz" in o) {} }, "myexn") 1138589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1139589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1140589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestInThrow({ 1141589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch has: function(k) { throw "myexn" } 1142589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1143589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1144589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestInThrow({ 1145589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch has: function(k) { return this.has2(k) }, 1146589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch has2: function(k) { throw "myexn" } 1147589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1148589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1149589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestInThrow({ 1150589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { throw "myexn" } 1151589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1152589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1153589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestInThrow({ 1154589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, 1155589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor2: function(k) { throw "myexn" } 1156589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1157589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1158589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestInThrow({ 11593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch has: undefined, 1160589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getPropertyDescriptor: function(k) { throw "myexn" } 1161589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1162589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1163589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestInThrow(Proxy.create({ 1164589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { throw "myexn" } 1165589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 1166589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1167589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestInThrow(Proxy.create({ 1168589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { 1169589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return function(k) { throw "myexn" } 1170589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 1171589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 1172589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1173589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 11743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestInForDerived(handler) { 11753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestWithProxies(TestInForDerived2, handler) 11763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestInForDerived2(create, handler) { 11793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 11803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p) 11813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue("a" in o) 11833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("a", key) 11843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(99 in o) 11853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("99", key) 11863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse("z" in o) 11873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("z", key) 11883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(2, ("a" in o) ? 2 : 0) 11903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(0, !("a" in o) ? 2 : 0) 11913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(0, ("zzz" in o) ? 2 : 0) 11923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(2, !("zzz" in o) ? 2 : 0) 11933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if ("b" in o) { 11953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 11963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(false) 11973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 11983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("b", key) 11993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if ("zz" in o) { 12013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(false) 12023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("zz", key) 12043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!("c" in o)) { 12063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(false) 12073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("c", key) 12093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!("zzz" in o)) { 12113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 12123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(false) 12133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("zzz", key) 12153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12173ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestInForDerived({ 12183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function(k) { 12193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = k; return k < "z" ? {value: 42, configurable: true} : void 0 12203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 12223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestInForDerived({ 12243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, 12253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor2: function(k) { 12263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = k; return k < "z" ? {value: 42, configurable: true} : void 0 12273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 12293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestInForDerived({ 12313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function(k) { 12323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = k; 12333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return k < "z" ? {get value() { return 42 }, configurable: true} : void 0 12343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 12363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch/* TODO(rossberg): this will work once we implement the newest proposal 12383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch * regarding default traps for getPropertyDescriptor. 12393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestInForDerived({ 12403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor: function(k) { 12413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = k; return k < "z" ? {value: 42, configurable: true} : void 0 12423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 12443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestInForDerived({ 12463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor: function(k) { 12473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this.getOwnPropertyDescriptor2(k) 12483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }, 12493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor2: function(k) { 12503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = k; return k < "z" ? {value: 42, configurable: true} : void 0 12513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 12533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12543ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestInForDerived({ 12553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor: function(k) { 12563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = k; 12573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return k < "z" ? {get value() { return 42 }, configurable: true} : void 0 12583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 12603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch*/ 12613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestInForDerived(Proxy.create({ 12633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get: function(pr, pk) { 12643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return function(k) { 12653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = k; return k < "z" ? {value: 42, configurable: true} : void 0 12663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})) 12693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Property descriptor conversion. 12733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar descget 12753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestDescriptorGetOrder(handler) { 12773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = Proxy.create(handler) 12783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p, {b: {value: 0}}) 12793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestDescriptorGetOrder2(function(n) { return p[n] }, "vV") 12803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestDescriptorGetOrder2(function(n) { return n in p }, "") 12813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestDescriptorGetOrder2(function(n) { return o[n] }, "vV") 12823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestDescriptorGetOrder2(function(n) { return n in o }, "eEcCvVwWgs") 12833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestDescriptorGetOrder2(f, access) { 12863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch descget = "" 12873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(f("a")) 12883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(access, descget) 12893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch descget = "" 12903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(f(99)) 12913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(access, descget) 12923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch descget = "" 12933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(!!f("z")) 12943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("", descget) 12953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestDescriptorGetOrder({ 12983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function(k) { 12993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (k >= "z") return void 0 13003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return a proxy as property descriptor, so that we can log accesses. 13013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Proxy.create({ 13023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get: function(r, attr) { 13033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch descget += attr[0].toUpperCase() 13043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return true 13053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }, 13063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch has: function(attr) { 13073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch descget += attr[0] 13083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (attr) { 13093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "writable": 13103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "enumerable": 13113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "configurable": 13123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "value": 13133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return true 13143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "get": 13153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case "set": 13163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return false 13173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch default: 13183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertUnreachable() 13193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }) 13223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 13243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 132769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Own Properties (Object.prototype.hasOwnProperty). 132869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 132969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvar key 1330589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 133169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction TestHasOwn(handler) { 1332589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestHasOwn2, handler) 1333589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1334589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 13353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestHasOwn2(create, handler) { 1336589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 1337589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(Object.prototype.hasOwnProperty.call(p, "a")) 133869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertEquals("a", key) 1339589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(Object.prototype.hasOwnProperty.call(p, 99)) 134069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertEquals("99", key) 1341589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertFalse(Object.prototype.hasOwnProperty.call(p, "z")) 134269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertEquals("z", key) 134369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 134469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 134569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestHasOwn({ 134669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch hasOwn: function(k) { key = k; return k < "z" } 134769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}) 134869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 134969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestHasOwn({ 135069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch hasOwn: function(k) { return this.hasOwn2(k) }, 135169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch hasOwn2: function(k) { key = k; return k < "z" } 135269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}) 135369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 135469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestHasOwn({ 135569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch getOwnPropertyDescriptor: function(k) { 135669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch key = k; return k < "z" ? {value: 42} : void 0 135769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 135869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}) 135969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 136069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestHasOwn({ 136169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch getOwnPropertyDescriptor: function(k) { 136269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return this.getOwnPropertyDescriptor2(k) 136369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch }, 136469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch getOwnPropertyDescriptor2: function(k) { 136569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch key = k; return k < "z" ? {value: 42} : void 0 136669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 136769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}) 136869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 136969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestHasOwn({ 137069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch getOwnPropertyDescriptor: function(k) { 137169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch key = k; return k < "z" ? {get value() { return 42 }} : void 0 137269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 137369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}) 137469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 137569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestHasOwn({ 137669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch hasOwn: undefined, 137769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch getOwnPropertyDescriptor: function(k) { 137869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch key = k; return k < "z" ? {value: 42} : void 0 137969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 138069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}) 138169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 138269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestHasOwn(Proxy.create({ 138369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch get: function(pr, pk) { 138469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return function(k) { key = k; return k < "z" } 138569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 138669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch})) 138769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 138869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1389589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestHasOwnThrow(handler) { 1390589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestHasOwnThrow2, handler) 1391589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1392589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 13933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestHasOwnThrow2(create, handler) { 1394589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 1395589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.prototype.hasOwnProperty.call(p, "a")}, 1396589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch "myexn") 1397589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.prototype.hasOwnProperty.call(p, 99)}, 1398589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch "myexn") 1399589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1400589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1401589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestHasOwnThrow({ 1402589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch hasOwn: function(k) { throw "myexn" } 1403589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1404589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1405589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestHasOwnThrow({ 1406589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch hasOwn: function(k) { return this.hasOwn2(k) }, 1407589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch hasOwn2: function(k) { throw "myexn" } 1408589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1409589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1410589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestHasOwnThrow({ 1411589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { throw "myexn" } 1412589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1413589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1414589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestHasOwnThrow({ 1415589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { 1416589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return this.getOwnPropertyDescriptor2(k) 1417589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, 1418589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor2: function(k) { throw "myexn" } 1419589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1420589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1421589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestHasOwnThrow({ 1422589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch hasOwn: undefined, 1423589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { throw "myexn" } 1424589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1425589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1426589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestHasOwnThrow(Proxy.create({ 1427589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { throw "myexn" } 1428589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 1429589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1430589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestHasOwnThrow(Proxy.create({ 1431589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { 1432589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return function(k) { throw "myexn" } 1433589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 1434589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 1435589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1436589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 143769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 143869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Instanceof (instanceof) 14393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 14403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestProxyInstanceof() { 14413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o1 = {} 14423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var p1 = Proxy.create({}) 14433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p2 = Proxy.create({}, o1) 14443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var p3 = Proxy.create({}, p2) 14453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o2 = Object.create(p2) 14463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1447589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var f0 = function() {} 14483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch f0.prototype = o1 14493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var f1 = function() {} 14503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch f1.prototype = p1 14513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var f2 = function() {} 14523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch f2.prototype = p2 14533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var f3 = function() {} 14543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch f3.prototype = o2 14553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(o1 instanceof Object) 14573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o1 instanceof f0) 14583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o1 instanceof f1) 14593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o1 instanceof f2) 14603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o1 instanceof f3) 14613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertFalse(p1 instanceof Object) 1462589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertFalse(p1 instanceof f0) 14633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertFalse(p1 instanceof f1) 14643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertFalse(p1 instanceof f2) 14653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(p1 instanceof f3) 14663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(p2 instanceof Object) 1467589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(p2 instanceof f0) 14683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertFalse(p2 instanceof f1) 14693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertFalse(p2 instanceof f2) 14703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(p2 instanceof f3) 14713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(p3 instanceof Object) 1472589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(p3 instanceof f0) 14733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertFalse(p3 instanceof f1) 14743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(p3 instanceof f2) 14753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(p3 instanceof f3) 14763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(o2 instanceof Object) 14773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(o2 instanceof f0) 14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o2 instanceof f1) 14793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(o2 instanceof f2) 14803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o2 instanceof f3) 1481589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1482589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var f = Proxy.createFunction({}, function() {}) 1483589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(f instanceof Function) 14843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 14853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 14863ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestProxyInstanceof() 14873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestInstanceofProxy() { 14903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o0 = Object.create(null) 14913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o1 = {} 14923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o2 = Object.create(o0) 14933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o3 = Object.create(o1) 14943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o4 = Object.create(o2) 14953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o5 = Object.create(o3) 14963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch function handler(o) { return {get: function() { return o } } } 14983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var f0 = Proxy.createFunction(handler(o0), function() {}) 14993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var f1 = Proxy.createFunction(handler(o1), function() {}) 15003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var f2 = Proxy.createFunction(handler(o2), function() {}) 15013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var f3 = Proxy.createFunction(handler(o3), function() {}) 15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var f4 = Proxy.createFunction(handler(o4), function() {}) 15033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var f5 = Proxy.createFunction(handler(o4), function() {}) 15043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(null instanceof f0) 15063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o0 instanceof f0) 15073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o0 instanceof f1) 15083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o0 instanceof f2) 15093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o0 instanceof f3) 15103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o0 instanceof f4) 15113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o0 instanceof f5) 15123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o1 instanceof f0) 15133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o1 instanceof f1) 15143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o1 instanceof f2) 15153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o1 instanceof f3) 15163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o1 instanceof f4) 15173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o1 instanceof f5) 15183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(o2 instanceof f0) 15193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o2 instanceof f1) 15203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o2 instanceof f2) 15213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o2 instanceof f3) 15223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o2 instanceof f4) 15233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o2 instanceof f5) 15243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o3 instanceof f0) 15253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(o3 instanceof f1) 15263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o3 instanceof f2) 15273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o3 instanceof f3) 15283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o3 instanceof f4) 15293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o3 instanceof f5) 15303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(o4 instanceof f0) 15313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o4 instanceof f1) 15323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(o4 instanceof f2) 15333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o4 instanceof f3) 15343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o4 instanceof f4) 15353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o4 instanceof f5) 15363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o5 instanceof f0) 15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(o5 instanceof f1) 15383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o5 instanceof f2) 15393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(o5 instanceof f3) 15403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o5 instanceof f4) 15413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(o5 instanceof f5) 15423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var f = Proxy.createFunction({}, function() {}) 15443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var ff = Proxy.createFunction(handler(Function), function() {}) 15453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(f instanceof Function) 15463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(f instanceof ff) 15473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15493ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestInstanceofProxy() 15503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 15513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 15523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 155369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Prototype (Object.getPrototypeOf, Object.prototype.isPrototypeOf). 15543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 15553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestPrototype() { 15563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o1 = {} 15573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var p1 = Proxy.create({}) 15583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p2 = Proxy.create({}, o1) 15593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var p3 = Proxy.create({}, p2) 15603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p4 = Proxy.create({}, null) 15613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o2 = Object.create(p3) 15623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 15633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertSame(Object.getPrototypeOf(o1), Object.prototype) 15643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertSame(Object.getPrototypeOf(p1), null) 15653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertSame(Object.getPrototypeOf(p2), o1) 15663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertSame(Object.getPrototypeOf(p3), p2) 15673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertSame(Object.getPrototypeOf(p4), null) 15683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertSame(Object.getPrototypeOf(o2), p3) 156969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 15703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(Object.prototype.isPrototypeOf(o1)) 157169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertFalse(Object.prototype.isPrototypeOf(p1)) 157269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertTrue(Object.prototype.isPrototypeOf(p2)) 157369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertTrue(Object.prototype.isPrototypeOf(p3)) 157469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertFalse(Object.prototype.isPrototypeOf(p4)) 15753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(Object.prototype.isPrototypeOf(o2)) 15763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, o1)) 157769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(Object.prototype, p1)) 157869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, p2)) 157969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, p3)) 158069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(Object.prototype, p4)) 15813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, o2)) 15823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(o1, o1)) 15833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(o1, p1)) 15843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(Object.prototype.isPrototypeOf.call(o1, p2)) 15853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(Object.prototype.isPrototypeOf.call(o1, p3)) 15863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(o1, p4)) 15873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(Object.prototype.isPrototypeOf.call(o1, o2)) 158869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(p1, p1)) 15893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(p1, o1)) 159069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(p1, p2)) 159169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(p1, p3)) 159269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(p1, p4)) 15933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(p1, o2)) 159469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(p2, p1)) 159569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(p2, p2)) 159669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertTrue(Object.prototype.isPrototypeOf.call(p2, p3)) 159769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(p2, p4)) 15983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(Object.prototype.isPrototypeOf.call(p2, o2)) 159969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(p3, p2)) 16003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(Object.prototype.isPrototypeOf.call(p3, o2)) 16013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(o2, o1)) 16023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(o2, p1)) 16033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(o2, p2)) 16043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(o2, p3)) 16053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(o2, p4)) 16063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.isPrototypeOf.call(o2, o2)) 1607589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1608589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var f = Proxy.createFunction({}, function() {}) 1609589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertSame(Object.getPrototypeOf(f), Function.prototype) 1610589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(Object.prototype.isPrototypeOf(f)) 1611589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(Object.prototype.isPrototypeOf.call(Function.prototype, f)) 16123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 16133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16143fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestPrototype() 16153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Property names (Object.getOwnPropertyNames, Object.keys). 16193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestPropertyNames(names, handler) { 16213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestWithProxies(TestPropertyNames2, handler, names) 1622589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1623589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 16243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestPropertyNames2(create, handler, names) { 16253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 16263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertArrayEquals(names, Object.getOwnPropertyNames(p)) 16273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 16283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16293fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestPropertyNames([], { 16303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyNames: function() { return [] } 16313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 163269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 16333fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestPropertyNames(["a", "zz", " ", "0"], { 16343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyNames: function() { return ["a", "zz", " ", 0] } 16353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 163669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 16373fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestPropertyNames(["throw", "function "], { 16383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyNames: function() { return this.getOwnPropertyNames2() }, 16393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyNames2: function() { return ["throw", "function "] } 16403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 164169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 16423fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestPropertyNames(["[object Object]"], { 16433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get getOwnPropertyNames() { 16443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return function() { return [{}] } 16453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 16463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 16473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1649589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestPropertyNamesThrow(handler) { 1650589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestPropertyNamesThrow2, handler) 1651589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1652589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 16533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestPropertyNamesThrow2(create, handler) { 1654589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 1655589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.getOwnPropertyNames(p) }, "myexn") 1656589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1657589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1658589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestPropertyNamesThrow({ 1659589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyNames: function() { throw "myexn" } 1660589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1661589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1662589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestPropertyNamesThrow({ 1663589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyNames: function() { return this.getOwnPropertyNames2() }, 1664589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyNames2: function() { throw "myexn" } 1665589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1666589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1667589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 16683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestKeys(names, handler) { 16693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestWithProxies(TestKeys2, handler, names) 1670589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1671589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 16723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestKeys2(create, handler, names) { 16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 16743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertArrayEquals(names, Object.keys(p)) 16753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 16763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16773fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestKeys([], { 16783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch keys: function() { return [] } 16793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 168069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 16813fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestKeys(["a", "zz", " ", "0"], { 16823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch keys: function() { return ["a", "zz", " ", 0] } 16833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 168469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 16853fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestKeys(["throw", "function "], { 16863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch keys: function() { return this.keys2() }, 16873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch keys2: function() { return ["throw", "function "] } 16883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 168969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 16903fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestKeys(["[object Object]"], { 16913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get keys() { 16923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return function() { return [{}] } 16933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 16943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 169569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 16963fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestKeys(["a", "0"], { 16973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyNames: function() { return ["a", 23, "zz", "", 0] }, 16983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor: function(k) { 16993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return k == "" ? undefined : {enumerable: k.length == 1} 17003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 17013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 170269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 17033fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestKeys(["23", "zz", ""], { 17043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyNames: function() { return this.getOwnPropertyNames2() }, 17053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyNames2: function() { return ["a", 23, "zz", "", 0] }, 17063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor: function(k) { 17073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return this.getOwnPropertyDescriptor2(k) 17083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }, 17093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor2: function(k) { return {enumerable: k.length != 1} } 17103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 171169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 17123fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestKeys(["a", "b", "c", "5"], { 17133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get getOwnPropertyNames() { 17143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return function() { return ["0", 4, "a", "b", "c", 5, "ety"] } 17153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }, 17163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get getOwnPropertyDescriptor() { 17173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return function(k) { 17183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return k == "ety" ? undefined : {enumerable: k >= "44"} 17193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 17203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 17213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 172269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 17233fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestKeys([], { 17243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get getOwnPropertyNames() { 17253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return function() { return ["a", "b", "c"] } 17263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }, 17273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch getOwnPropertyDescriptor: function(k) { return {} } 17283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 17293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1731589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestKeysThrow(handler) { 1732589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestKeysThrow2, handler) 1733589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1734589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 17353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestKeysThrow2(create, handler) { 1736589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 1737589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.keys(p) }, "myexn") 1738589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1739589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1740589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestKeysThrow({ 1741589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch keys: function() { throw "myexn" } 1742589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1743589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1744589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestKeysThrow({ 1745589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch keys: function() { return this.keys2() }, 1746589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch keys2: function() { throw "myexn" } 1747589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1748589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1749589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestKeysThrow({ 1750589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyNames: function() { throw "myexn" }, 1751589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { return true } 1752589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1753589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1754589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestKeysThrow({ 1755589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyNames: function() { return [1, 2] }, 1756589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { throw "myexn" } 1757589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1758589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1759589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestKeysThrow({ 1760589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyNames: function() { return this.getOwnPropertyNames2() }, 1761589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyNames2: function() { throw "myexn" }, 1762589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1763589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1764589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestKeysThrow({ 1765589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyNames: function() { return this.getOwnPropertyNames2() }, 1766589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyNames2: function() { return [1, 2] }, 1767589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { 1768589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return this.getOwnPropertyDescriptor2(k) 1769589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, 1770589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor2: function(k) { throw "myexn" } 1771589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1772589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1773589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestKeysThrow({ 1774589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get getOwnPropertyNames() { throw "myexn" } 1775589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1776589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1777589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestKeysThrow({ 1778589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get getOwnPropertyNames() { 1779589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return function() { throw "myexn" } 1780589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, 1781589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1782589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1783589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestKeysThrow([], { 1784589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get getOwnPropertyNames() { 1785589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return function() { return [1, 2] } 1786589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, 1787589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { throw "myexn" } 1788589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1789589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1790589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 17913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Fixing (Object.freeze, Object.seal, Object.preventExtensions, 17933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Object.isFrozen, Object.isSealed, Object.isExtensible) 17943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestFix(names, handler) { 17963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var proto = {p: 77} 17973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var assertFixing = function(o, s, f, e) { 17983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(s, Object.isSealed(o)) 17993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(f, Object.isFrozen(o)) 18003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertEquals(e, Object.isExtensible(o)) 18013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 18023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1803589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p1 = Proxy.create(handler, proto) 1804589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertFixing(p1, false, false, true) 1805589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Object.seal(p1) 1806589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertFixing(p1, true, names.length === 0, false) 1807589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p1).sort()) 18083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), 1809589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Object.keys(p1).sort()) 1810589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(proto, Object.getPrototypeOf(p1)) 1811589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(77, p1.p) 1812589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch for (var n in p1) { 1813589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var desc = Object.getOwnPropertyDescriptor(p1, n) 18143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (desc !== undefined) assertFalse(desc.configurable) 18153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 18163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1817589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p2 = Proxy.create(handler, proto) 1818589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertFixing(p2, false, false, true) 1819589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Object.freeze(p2) 1820589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertFixing(p2, true, true, false) 1821589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p2).sort()) 18223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), 1823589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Object.keys(p2).sort()) 1824589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(proto, Object.getPrototypeOf(p2)) 1825589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(77, p2.p) 1826589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch for (var n in p2) { 1827589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var desc = Object.getOwnPropertyDescriptor(p2, n) 18283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (desc !== undefined) assertFalse(desc.writable) 18293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (desc !== undefined) assertFalse(desc.configurable) 18303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 18313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1832589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p3 = Proxy.create(handler, proto) 1833589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertFixing(p3, false, false, true) 1834589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Object.preventExtensions(p3) 1835589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertFixing(p3, names.length === 0, names.length === 0, false) 1836589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p3).sort()) 18373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), 1838589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Object.keys(p3).sort()) 1839589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(proto, Object.getPrototypeOf(p3)) 1840589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(77, p3.p) 18413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = Proxy.create(handler, proto) 18433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p) 18443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFixing(p, false, false, true) 18453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFixing(o, false, false, true) 18463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object.freeze(o) 18473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFixing(p, false, false, true) 18483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFixing(o, true, true, false) 18493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 18503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 18513fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestFix([], { 18523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch fix: function() { return {} } 18533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 185469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 18553ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestFix(["a", "b", "c", "3", "zz"], { 18563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch fix: function() { 18573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return { 18583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch a: {value: "a", writable: true, configurable: false, enumerable: true}, 18593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch b: {value: 33, writable: false, configurable: false, enumerable: true}, 18603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch c: {value: 0, writable: true, configurable: true, enumerable: true}, 18613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch '3': {value: true, writable: false, configurable: true, enumerable: true}, 18623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch zz: {value: 0, enumerable: false} 18633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 18643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 18653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 186669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 18673fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestFix(["a"], { 18683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch fix: function() { return this.fix2() }, 18693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch fix2: function() { 18703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return {a: {value: 4, writable: true, configurable: true, enumerable: true}} 18713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 18723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 187369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 18743fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochTestFix(["b"], { 18753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch get fix() { 18763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return function() { 18773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return {b: {configurable: true, writable: true, enumerable: true}} 18783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 18793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 18803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}) 188169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 188269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1883589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestFixFunction(fix) { 1884589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var f1 = Proxy.createFunction({ 1885589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch fix: function() { return {} } 1886589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, function() {}) 1887589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch fix(f1) 1888589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(0, f1.length) 1889589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1890589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var f2 = Proxy.createFunction({ 1891589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch fix: function() { return {length: {value: 3}} } 1892589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, function() {}) 1893589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch fix(f2) 1894589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(3, f2.length) 1895589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1896589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var f3 = Proxy.createFunction({ 1897589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch fix: function() { return {length: {value: "huh"}} } 1898589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, function() {}) 1899589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch fix(f3) 1900589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals(0, f1.length) 1901589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 190269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1903589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestFixFunction(Object.seal) 1904589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestFixFunction(Object.freeze) 1905589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestFixFunction(Object.preventExtensions) 1906589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1907589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1908589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestFixThrow(handler) { 1909589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestFixThrow2, handler) 1910589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1911589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 19123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestFixThrow2(create, handler) { 19133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler, {}) 1914589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.seal(p) }, "myexn") 1915589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.freeze(p) }, "myexn") 1916589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.preventExtensions(p) }, "myexn") 1917589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 1918589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1919589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestFixThrow({ 1920589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch fix: function() { throw "myexn" } 1921589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1922589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1923589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestFixThrow({ 1924589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch fix: function() { return this.fix2() }, 1925589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch fix2: function() { throw "myexn" } 1926589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1927589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1928589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestFixThrow({ 1929589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get fix() { throw "myexn" } 1930589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1931589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1932589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestFixThrow({ 1933589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get fix() { 1934589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return function() { throw "myexn" } 1935589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 1936589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 1937589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1938589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 19393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Freeze a proxy in the middle of operations on it. 19403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// TODO(rossberg): actual behaviour not specified consistently at the moment, 19413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// just make sure that we do not crash. 19423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestReentrantFix(f) { 19433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestWithProxies(f, Object.freeze) 19443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestWithProxies(f, Object.seal) 19453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestWithProxies(f, Object.preventExtensions) 19463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19483ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestReentrantFix(function(create, freeze) { 19493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 19503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get get() { freeze(p); return undefined }, 19513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fix: function() { return {} } 19523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 19543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Freeze while getting get trap. 19553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { p.x } catch (e) { assertInstanceof(e, Error) } 19563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 19573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestReentrantFix(function(create, freeze) { 19593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 19603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get: function() { freeze(p); return 3 }, 19613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fix: function() { return {} } 19623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Freeze while executing get trap. 19653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { p.x } catch (e) { assertInstanceof(e, Error) } 19663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 19673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestReentrantFix(function(create, freeze) { 19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function() { freeze(p); return undefined }, 19713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fix: function() { return {} } 19723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 19743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Freeze while executing default get trap. 19753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { p.x } catch (e) { assertInstanceof(e, Error) } 19763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 19773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19783ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestReentrantFix(function(create, freeze) { 19793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 19803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function() { freeze(p); return {get: function(){}} }, 19813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fix: function() { return {} } 19823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 19843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p) 19853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Freeze while getting a property from prototype. 19863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { o.x } catch (e) { assertInstanceof(e, Error) } 19873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 19883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19893ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestReentrantFix(function(create, freeze) { 19903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 19913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get set() { freeze(p); return undefined }, 19923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fix: function() { return {} } 19933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 19953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Freeze while getting set trap. 19963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { p.x = 4 } catch (e) { assertInstanceof(e, Error) } 19973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 19983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19993ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestReentrantFix(function(create, freeze) { 20003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 20013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set: function() { freeze(p); return true }, 20023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fix: function() { return {} } 20033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 20053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Freeze while executing set trap. 20063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { p.x = 4 } catch (e) { assertInstanceof(e, Error) } 20073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 20083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20093ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestReentrantFix(function(create, freeze) { 20103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 20113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getOwnPropertyDescriptor: function() { freeze(p); return undefined }, 20123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fix: function() { return {} } 20133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 20153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Freeze while executing default set trap. 20163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { p.x } catch (e) { assertInstanceof(e, Error) } 20173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 20183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestReentrantFix(function(create, freeze) { 20203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 20213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function() { freeze(p); return {set: function(){}} }, 20223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fix: function() { return {} } 20233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 20253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p) 20263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Freeze while setting a property in prototype, dropping the property! 20273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { o.x = 4 } catch (e) { assertInstanceof(e, Error) } 20283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 20293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestReentrantFix(function(create, freeze) { 20313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 20323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch getPropertyDescriptor: function() { freeze(p); return {set: function(){}} }, 20333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fix: function() { return {x: {get: function(){}}} } 20343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 20363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p) 20373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Freeze while setting a property in prototype, making it read-only! 20383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { o.x = 4 } catch (e) { assertInstanceof(e, Error) } 20393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 20403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestReentrantFix(function(create, freeze) { 20423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 20433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch get fix() { freeze(p); return function(){} } 20443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 20463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Freeze while getting fix trap. 20473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { Object.freeze(p) } catch (e) { assertInstanceof(e, Error) } 20483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch p = create(handler) 20493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { Object.seal(p) } catch (e) { assertInstanceof(e, Error) } 20503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch p = create(handler) 20513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { Object.preventExtensions(p) } catch (e) { assertInstanceof(e, Error) } 20523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 20533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20543ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestReentrantFix(function(create, freeze) { 20553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var handler = { 20563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fix: function() { freeze(p); return {} } 20573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var p = create(handler) 20593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Freeze while executing fix trap. 20603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { Object.freeze(p) } catch (e) { assertInstanceof(e, Error) } 20613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch p = create(handler) 20623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { Object.seal(p) } catch (e) { assertInstanceof(e, Error) } 20633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch p = create(handler) 20643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch try { Object.preventExtensions(p) } catch (e) { assertInstanceof(e, Error) } 20653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}) 20663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2068589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2069589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// String conversion (Object.prototype.toString, 2070589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Object.prototype.toLocaleString, 2071589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Function.prototype.toString) 207269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 207369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvar key 2074589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 207569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction TestToString(handler) { 2076589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = Proxy.create(handler) 207769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch key = "" 2078589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals("[object Object]", Object.prototype.toString.call(p)) 207969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertEquals("", key) 2080589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals("my_proxy", Object.prototype.toLocaleString.call(p)) 208169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertEquals("toString", key) 2082589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2083589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var f = Proxy.createFunction(handler, function() {}) 2084589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch key = "" 2085589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals("[object Function]", Object.prototype.toString.call(f)) 2086589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals("", key) 2087589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals("my_proxy", Object.prototype.toLocaleString.call(f)) 2088589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals("toString", key) 2089589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertDoesNotThrow(function(){ Function.prototype.toString.call(f) }) 20903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p) 20923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = "" 20933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("[object Object]", Object.prototype.toString.call(o)) 20943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("", key) 20953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("my_proxy", Object.prototype.toLocaleString.call(o)) 20963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("toString", key) 209769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 209869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 209969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestToString({ 210069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch get: function(r, k) { key = k; return function() { return "my_proxy" } } 210169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}) 210269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 210369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestToString({ 210469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch get: function(r, k) { return this.get2(r, k) }, 210569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch get2: function(r, k) { key = k; return function() { return "my_proxy" } } 210669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}) 210769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 210869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestToString(Proxy.create({ 210969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch get: function(pr, pk) { 211069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return function(r, k) { key = k; return function() { return "my_proxy" } } 211169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 211269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch})) 211369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 211469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2115589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestToStringThrow(handler) { 2116589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = Proxy.create(handler) 2117589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals("[object Object]", Object.prototype.toString.call(p)) 2118589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.prototype.toLocaleString.call(p) }, "myexn") 2119589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2120589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var f = Proxy.createFunction(handler, function() {}) 2121589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertEquals("[object Function]", Object.prototype.toString.call(f)) 2122589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.prototype.toLocaleString.call(f) }, "myexn") 21233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p) 21253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("[object Object]", Object.prototype.toString.call(o)) 21263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function(){ Object.prototype.toLocaleString.call(o) }, "myexn") 2127589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 2128589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2129589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestToStringThrow({ 2130589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(r, k) { throw "myexn" } 2131589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 2132589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2133589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestToStringThrow({ 2134589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(r, k) { return function() { throw "myexn" } } 2135589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 2136589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2137589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestToStringThrow({ 2138589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(r, k) { return this.get2(r, k) }, 2139589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get2: function(r, k) { throw "myexn" } 2140589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 2141589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2142589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestToStringThrow(Proxy.create({ 2143589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { throw "myexn" } 2144589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 2145589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2146589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestToStringThrow(Proxy.create({ 2147589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { 2148589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return function(r, k) { throw "myexn" } 2149589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 2150589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 2151589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2152589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 215369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 215469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Value conversion (Object.prototype.toValue) 215569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 215669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction TestValueOf(handler) { 2157589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestValueOf2, handler) 2158589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 2159589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestValueOf2(create, handler) { 2161589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 2162589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertSame(p, Object.prototype.valueOf.call(p)) 216369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 216469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 216569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestValueOf({}) 216669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 216769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 216869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 216969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Enumerability (Object.prototype.propertyIsEnumerable) 217069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 217169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvar key 2172589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 217369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfunction TestIsEnumerable(handler) { 2174589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestIsEnumerable2, handler) 2175589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 2176589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 21773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestIsEnumerable2(create, handler) { 2178589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 2179589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(Object.prototype.propertyIsEnumerable.call(p, "a")) 218069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertEquals("a", key) 2181589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertTrue(Object.prototype.propertyIsEnumerable.call(p, 2)) 218269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertEquals("2", key) 2183589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertFalse(Object.prototype.propertyIsEnumerable.call(p, "z")) 218469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertEquals("z", key) 21853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = Object.create(p) 21873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key = "" 21883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertFalse(Object.prototype.propertyIsEnumerable.call(o, "a")) 21893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals("", key) // trap not invoked 219069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 219169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 219269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestIsEnumerable({ 219369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch getOwnPropertyDescriptor: function(k) { 219469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch key = k; return {enumerable: k < "z", configurable: true} 219569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch }, 219669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}) 219769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 219869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestIsEnumerable({ 219969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch getOwnPropertyDescriptor: function(k) { 220069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return this.getOwnPropertyDescriptor2(k) 220169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch }, 220269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch getOwnPropertyDescriptor2: function(k) { 220369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch key = k; return {enumerable: k < "z", configurable: true} 220469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch }, 220569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}) 220669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 220769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestIsEnumerable({ 220869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch getOwnPropertyDescriptor: function(k) { 220969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch key = k; return {get enumerable() { return k < "z" }, configurable: true} 221069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch }, 221169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}) 221269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 221369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochTestIsEnumerable(Proxy.create({ 221469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch get: function(pr, pk) { 221569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return function(k) { 221669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch key = k; return {enumerable: k < "z", configurable: true} 221769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 221869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 221969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch})) 2220589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2221589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2222589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction TestIsEnumerableThrow(handler) { 2223589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch TestWithProxies(TestIsEnumerableThrow2, handler) 2224589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 2225589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 22263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestIsEnumerableThrow2(create, handler) { 2227589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch var p = create(handler) 2228589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.prototype.propertyIsEnumerable.call(p, "a") }, 2229589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch "myexn") 2230589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch assertThrows(function(){ Object.prototype.propertyIsEnumerable.call(p, 11) }, 2231589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch "myexn") 2232589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 2233589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2234589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestIsEnumerableThrow({ 2235589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { throw "myexn" } 2236589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 2237589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2238589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestIsEnumerableThrow({ 2239589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { 2240589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return this.getOwnPropertyDescriptor2(k) 2241589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, 2242589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor2: function(k) { throw "myexn" } 2243589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 2244589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2245589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestIsEnumerableThrow({ 2246589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch getOwnPropertyDescriptor: function(k) { 2247589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return {get enumerable() { throw "myexn" }, configurable: true} 2248589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch }, 2249589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}) 2250589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2251589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestIsEnumerableThrow(Proxy.create({ 2252589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { throw "myexn" } 2253589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 2254589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2255589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochTestIsEnumerableThrow(Proxy.create({ 2256589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch get: function(pr, pk) { 2257589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return function(k) { throw "myexn" } 2258589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 2259589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch})) 22605d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 22615d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 22625d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 22633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Constructor functions with proxy prototypes. 22645d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 22653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestConstructorWithProxyPrototype() { 22663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TestWithProxies(TestConstructorWithProxyPrototype2, {}) 22673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22685d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 22693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction TestConstructorWithProxyPrototype2(create, handler) { 22703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch function C() {}; 22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch C.prototype = create(handler); 227285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 22733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var o = new C; 22743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertSame(C.prototype, o.__proto__); 22753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertSame(C.prototype, Object.getPrototypeOf(o)); 22765d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch} 22775d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 22783ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTestConstructorWithProxyPrototype(); 2279