a295cb7846
R=cbruni@chromium.org Review URL: https://codereview.chromium.org/1413173003 Cr-Commit-Position: refs/heads/master@{#31467}
184 lines
4.7 KiB
JavaScript
184 lines
4.7 KiB
JavaScript
// 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.
|
|
|
|
(function(global, utils) {
|
|
|
|
"use strict";
|
|
|
|
%CheckIsBootstrapping();
|
|
|
|
// -------------------------------------------------------------------
|
|
// Imports
|
|
|
|
var GlobalMap = global.Map;
|
|
var GlobalSet = global.Set;
|
|
var iteratorSymbol = utils.ImportNow("iterator_symbol");
|
|
var MakeTypeError;
|
|
var MapIterator = utils.ImportNow("MapIterator");
|
|
var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol");
|
|
var SetIterator = utils.ImportNow("SetIterator");
|
|
|
|
utils.Import(function(from) {
|
|
MakeTypeError = from.MakeTypeError;
|
|
});
|
|
|
|
// -------------------------------------------------------------------
|
|
|
|
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 result = %_CreateIterResultObject(value_array, false);
|
|
switch (%SetIteratorNext(this, value_array)) {
|
|
case 0:
|
|
result.value = UNDEFINED;
|
|
result.done = true;
|
|
break;
|
|
case ITERATOR_KIND_VALUES:
|
|
result.value = value_array[0];
|
|
break;
|
|
case ITERATOR_KIND_ENTRIES:
|
|
value_array[1] = value_array[0];
|
|
break;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
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);
|
|
%FunctionSetInstanceClassName(SetIterator, 'Set Iterator');
|
|
utils.InstallFunctions(SetIterator.prototype, DONT_ENUM, [
|
|
'next', SetIteratorNextJS
|
|
]);
|
|
|
|
%AddNamedProperty(SetIterator.prototype, toStringTagSymbol,
|
|
"Set Iterator", READ_ONLY | DONT_ENUM);
|
|
|
|
utils.InstallFunctions(GlobalSet.prototype, DONT_ENUM, [
|
|
'entries', SetEntries,
|
|
'keys', SetValues,
|
|
'values', SetValues
|
|
]);
|
|
|
|
%AddNamedProperty(GlobalSet.prototype, iteratorSymbol, SetValues, DONT_ENUM);
|
|
|
|
// -------------------------------------------------------------------
|
|
|
|
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 result = %_CreateIterResultObject(value_array, false);
|
|
switch (%MapIteratorNext(this, value_array)) {
|
|
case 0:
|
|
result.value = UNDEFINED;
|
|
result.done = true;
|
|
break;
|
|
case ITERATOR_KIND_KEYS:
|
|
result.value = value_array[0];
|
|
break;
|
|
case ITERATOR_KIND_VALUES:
|
|
result.value = value_array[1];
|
|
break;
|
|
// ITERATOR_KIND_ENTRIES does not need any processing.
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
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);
|
|
%FunctionSetInstanceClassName(MapIterator, 'Map Iterator');
|
|
utils.InstallFunctions(MapIterator.prototype, DONT_ENUM, [
|
|
'next', MapIteratorNextJS
|
|
]);
|
|
|
|
%AddNamedProperty(MapIterator.prototype, toStringTagSymbol,
|
|
"Map Iterator", READ_ONLY | DONT_ENUM);
|
|
|
|
|
|
utils.InstallFunctions(GlobalMap.prototype, DONT_ENUM, [
|
|
'entries', MapEntries,
|
|
'keys', MapKeys,
|
|
'values', MapValues
|
|
]);
|
|
|
|
%AddNamedProperty(GlobalMap.prototype, iteratorSymbol, MapEntries, DONT_ENUM);
|
|
|
|
// -------------------------------------------------------------------
|
|
// Exports
|
|
|
|
utils.Export(function(to) {
|
|
to.MapEntries = MapEntries;
|
|
to.MapIteratorNext = MapIteratorNextJS;
|
|
to.SetIteratorNext = SetIteratorNextJS;
|
|
to.SetValues = SetValues;
|
|
});
|
|
|
|
})
|