mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
4.7 KiB
198 lines
4.7 KiB
// 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();
|
|
|