IteratorResult.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using Jint.Native.Object;
  2. using Jint.Runtime;
  3. namespace Jint.Native.Iterator;
  4. /// <summary>
  5. /// https://tc39.es/ecma262/#sec-createiterresultobject
  6. /// </summary>
  7. internal sealed class IteratorResult : ObjectInstance
  8. {
  9. private readonly JsValue _value;
  10. private readonly JsBoolean _done;
  11. public IteratorResult(Engine engine, JsValue value, JsBoolean done) : base(engine)
  12. {
  13. _value = value;
  14. _done = done;
  15. }
  16. public static IteratorResult CreateValueIteratorPosition(Engine engine, JsValue? value = null, JsBoolean? done = null)
  17. {
  18. return new IteratorResult(engine, value ?? Undefined, done ?? JsBoolean.False);
  19. }
  20. public static IteratorResult CreateKeyValueIteratorPosition(Engine engine, JsValue? key = null, JsValue? value = null)
  21. {
  22. var done = key is null && value is null;
  23. var array = done ? Undefined : new JsArray(engine, new[] { key!, value! });
  24. return new IteratorResult(engine, array, JsBoolean.Create(done));
  25. }
  26. public override JsValue Get(JsValue property, JsValue receiver)
  27. {
  28. if (CommonProperties.Value.Equals(property))
  29. {
  30. return _value;
  31. }
  32. if (CommonProperties.Done.Equals(property))
  33. {
  34. return _done;
  35. }
  36. return base.Get(property, receiver);
  37. }
  38. public override object ToObject() => this;
  39. }