IteratorResult.cs 1.8 KB

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