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