Skip to content

Commit bf899ee

Browse files
committed
wip
1 parent f744a71 commit bf899ee

File tree

1 file changed

+194
-7
lines changed

1 file changed

+194
-7
lines changed

Jint/Native/Iterator/IteratorPrototype.cs

Lines changed: 194 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,60 @@ protected override void Initialize()
3838
["drop"] = new(new ClrFunction(_engine, "drop", Drop, 1, PropertyFlag.Configurable), PropertyFlag.Writable | PropertyFlag.Configurable),
3939
["flatMap"] = new(new ClrFunction(_engine, "flatMap", FlatMap, 1, PropertyFlag.Configurable), PropertyFlag.Writable | PropertyFlag.Configurable),
4040
["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),
4242
["forEach"] = new(new ClrFunction(_engine, "forEach", ForEach, 1, PropertyFlag.Configurable), PropertyFlag.Writable | PropertyFlag.Configurable),
4343
["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),
4545
["find"] = new(new ClrFunction(_engine, "find", Find, 1, PropertyFlag.Configurable), PropertyFlag.Writable | PropertyFlag.Configurable),
4646
};
4747

4848
SetProperties(properties);
4949

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+
};
5162
SetSymbols(symbols);
5263
}
5364

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>
5495
private JsValue Map(JsValue thisObject, JsValue[] arguments)
5596
{
5697
if (thisObject is not ObjectInstance o)
@@ -59,7 +100,7 @@ private JsValue Map(JsValue thisObject, JsValue[] arguments)
59100
return Undefined;
60101
}
61102

62-
var callable = GetCallable(arguments.At(0));
103+
var mapper = GetCallable(arguments.At(0));
63104
var iterated = GetIteratorDirect(o);
64105
//var iterator = new iterao
65106

@@ -121,26 +162,172 @@ private JsValue Reduce(JsValue thisObject, JsValue[] arguments)
121162

122163
private JsValue ToArray(JsValue thisObject, JsValue[] arguments)
123164
{
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;
125188
}
126189

127190
private JsValue ForEach(JsValue thisObject, JsValue[] arguments)
128191
{
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+
129217
return Undefined;
130218
}
131219

220+
/// <summary>
221+
/// https://tc39.es/ecma262/#sec-iterator.prototype.some
222+
/// </summary>
132223
private JsValue Some(JsValue thisObject, JsValue[] arguments)
133224
{
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;
135257
}
136258

259+
/// <summary>
260+
/// https://tc39.es/ecma262/#sec-iterator.prototype.every
261+
/// </summary>
137262
private JsValue Every(JsValue thisObject, JsValue[] arguments)
138263
{
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;
140296
}
141297

142298
private JsValue Find(JsValue thisObject, JsValue[] arguments)
143299
{
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+
144331
return Undefined;
145332
}
146333

0 commit comments

Comments
 (0)