blob: 2436a931e28bc4acde80f5c4a8143cc0bff5b8f3 [file] [log] [blame]
// 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.
'use strict';
// This file relies on the fact that the following declaration has been made
// in runtime.js:
// var $Set = global.Set;
// var $Map = global.Map;
function SetIteratorConstructor(set, kind) {
%SetIteratorInitialize(this, set, kind);
}
function SetIteratorNextJS() {
if (!IS_SET_ITERATOR(this)) {
throw MakeTypeError('incompatible_method_receiver',
['Set Iterator.prototype.next', this]);
}
return %SetIteratorNext(this);
}
function SetIteratorSymbolIterator() {
return this;
}
function SetEntries() {
if (!IS_SET(this)) {
throw MakeTypeError('incompatible_method_receiver',
['Set.prototype.entries', this]);
}
return new SetIterator(this, ITERATOR_KIND_ENTRIES);
}
function SetValues() {
if (!IS_SET(this)) {
throw MakeTypeError('incompatible_method_receiver',
['Set.prototype.values', this]);
}
return new SetIterator(this, ITERATOR_KIND_VALUES);
}
function SetUpSetIterator() {
%CheckIsBootstrapping();
%SetCode(SetIterator, SetIteratorConstructor);
%FunctionSetPrototype(SetIterator, new $Object());
%FunctionSetInstanceClassName(SetIterator, 'Set Iterator');
InstallFunctions(SetIterator.prototype, DONT_ENUM, $Array(
'next', SetIteratorNextJS
));
%FunctionSetName(SetIteratorSymbolIterator, '[Symbol.iterator]');
%SetProperty(SetIterator.prototype, symbolIterator,
SetIteratorSymbolIterator, DONT_ENUM);
}
SetUpSetIterator();
function ExtendSetPrototype() {
%CheckIsBootstrapping();
InstallFunctions($Set.prototype, DONT_ENUM, $Array(
'entries', SetEntries,
'values', SetValues
));
%SetProperty($Set.prototype, symbolIterator, SetValues,
DONT_ENUM);
}
ExtendSetPrototype();
function MapIteratorConstructor(map, kind) {
%MapIteratorInitialize(this, map, kind);
}
function MapIteratorSymbolIterator() {
return this;
}
function MapIteratorNextJS() {
if (!IS_MAP_ITERATOR(this)) {
throw MakeTypeError('incompatible_method_receiver',
['Map Iterator.prototype.next', this]);
}
return %MapIteratorNext(this);
}
function MapEntries() {
if (!IS_MAP(this)) {
throw MakeTypeError('incompatible_method_receiver',
['Map.prototype.entries', this]);
}
return new MapIterator(this, ITERATOR_KIND_ENTRIES);
}
function MapKeys() {
if (!IS_MAP(this)) {
throw MakeTypeError('incompatible_method_receiver',
['Map.prototype.keys', this]);
}
return new MapIterator(this, ITERATOR_KIND_KEYS);
}
function MapValues() {
if (!IS_MAP(this)) {
throw MakeTypeError('incompatible_method_receiver',
['Map.prototype.values', this]);
}
return new MapIterator(this, ITERATOR_KIND_VALUES);
}
function SetUpMapIterator() {
%CheckIsBootstrapping();
%SetCode(MapIterator, MapIteratorConstructor);
%FunctionSetPrototype(MapIterator, new $Object());
%FunctionSetInstanceClassName(MapIterator, 'Map Iterator');
InstallFunctions(MapIterator.prototype, DONT_ENUM, $Array(
'next', MapIteratorNextJS
));
%FunctionSetName(MapIteratorSymbolIterator, '[Symbol.iterator]');
%SetProperty(MapIterator.prototype, symbolIterator,
MapIteratorSymbolIterator, DONT_ENUM);
}
SetUpMapIterator();
function ExtendMapPrototype() {
%CheckIsBootstrapping();
InstallFunctions($Map.prototype, DONT_ENUM, $Array(
'entries', MapEntries,
'keys', MapKeys,
'values', MapValues
));
%SetProperty($Map.prototype, symbolIterator, MapEntries,
DONT_ENUM);
}
ExtendMapPrototype();