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