blob: 92d45a9cd2668dae053257f994e81966be8a8ecb [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]);
}
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 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]');
%AddNamedProperty(SetIterator.prototype, symbolIterator,
SetIteratorSymbolIterator, DONT_ENUM);
%AddNamedProperty(SetIterator.prototype, symbolToStringTag,
"Set Iterator", READ_ONLY | DONT_ENUM);
}
SetUpSetIterator();
function ExtendSetPrototype() {
%CheckIsBootstrapping();
InstallFunctions($Set.prototype, DONT_ENUM, $Array(
'entries', SetEntries,
'keys', SetValues,
'values', SetValues
));
%AddNamedProperty($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]);
}
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('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]');
%AddNamedProperty(MapIterator.prototype, symbolIterator,
MapIteratorSymbolIterator, DONT_ENUM);
%AddNamedProperty(MapIterator.prototype, symbolToStringTag,
"Map Iterator", READ_ONLY | DONT_ENUM);
}
SetUpMapIterator();
function ExtendMapPrototype() {
%CheckIsBootstrapping();
InstallFunctions($Map.prototype, DONT_ENUM, $Array(
'entries', MapEntries,
'keys', MapKeys,
'values', MapValues
));
%AddNamedProperty($Map.prototype, symbolIterator, MapEntries, DONT_ENUM);
}
ExtendMapPrototype();