// Copyright 2014 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var $mapEntries; var $mapIteratorNext; var $setIteratorNext; var $setValues; (function(global, utils) { "use strict"; %CheckIsBootstrapping(); var GlobalMap = global.Map; var GlobalSet = global.Set; // ------------------------------------------------------------------- function SetIteratorConstructor(set, kind) { %SetIteratorInitialize(this, set, kind); } function SetIteratorNextJS() { if (!IS_SET_ITERATOR(this)) { throw MakeTypeError(kIncompatibleMethodReceiver, 'Set Iterator.prototype.next', this); } var value_array = [UNDEFINED, UNDEFINED]; var entry = {value: value_array, done: false}; switch (%SetIteratorNext(this, value_array)) { case 0: entry.value = UNDEFINED; entry.done = true; break; case ITERATOR_KIND_VALUES: entry.value = value_array[0]; break; case ITERATOR_KIND_ENTRIES: value_array[1] = value_array[0]; break; } return entry; } function SetEntries() { if (!IS_SET(this)) { throw MakeTypeError(kIncompatibleMethodReceiver, 'Set.prototype.entries', this); } return new SetIterator(this, ITERATOR_KIND_ENTRIES); } function SetValues() { if (!IS_SET(this)) { throw MakeTypeError(kIncompatibleMethodReceiver, 'Set.prototype.values', this); } return new SetIterator(this, ITERATOR_KIND_VALUES); } // ------------------------------------------------------------------- %SetCode(SetIterator, SetIteratorConstructor); %FunctionSetPrototype(SetIterator, {__proto__: $iteratorPrototype}); %FunctionSetInstanceClassName(SetIterator, 'Set Iterator'); utils.InstallFunctions(SetIterator.prototype, DONT_ENUM, [ 'next', SetIteratorNextJS ]); %AddNamedProperty(SetIterator.prototype, symbolToStringTag, "Set Iterator", READ_ONLY | DONT_ENUM); utils.InstallFunctions(GlobalSet.prototype, DONT_ENUM, [ 'entries', SetEntries, 'keys', SetValues, 'values', SetValues ]); %AddNamedProperty(GlobalSet.prototype, symbolIterator, SetValues, DONT_ENUM); $setIteratorNext = SetIteratorNextJS; $setValues = SetValues; // ------------------------------------------------------------------- function MapIteratorConstructor(map, kind) { %MapIteratorInitialize(this, map, kind); } function MapIteratorNextJS() { if (!IS_MAP_ITERATOR(this)) { throw MakeTypeError(kIncompatibleMethodReceiver, 'Map Iterator.prototype.next', this); } var value_array = [UNDEFINED, UNDEFINED]; var entry = {value: value_array, done: false}; switch (%MapIteratorNext(this, value_array)) { case 0: entry.value = UNDEFINED; entry.done = true; break; case ITERATOR_KIND_KEYS: entry.value = value_array[0]; break; case ITERATOR_KIND_VALUES: entry.value = value_array[1]; break; // ITERATOR_KIND_ENTRIES does not need any processing. } return entry; } function MapEntries() { if (!IS_MAP(this)) { throw MakeTypeError(kIncompatibleMethodReceiver, 'Map.prototype.entries', this); } return new MapIterator(this, ITERATOR_KIND_ENTRIES); } function MapKeys() { if (!IS_MAP(this)) { throw MakeTypeError(kIncompatibleMethodReceiver, 'Map.prototype.keys', this); } return new MapIterator(this, ITERATOR_KIND_KEYS); } function MapValues() { if (!IS_MAP(this)) { throw MakeTypeError(kIncompatibleMethodReceiver, 'Map.prototype.values', this); } return new MapIterator(this, ITERATOR_KIND_VALUES); } // ------------------------------------------------------------------- %SetCode(MapIterator, MapIteratorConstructor); %FunctionSetPrototype(MapIterator, {__proto__: $iteratorPrototype}); %FunctionSetInstanceClassName(MapIterator, 'Map Iterator'); utils.InstallFunctions(MapIterator.prototype, DONT_ENUM, [ 'next', MapIteratorNextJS ]); %AddNamedProperty(MapIterator.prototype, symbolToStringTag, "Map Iterator", READ_ONLY | DONT_ENUM); utils.InstallFunctions(GlobalMap.prototype, DONT_ENUM, [ 'entries', MapEntries, 'keys', MapKeys, 'values', MapValues ]); %AddNamedProperty(GlobalMap.prototype, symbolIterator, MapEntries, DONT_ENUM); $mapEntries = MapEntries; $mapIteratorNext = MapIteratorNextJS; })