• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// 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})
184