JsSet.cs 2.0 KB

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