JsSet.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System.Diagnostics.CodeAnalysis;
  2. using Jint.Native.Object;
  3. using Jint.Runtime;
  4. using Jint.Runtime.Descriptors;
  5. namespace Jint.Native.Set;
  6. internal sealed class JsSet : ObjectInstance
  7. {
  8. internal readonly OrderedSet<JsValue> _set;
  9. public JsSet(Engine engine) : this(engine, new OrderedSet<JsValue>(SameValueZeroComparer.Instance))
  10. {
  11. }
  12. public JsSet(Engine engine, OrderedSet<JsValue> set) : base(engine)
  13. {
  14. _set = set;
  15. }
  16. public override PropertyDescriptor GetOwnProperty(JsValue property)
  17. {
  18. if (CommonProperties.Size.Equals(property))
  19. {
  20. return new PropertyDescriptor(_set.Count, PropertyFlag.AllForbidden);
  21. }
  22. return base.GetOwnProperty(property);
  23. }
  24. protected override bool TryGetProperty(JsValue property, [NotNullWhen(true)] out PropertyDescriptor? descriptor)
  25. {
  26. if (CommonProperties.Size.Equals(property))
  27. {
  28. descriptor = new PropertyDescriptor(_set.Count, PropertyFlag.AllForbidden);
  29. return true;
  30. }
  31. return base.TryGetProperty(property, out descriptor);
  32. }
  33. internal void Add(JsValue value)
  34. {
  35. _set.Add(value);
  36. }
  37. internal void Clear()
  38. {
  39. _set.Clear();
  40. }
  41. internal bool Has(JsValue key)
  42. {
  43. return _set.Contains(key);
  44. }
  45. internal bool SetDelete(JsValue key)
  46. {
  47. return _set.Remove(key);
  48. }
  49. internal void ForEach(ICallable callable, JsValue thisArg)
  50. {
  51. var args = _engine._jsValueArrayPool.RentArray(3);
  52. args[2] = this;
  53. for (var i = 0; i < _set._list.Count; i++)
  54. {
  55. var value = _set._list[i];
  56. args[0] = value;
  57. args[1] = value;
  58. callable.Call(thisArg, args);
  59. }
  60. _engine._jsValueArrayPool.ReturnArray(args);
  61. }
  62. internal ObjectInstance Entries()
  63. {
  64. return _engine.Realm.Intrinsics.SetIteratorPrototype.ConstructEntryIterator(this);
  65. }
  66. internal ObjectInstance Values()
  67. {
  68. return _engine.Realm.Intrinsics.SetIteratorPrototype.ConstructValueIterator(this);
  69. }
  70. }