@@ -38,19 +38,60 @@ protected override void Initialize()
38
38
[ "drop" ] = new ( new ClrFunction ( _engine , "drop" , Drop , 1 , PropertyFlag . Configurable ) , PropertyFlag . Writable | PropertyFlag . Configurable ) ,
39
39
[ "flatMap" ] = new ( new ClrFunction ( _engine , "flatMap" , FlatMap , 1 , PropertyFlag . Configurable ) , PropertyFlag . Writable | PropertyFlag . Configurable ) ,
40
40
[ "reduce" ] = new ( new ClrFunction ( _engine , "reduce" , Reduce , 1 , PropertyFlag . Configurable ) , PropertyFlag . Writable | PropertyFlag . Configurable ) ,
41
- [ "toArray" ] = new ( new ClrFunction ( _engine , "toArray" , ToArray , 1 , PropertyFlag . Configurable ) , PropertyFlag . Writable | PropertyFlag . Configurable ) ,
41
+ [ "toArray" ] = new ( new ClrFunction ( _engine , "toArray" , ToArray , 0 , PropertyFlag . Configurable ) , PropertyFlag . Writable | PropertyFlag . Configurable ) ,
42
42
[ "forEach" ] = new ( new ClrFunction ( _engine , "forEach" , ForEach , 1 , PropertyFlag . Configurable ) , PropertyFlag . Writable | PropertyFlag . Configurable ) ,
43
43
[ "some" ] = new ( new ClrFunction ( _engine , "some" , Some , 1 , PropertyFlag . Configurable ) , PropertyFlag . Writable | PropertyFlag . Configurable ) ,
44
- [ "evey " ] = new ( new ClrFunction ( _engine , "every" , Every , 1 , PropertyFlag . Configurable ) , PropertyFlag . Writable | PropertyFlag . Configurable ) ,
44
+ [ "every " ] = new ( new ClrFunction ( _engine , "every" , Every , 1 , PropertyFlag . Configurable ) , PropertyFlag . Writable | PropertyFlag . Configurable ) ,
45
45
[ "find" ] = new ( new ClrFunction ( _engine , "find" , Find , 1 , PropertyFlag . Configurable ) , PropertyFlag . Writable | PropertyFlag . Configurable ) ,
46
46
} ;
47
47
48
48
SetProperties ( properties ) ;
49
49
50
- var symbols = new SymbolDictionary ( 1 ) { [ GlobalSymbolRegistry . Iterator ] = new ( new ClrFunction ( Engine , "[Symbol.iterator]" , ToIterator , 0 , PropertyFlag . Configurable ) , true , false , true ) , } ;
50
+ var symbols = new SymbolDictionary ( 1 )
51
+ {
52
+ [ GlobalSymbolRegistry . Iterator ] = new ( new ClrFunction ( Engine , "[Symbol.iterator]" , ToIterator , 0 , PropertyFlag . Configurable ) , true , false , true ) ,
53
+ [ GlobalSymbolRegistry . ToStringTag ] = new GetSetPropertyDescriptor (
54
+ get : new ClrFunction ( _engine , "get [Symbol.toStringTag]" , ( _ , _ ) => "Iterator" , 0 , PropertyFlag . Configurable ) ,
55
+ set : new ClrFunction ( _engine , "set [Symbol.toStringTag]" , ( thisObject , arguments ) =>
56
+ {
57
+ SetterThatIgnoresPrototypeProperties ( thisObject , _engine . Intrinsics . IteratorPrototype , GlobalSymbolRegistry . ToStringTag , arguments . At ( 0 ) ) ;
58
+ return Undefined ;
59
+ } , 0 , PropertyFlag . Configurable ) ,
60
+ PropertyFlag . Configurable )
61
+ } ;
51
62
SetSymbols ( symbols ) ;
52
63
}
53
64
65
+ /// <summary>
66
+ /// https://tc39.es/ecma262/#sec-SetterThatIgnoresPrototypeProperties
67
+ /// </summary>
68
+ private void SetterThatIgnoresPrototypeProperties ( JsValue thisValue , ObjectInstance home , JsValue p , JsValue v )
69
+ {
70
+ if ( thisValue is not ObjectInstance objectInstance )
71
+ {
72
+ ExceptionHelper . ThrowTypeError ( _realm ) ;
73
+ return ;
74
+ }
75
+
76
+ if ( SameValue ( thisValue , home ) )
77
+ {
78
+ ExceptionHelper . ThrowTypeError ( _realm ) ;
79
+ }
80
+
81
+ var desc = objectInstance . GetOwnProperty ( p ) ;
82
+ if ( desc == PropertyDescriptor . Undefined )
83
+ {
84
+ objectInstance . CreateDataPropertyOrThrow ( p , v ) ;
85
+ }
86
+ else
87
+ {
88
+ objectInstance . Set ( p , v , throwOnError : true ) ;
89
+ }
90
+ }
91
+
92
+ /// <summary>
93
+ /// https://tc39.es/ecma262/#sec-iterator.prototype.map
94
+ /// </summary>
54
95
private JsValue Map ( JsValue thisObject , JsValue [ ] arguments )
55
96
{
56
97
if ( thisObject is not ObjectInstance o )
@@ -59,7 +100,7 @@ private JsValue Map(JsValue thisObject, JsValue[] arguments)
59
100
return Undefined ;
60
101
}
61
102
62
- var callable = GetCallable ( arguments . At ( 0 ) ) ;
103
+ var mapper = GetCallable ( arguments . At ( 0 ) ) ;
63
104
var iterated = GetIteratorDirect ( o ) ;
64
105
//var iterator = new iterao
65
106
@@ -121,26 +162,172 @@ private JsValue Reduce(JsValue thisObject, JsValue[] arguments)
121
162
122
163
private JsValue ToArray ( JsValue thisObject , JsValue [ ] arguments )
123
164
{
124
- return Undefined ;
165
+ if ( thisObject is not ObjectInstance o )
166
+ {
167
+ ExceptionHelper . ThrowTypeError ( _realm , "object must be an Object" ) ;
168
+ return Undefined ;
169
+ }
170
+
171
+ var iterated = GetIteratorDirect ( o ) ;
172
+ var items = new JsArray ( _engine ) ;
173
+ while ( iterated . TryIteratorStep ( out var iteratorResult ) )
174
+ {
175
+ try
176
+ {
177
+ var value = iteratorResult . Get ( CommonProperties . Value ) ;
178
+ items . Push ( value ) ;
179
+ }
180
+ catch
181
+ {
182
+ iterated . Close ( CompletionType . Throw ) ;
183
+ throw ;
184
+ }
185
+ }
186
+
187
+ return items ;
125
188
}
126
189
127
190
private JsValue ForEach ( JsValue thisObject , JsValue [ ] arguments )
128
191
{
192
+ if ( thisObject is not ObjectInstance o )
193
+ {
194
+ ExceptionHelper . ThrowTypeError ( _realm , "object must be an Object" ) ;
195
+ return Undefined ;
196
+ }
197
+
198
+ var procedure = GetCallable ( arguments . At ( 0 ) ) ;
199
+ var iterated = GetIteratorDirect ( o ) ;
200
+
201
+ var counter = 0 ;
202
+ while ( iterated . TryIteratorStep ( out var iteratorResult ) )
203
+ {
204
+ try
205
+ {
206
+ var value = iteratorResult . Get ( CommonProperties . Value ) ;
207
+ procedure . Call ( Undefined , [ value , counter ] ) ;
208
+ counter ++ ;
209
+ }
210
+ catch
211
+ {
212
+ iterated . Close ( CompletionType . Throw ) ;
213
+ throw ;
214
+ }
215
+ }
216
+
129
217
return Undefined ;
130
218
}
131
219
220
+ /// <summary>
221
+ /// https://tc39.es/ecma262/#sec-iterator.prototype.some
222
+ /// </summary>
132
223
private JsValue Some ( JsValue thisObject , JsValue [ ] arguments )
133
224
{
134
- return Undefined ;
225
+ if ( thisObject is not ObjectInstance o )
226
+ {
227
+ ExceptionHelper . ThrowTypeError ( _realm , "object must be an Object" ) ;
228
+ return Undefined ;
229
+ }
230
+
231
+ var predicate = GetCallable ( arguments . At ( 0 ) ) ;
232
+ var iterated = GetIteratorDirect ( o ) ;
233
+
234
+ var counter = 0 ;
235
+ while ( iterated . TryIteratorStep ( out var iteratorResult ) )
236
+ {
237
+ try
238
+ {
239
+ var value = iteratorResult . Get ( CommonProperties . Value ) ;
240
+ var result = predicate . Call ( Undefined , [ value , counter ] ) ;
241
+ if ( TypeConverter . ToBoolean ( result ) )
242
+ {
243
+ iterated . Close ( CompletionType . Normal ) ;
244
+ return JsBoolean . True ;
245
+ }
246
+
247
+ counter ++ ;
248
+ }
249
+ catch
250
+ {
251
+ iterated . Close ( CompletionType . Throw ) ;
252
+ throw ;
253
+ }
254
+ }
255
+
256
+ return JsBoolean . False ;
135
257
}
136
258
259
+ /// <summary>
260
+ /// https://tc39.es/ecma262/#sec-iterator.prototype.every
261
+ /// </summary>
137
262
private JsValue Every ( JsValue thisObject , JsValue [ ] arguments )
138
263
{
139
- return Undefined ;
264
+ if ( thisObject is not ObjectInstance o )
265
+ {
266
+ ExceptionHelper . ThrowTypeError ( _realm , "object must be an Object" ) ;
267
+ return Undefined ;
268
+ }
269
+
270
+ var predicate = GetCallable ( arguments . At ( 0 ) ) ;
271
+ var iterated = GetIteratorDirect ( o ) ;
272
+
273
+ var counter = 0 ;
274
+ while ( iterated . TryIteratorStep ( out var iteratorResult ) )
275
+ {
276
+ try
277
+ {
278
+ var value = iteratorResult . Get ( CommonProperties . Value ) ;
279
+ var result = predicate . Call ( Undefined , [ value , counter ] ) ;
280
+ if ( ! TypeConverter . ToBoolean ( result ) )
281
+ {
282
+ iterated . Close ( CompletionType . Normal ) ;
283
+ return JsBoolean . False ;
284
+ }
285
+
286
+ counter ++ ;
287
+ }
288
+ catch
289
+ {
290
+ iterated . Close ( CompletionType . Throw ) ;
291
+ throw ;
292
+ }
293
+ }
294
+
295
+ return JsBoolean . True ;
140
296
}
141
297
142
298
private JsValue Find ( JsValue thisObject , JsValue [ ] arguments )
143
299
{
300
+ if ( thisObject is not ObjectInstance o )
301
+ {
302
+ ExceptionHelper . ThrowTypeError ( _realm , "object must be an Object" ) ;
303
+ return Undefined ;
304
+ }
305
+
306
+ var predicate = GetCallable ( arguments . At ( 0 ) ) ;
307
+ var iterated = GetIteratorDirect ( o ) ;
308
+
309
+ var counter = 0 ;
310
+ while ( iterated . TryIteratorStep ( out var iteratorResult ) )
311
+ {
312
+ try
313
+ {
314
+ var value = iteratorResult . Get ( CommonProperties . Value ) ;
315
+ var result = predicate . Call ( Undefined , [ value , counter ] ) ;
316
+ if ( TypeConverter . ToBoolean ( result ) )
317
+ {
318
+ iterated . Close ( CompletionType . Normal ) ;
319
+ return value ;
320
+ }
321
+
322
+ counter ++ ;
323
+ }
324
+ catch
325
+ {
326
+ iterated . Close ( CompletionType . Throw ) ;
327
+ throw ;
328
+ }
329
+ }
330
+
144
331
return Undefined ;
145
332
}
146
333
0 commit comments