1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch"use strict";
63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This file relies on the fact that the following declaration has been made
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// in runtime.js:
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// var $Array = global.Array;
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar $Set = global.Set;
123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar $Map = global.Map;
133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -------------------------------------------------------------------
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Harmony Set
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SetConstructor(iterable) {
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!%_IsConstructCall()) {
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('constructor_not_function', ['Set']);
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iter, adder;
243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_NULL_OR_UNDEFINED(iterable)) {
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    iter = GetIterator(ToObject(iterable));
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    adder = this.add;
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!IS_SPEC_FUNCTION(adder)) {
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw MakeTypeError('property_not_function', ['add', this]);
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %SetInitialize(this);
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IS_UNDEFINED(iter)) return;
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var next, done;
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  while (!(next = iter.next()).done) {
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!IS_SPEC_OBJECT(next)) {
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw MakeTypeError('iterator_result_not_an_object', [next]);
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    %_CallFunction(this, next.value, adder);
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SetAddJS(key) {
483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_SET(this)) {
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['Set.prototype.add', this]);
513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Normalize -0 to +0 as required by the spec.
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Even though we use SameValueZero as the comparison for the keys we don't
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // want to ever store -0 as the key since the key is directly exposed when
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // doing iteration.
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (key === 0) {
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    key = 0;
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %SetAdd(this, key);
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SetHasJS(key) {
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_SET(this)) {
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['Set.prototype.has', this]);
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %SetHas(this, key);
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SetDeleteJS(key) {
733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_SET(this)) {
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ['Set.prototype.delete', this]);
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %SetDelete(this, key);
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SetGetSizeJS() {
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_SET(this)) {
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['Set.prototype.size', this]);
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %SetGetSize(this);
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SetClearJS() {
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_SET(this)) {
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['Set.prototype.clear', this]);
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %SetClear(this);
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SetForEach(f, receiver) {
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_SET(this)) {
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['Set.prototype.forEach', this]);
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_SPEC_FUNCTION(f)) {
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('called_non_callable', [f]);
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = new SetIterator(this, ITERATOR_KIND_VALUES);
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var key;
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var value_array = [UNDEFINED];
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  while (%SetIteratorNext(iterator, value_array)) {
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (stepping) %DebugPrepareStepInIfStepping(f);
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    key = value_array[0];
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    %_CallFunction(receiver, key, key, this, f);
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -------------------------------------------------------------------
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SetUpSet() {
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %CheckIsBootstrapping();
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %SetCode($Set, SetConstructor);
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %FunctionSetPrototype($Set, new $Object());
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %AddNamedProperty($Set.prototype, "constructor", $Set, DONT_ENUM);
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %FunctionSetLength(SetForEach, 1);
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Set up the non-enumerable functions on the Set prototype object.
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstallGetter($Set.prototype, "size", SetGetSizeJS);
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstallFunctions($Set.prototype, DONT_ENUM, $Array(
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "add", SetAddJS,
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "has", SetHasJS,
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "delete", SetDeleteJS,
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "clear", SetClearJS,
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "forEach", SetForEach
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ));
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSetUpSet();
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -------------------------------------------------------------------
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Harmony Map
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction MapConstructor(iterable) {
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!%_IsConstructCall()) {
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('constructor_not_function', ['Map']);
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iter, adder;
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_NULL_OR_UNDEFINED(iterable)) {
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    iter = GetIterator(ToObject(iterable));
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    adder = this.set;
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!IS_SPEC_FUNCTION(adder)) {
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw MakeTypeError('property_not_function', ['set', this]);
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %MapInitialize(this);
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IS_UNDEFINED(iter)) return;
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var next, done, nextItem;
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  while (!(next = iter.next()).done) {
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!IS_SPEC_OBJECT(next)) {
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw MakeTypeError('iterator_result_not_an_object', [next]);
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    nextItem = next.value;
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!IS_SPEC_OBJECT(nextItem)) {
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw MakeTypeError('iterator_value_not_an_object', [nextItem]);
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    %_CallFunction(this, nextItem[0], nextItem[1], adder);
1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction MapGetJS(key) {
1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IS_MAP(this)) {
1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['Map.prototype.get', this]);
1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %MapGet(this, key);
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction MapSetJS(key, value) {
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_MAP(this)) {
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['Map.prototype.set', this]);
1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Normalize -0 to +0 as required by the spec.
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Even though we use SameValueZero as the comparison for the keys we don't
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // want to ever store -0 as the key since the key is directly exposed when
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // doing iteration.
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (key === 0) {
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    key = 0;
2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %MapSet(this, key, value);
2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction MapHasJS(key) {
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_MAP(this)) {
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['Map.prototype.has', this]);
2113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %MapHas(this, key);
2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction MapDeleteJS(key) {
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_MAP(this)) {
2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['Map.prototype.delete', this]);
2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %MapDelete(this, key);
2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction MapGetSizeJS() {
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_MAP(this)) {
2273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['Map.prototype.size', this]);
2293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %MapGetSize(this);
2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction MapClearJS() {
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_MAP(this)) {
2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['Map.prototype.clear', this]);
2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %MapClear(this);
2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction MapForEach(f, receiver) {
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_MAP(this)) {
2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['Map.prototype.forEach', this]);
2473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_SPEC_FUNCTION(f)) {
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('called_non_callable', [f]);
2513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = new MapIterator(this, ITERATOR_KIND_ENTRIES);
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var stepping = DEBUG_IS_ACTIVE && %DebugCallbackSupportsStepping(f);
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var value_array = [UNDEFINED, UNDEFINED];
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  while (%MapIteratorNext(iterator, value_array)) {
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (stepping) %DebugPrepareStepInIfStepping(f);
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    %_CallFunction(receiver, value_array[1], value_array[0], this, f);
2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// -------------------------------------------------------------------
2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SetUpMap() {
2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %CheckIsBootstrapping();
2673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %SetCode($Map, MapConstructor);
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %FunctionSetPrototype($Map, new $Object());
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %AddNamedProperty($Map.prototype, "constructor", $Map, DONT_ENUM);
2713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %FunctionSetLength(MapForEach, 1);
2733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up the non-enumerable functions on the Map prototype object.
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstallGetter($Map.prototype, "size", MapGetSizeJS);
2763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InstallFunctions($Map.prototype, DONT_ENUM, $Array(
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "get", MapGetJS,
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "set", MapSetJS,
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "has", MapHasJS,
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "delete", MapDeleteJS,
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "clear", MapClearJS,
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "forEach", MapForEach
2833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ));
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSetUpMap();
287