blob: 621d7266fc69bdeffb2d6d8cd949c062346d66c9 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5(function(global, utils) {
6
7"use strict";
8
9%CheckIsBootstrapping();
10
11// -------------------------------------------------------------------
12// Imports
13
14var GlobalMap = global.Map;
15var GlobalSet = global.Set;
16var iteratorSymbol = utils.ImportNow("iterator_symbol");
17var MakeTypeError;
18var MapIterator = utils.ImportNow("MapIterator");
19var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol");
20var SetIterator = utils.ImportNow("SetIterator");
21
22utils.Import(function(from) {
23 MakeTypeError = from.MakeTypeError;
24});
25
26// -------------------------------------------------------------------
27
28function SetIteratorConstructor(set, kind) {
29 %SetIteratorInitialize(this, set, kind);
30}
31
32
33function SetIteratorNextJS() {
34 if (!IS_SET_ITERATOR(this)) {
35 throw MakeTypeError(kIncompatibleMethodReceiver,
36 'Set Iterator.prototype.next', this);
37 }
38
39 var value_array = [UNDEFINED, UNDEFINED];
40 var result = %_CreateIterResultObject(value_array, false);
41 switch (%SetIteratorNext(this, value_array)) {
42 case 0:
43 result.value = UNDEFINED;
44 result.done = true;
45 break;
46 case ITERATOR_KIND_VALUES:
47 result.value = value_array[0];
48 break;
49 case ITERATOR_KIND_ENTRIES:
50 value_array[1] = value_array[0];
51 break;
52 }
53
54 return result;
55}
56
57
58function SetEntries() {
59 if (!IS_SET(this)) {
60 throw MakeTypeError(kIncompatibleMethodReceiver,
61 'Set.prototype.entries', this);
62 }
63 return new SetIterator(this, ITERATOR_KIND_ENTRIES);
64}
65
66
67function SetValues() {
68 if (!IS_SET(this)) {
69 throw MakeTypeError(kIncompatibleMethodReceiver,
70 'Set.prototype.values', this);
71 }
72 return new SetIterator(this, ITERATOR_KIND_VALUES);
73}
74
75// -------------------------------------------------------------------
76
77%SetCode(SetIterator, SetIteratorConstructor);
78%FunctionSetInstanceClassName(SetIterator, 'Set Iterator');
79utils.InstallFunctions(SetIterator.prototype, DONT_ENUM, [
80 'next', SetIteratorNextJS
81]);
82
83%AddNamedProperty(SetIterator.prototype, toStringTagSymbol,
84 "Set Iterator", READ_ONLY | DONT_ENUM);
85
86utils.InstallFunctions(GlobalSet.prototype, DONT_ENUM, [
87 'entries', SetEntries,
88 'keys', SetValues,
89 'values', SetValues
90]);
91
92%AddNamedProperty(GlobalSet.prototype, iteratorSymbol, SetValues, DONT_ENUM);
93
94// -------------------------------------------------------------------
95
96function MapIteratorConstructor(map, kind) {
97 %MapIteratorInitialize(this, map, kind);
98}
99
100
101function MapIteratorNextJS() {
102 if (!IS_MAP_ITERATOR(this)) {
103 throw MakeTypeError(kIncompatibleMethodReceiver,
104 'Map Iterator.prototype.next', this);
105 }
106
107 var value_array = [UNDEFINED, UNDEFINED];
108 var result = %_CreateIterResultObject(value_array, false);
109 switch (%MapIteratorNext(this, value_array)) {
110 case 0:
111 result.value = UNDEFINED;
112 result.done = true;
113 break;
114 case ITERATOR_KIND_KEYS:
115 result.value = value_array[0];
116 break;
117 case ITERATOR_KIND_VALUES:
118 result.value = value_array[1];
119 break;
120 // ITERATOR_KIND_ENTRIES does not need any processing.
121 }
122
123 return result;
124}
125
126
127function MapEntries() {
128 if (!IS_MAP(this)) {
129 throw MakeTypeError(kIncompatibleMethodReceiver,
130 'Map.prototype.entries', this);
131 }
132 return new MapIterator(this, ITERATOR_KIND_ENTRIES);
133}
134
135
136function MapKeys() {
137 if (!IS_MAP(this)) {
138 throw MakeTypeError(kIncompatibleMethodReceiver,
139 'Map.prototype.keys', this);
140 }
141 return new MapIterator(this, ITERATOR_KIND_KEYS);
142}
143
144
145function MapValues() {
146 if (!IS_MAP(this)) {
147 throw MakeTypeError(kIncompatibleMethodReceiver,
148 'Map.prototype.values', this);
149 }
150 return new MapIterator(this, ITERATOR_KIND_VALUES);
151}
152
153// -------------------------------------------------------------------
154
155%SetCode(MapIterator, MapIteratorConstructor);
156%FunctionSetInstanceClassName(MapIterator, 'Map Iterator');
157utils.InstallFunctions(MapIterator.prototype, DONT_ENUM, [
158 'next', MapIteratorNextJS
159]);
160
161%AddNamedProperty(MapIterator.prototype, toStringTagSymbol,
162 "Map Iterator", READ_ONLY | DONT_ENUM);
163
164
165utils.InstallFunctions(GlobalMap.prototype, DONT_ENUM, [
166 'entries', MapEntries,
167 'keys', MapKeys,
168 'values', MapValues
169]);
170
171%AddNamedProperty(GlobalMap.prototype, iteratorSymbol, MapEntries, DONT_ENUM);
172
173// -------------------------------------------------------------------
174// Exports
175
176utils.Export(function(to) {
177 to.MapEntries = MapEntries;
178 to.MapIteratorNext = MapIteratorNextJS;
179 to.SetIteratorNext = SetIteratorNextJS;
180 to.SetValues = SetValues;
181});
182
183})