OLD | NEW |
| (Empty) |
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 var $mapEntries; | |
6 var $mapIteratorNext; | |
7 var $setIteratorNext; | |
8 var $setValues; | |
9 | |
10 (function(global, utils) { | |
11 | |
12 "use strict"; | |
13 | |
14 %CheckIsBootstrapping(); | |
15 | |
16 var GlobalMap = global.Map; | |
17 var GlobalSet = global.Set; | |
18 var iteratorSymbol = utils.ImportNow("iterator_symbol"); | |
19 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); | |
20 | |
21 // ------------------------------------------------------------------- | |
22 | |
23 function SetIteratorConstructor(set, kind) { | |
24 %SetIteratorInitialize(this, set, kind); | |
25 } | |
26 | |
27 | |
28 function SetIteratorNextJS() { | |
29 if (!IS_SET_ITERATOR(this)) { | |
30 throw MakeTypeError(kIncompatibleMethodReceiver, | |
31 'Set Iterator.prototype.next', this); | |
32 } | |
33 | |
34 var value_array = [UNDEFINED, UNDEFINED]; | |
35 var result = %_CreateIterResultObject(value_array, false); | |
36 switch (%SetIteratorNext(this, value_array)) { | |
37 case 0: | |
38 result.value = UNDEFINED; | |
39 result.done = true; | |
40 break; | |
41 case ITERATOR_KIND_VALUES: | |
42 result.value = value_array[0]; | |
43 break; | |
44 case ITERATOR_KIND_ENTRIES: | |
45 value_array[1] = value_array[0]; | |
46 break; | |
47 } | |
48 | |
49 return result; | |
50 } | |
51 | |
52 | |
53 function SetEntries() { | |
54 if (!IS_SET(this)) { | |
55 throw MakeTypeError(kIncompatibleMethodReceiver, | |
56 'Set.prototype.entries', this); | |
57 } | |
58 return new SetIterator(this, ITERATOR_KIND_ENTRIES); | |
59 } | |
60 | |
61 | |
62 function SetValues() { | |
63 if (!IS_SET(this)) { | |
64 throw MakeTypeError(kIncompatibleMethodReceiver, | |
65 'Set.prototype.values', this); | |
66 } | |
67 return new SetIterator(this, ITERATOR_KIND_VALUES); | |
68 } | |
69 | |
70 // ------------------------------------------------------------------- | |
71 | |
72 %SetCode(SetIterator, SetIteratorConstructor); | |
73 %FunctionSetPrototype(SetIterator, {__proto__: $iteratorPrototype}); | |
74 %FunctionSetInstanceClassName(SetIterator, 'Set Iterator'); | |
75 utils.InstallFunctions(SetIterator.prototype, DONT_ENUM, [ | |
76 'next', SetIteratorNextJS | |
77 ]); | |
78 | |
79 %AddNamedProperty(SetIterator.prototype, toStringTagSymbol, | |
80 "Set Iterator", READ_ONLY | DONT_ENUM); | |
81 | |
82 utils.InstallFunctions(GlobalSet.prototype, DONT_ENUM, [ | |
83 'entries', SetEntries, | |
84 'keys', SetValues, | |
85 'values', SetValues | |
86 ]); | |
87 | |
88 %AddNamedProperty(GlobalSet.prototype, iteratorSymbol, SetValues, DONT_ENUM); | |
89 | |
90 $setIteratorNext = SetIteratorNextJS; | |
91 $setValues = SetValues; | |
92 | |
93 // ------------------------------------------------------------------- | |
94 | |
95 function MapIteratorConstructor(map, kind) { | |
96 %MapIteratorInitialize(this, map, kind); | |
97 } | |
98 | |
99 | |
100 function MapIteratorNextJS() { | |
101 if (!IS_MAP_ITERATOR(this)) { | |
102 throw MakeTypeError(kIncompatibleMethodReceiver, | |
103 'Map Iterator.prototype.next', this); | |
104 } | |
105 | |
106 var value_array = [UNDEFINED, UNDEFINED]; | |
107 var result = %_CreateIterResultObject(value_array, false); | |
108 switch (%MapIteratorNext(this, value_array)) { | |
109 case 0: | |
110 result.value = UNDEFINED; | |
111 result.done = true; | |
112 break; | |
113 case ITERATOR_KIND_KEYS: | |
114 result.value = value_array[0]; | |
115 break; | |
116 case ITERATOR_KIND_VALUES: | |
117 result.value = value_array[1]; | |
118 break; | |
119 // ITERATOR_KIND_ENTRIES does not need any processing. | |
120 } | |
121 | |
122 return result; | |
123 } | |
124 | |
125 | |
126 function MapEntries() { | |
127 if (!IS_MAP(this)) { | |
128 throw MakeTypeError(kIncompatibleMethodReceiver, | |
129 'Map.prototype.entries', this); | |
130 } | |
131 return new MapIterator(this, ITERATOR_KIND_ENTRIES); | |
132 } | |
133 | |
134 | |
135 function MapKeys() { | |
136 if (!IS_MAP(this)) { | |
137 throw MakeTypeError(kIncompatibleMethodReceiver, | |
138 'Map.prototype.keys', this); | |
139 } | |
140 return new MapIterator(this, ITERATOR_KIND_KEYS); | |
141 } | |
142 | |
143 | |
144 function MapValues() { | |
145 if (!IS_MAP(this)) { | |
146 throw MakeTypeError(kIncompatibleMethodReceiver, | |
147 'Map.prototype.values', this); | |
148 } | |
149 return new MapIterator(this, ITERATOR_KIND_VALUES); | |
150 } | |
151 | |
152 // ------------------------------------------------------------------- | |
153 | |
154 %SetCode(MapIterator, MapIteratorConstructor); | |
155 %FunctionSetPrototype(MapIterator, {__proto__: $iteratorPrototype}); | |
156 %FunctionSetInstanceClassName(MapIterator, 'Map Iterator'); | |
157 utils.InstallFunctions(MapIterator.prototype, DONT_ENUM, [ | |
158 'next', MapIteratorNextJS | |
159 ]); | |
160 | |
161 %AddNamedProperty(MapIterator.prototype, toStringTagSymbol, | |
162 "Map Iterator", READ_ONLY | DONT_ENUM); | |
163 | |
164 | |
165 utils.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 $mapEntries = MapEntries; | |
174 $mapIteratorNext = MapIteratorNextJS; | |
175 | |
176 }) | |
OLD | NEW |