13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
23ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Redistribution and use in source and binary forms, with or without
33ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// modification, are permitted provided that the following conditions are
43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// met:
53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions of source code must retain the above copyright
73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       notice, this list of conditions and the following disclaimer.
83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions in binary form must reproduce the above
93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       copyright notice, this list of conditions and the following
103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       disclaimer in the documentation and/or other materials provided
113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       with the distribution.
123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Neither the name of Google Inc. nor the names of its
133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       contributors may be used to endorse or promote products derived
143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       from this software without specific prior written permission.
153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch"use strict";
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar $Set = global.Set;
313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar $Map = global.Map;
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar $WeakMap = global.WeakMap;
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//-------------------------------------------------------------------
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Global sentinel to be used instead of undefined keys, which are not
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// supported internally but required for Harmony sets and maps.
383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar undefined_sentinel = {};
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction SetConstructor() {
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (%_IsConstructCall()) {
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    %SetInitialize(this);
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new $Set();
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction SetAdd(key) {
513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_SET(this)) {
523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['Set.prototype.add', this]);
543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (IS_UNDEFINED(key)) {
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    key = undefined_sentinel;
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %SetAdd(this, key);
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction SetHas(key) {
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_SET(this)) {
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['Set.prototype.has', this]);
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (IS_UNDEFINED(key)) {
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    key = undefined_sentinel;
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %SetHas(this, key);
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction SetDelete(key) {
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_SET(this)) {
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['Set.prototype.delete', this]);
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (IS_UNDEFINED(key)) {
803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    key = undefined_sentinel;
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %SetDelete(this, key);
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction MapConstructor() {
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (%_IsConstructCall()) {
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    %MapInitialize(this);
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new $Map();
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction MapGet(key) {
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_MAP(this)) {
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['Map.prototype.get', this]);
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (IS_UNDEFINED(key)) {
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    key = undefined_sentinel;
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %MapGet(this, key);
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction MapSet(key, value) {
1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_MAP(this)) {
1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['Map.prototype.set', this]);
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (IS_UNDEFINED(key)) {
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    key = undefined_sentinel;
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %MapSet(this, key, value);
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction MapHas(key) {
1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_MAP(this)) {
1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['Map.prototype.has', this]);
1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (IS_UNDEFINED(key)) {
1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    key = undefined_sentinel;
1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return !IS_UNDEFINED(%MapGet(this, key));
1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction MapDelete(key) {
1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_MAP(this)) {
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['Map.prototype.delete', this]);
1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (IS_UNDEFINED(key)) {
1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    key = undefined_sentinel;
1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_UNDEFINED(%MapGet(this, key))) {
1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    %MapSet(this, key, void 0);
1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return true;
1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return false;
1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction WeakMapConstructor() {
1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (%_IsConstructCall()) {
1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    %WeakMapInitialize(this);
1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new $WeakMap();
1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction WeakMapGet(key) {
1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_WEAKMAP(this)) {
1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['WeakMap.prototype.get', this]);
1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_SPEC_OBJECT(key)) {
1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw %MakeTypeError('invalid_weakmap_key', [this, key]);
1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %WeakMapGet(this, key);
1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction WeakMapSet(key, value) {
1703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_WEAKMAP(this)) {
1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['WeakMap.prototype.set', this]);
1733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_SPEC_OBJECT(key)) {
1753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw %MakeTypeError('invalid_weakmap_key', [this, key]);
1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %WeakMapSet(this, key, value);
1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction WeakMapHas(key) {
1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_WEAKMAP(this)) {
1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['WeakMap.prototype.has', this]);
1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_SPEC_OBJECT(key)) {
1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw %MakeTypeError('invalid_weakmap_key', [this, key]);
1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return !IS_UNDEFINED(%WeakMapGet(this, key));
1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction WeakMapDelete(key) {
1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_WEAKMAP(this)) {
1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['WeakMap.prototype.delete', this]);
1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_SPEC_OBJECT(key)) {
1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw %MakeTypeError('invalid_weakmap_key', [this, key]);
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_UNDEFINED(%WeakMapGet(this, key))) {
2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    %WeakMapSet(this, key, void 0);
2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return true;
2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return false;
2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// -------------------------------------------------------------------
2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch(function () {
2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %CheckIsBootstrapping();
2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up the Set and Map constructor function.
2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %SetCode($Set, SetConstructor);
2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %SetCode($Map, MapConstructor);
2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up the constructor property on the Set and Map prototype object.
2193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %SetProperty($Set.prototype, "constructor", $Set, DONT_ENUM);
2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %SetProperty($Map.prototype, "constructor", $Map, DONT_ENUM);
2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up the non-enumerable functions on the Set prototype object.
2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InstallFunctions($Set.prototype, DONT_ENUM, $Array(
2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    "add", SetAdd,
2253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    "has", SetHas,
2263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    "delete", SetDelete
2273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ));
2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up the non-enumerable functions on the Map prototype object.
2303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InstallFunctions($Map.prototype, DONT_ENUM, $Array(
2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    "get", MapGet,
2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    "set", MapSet,
2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    "has", MapHas,
2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    "delete", MapDelete
2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ));
2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up the WeakMap constructor function.
2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %SetCode($WeakMap, WeakMapConstructor);
2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up the constructor property on the WeakMap prototype object.
2413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %SetProperty($WeakMap.prototype, "constructor", $WeakMap, DONT_ENUM);
2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up the non-enumerable functions on the WeakMap prototype object.
2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InstallFunctions($WeakMap.prototype, DONT_ENUM, $Array(
2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    "get", WeakMapGet,
2463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    "set", WeakMapSet,
2473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    "has", WeakMapHas,
2483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    "delete", WeakMapDelete
2493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ));
2503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})();
251