JsWeakSet.cs 973 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. using System.Runtime.CompilerServices;
  2. using Jint.Native.Object;
  3. using Jint.Runtime;
  4. namespace Jint.Native;
  5. internal sealed class JsWeakSet : ObjectInstance
  6. {
  7. private readonly ConditionalWeakTable<JsValue, JsValue> _table;
  8. public JsWeakSet(Engine engine) : base(engine)
  9. {
  10. _table = new ConditionalWeakTable<JsValue, JsValue>();
  11. }
  12. internal bool WeakSetHas(JsValue value)
  13. {
  14. return _table.TryGetValue(value, out _);
  15. }
  16. internal bool WeakSetDelete(JsValue value)
  17. {
  18. return _table.Remove(value);
  19. }
  20. internal void WeakSetAdd(JsValue value)
  21. {
  22. if (!value.CanBeHeldWeakly(_engine.GlobalSymbolRegistry))
  23. {
  24. Throw.TypeError(_engine.Realm, "WeakSet value must be an object or symbol, got " + value);
  25. }
  26. #if SUPPORTS_WEAK_TABLE_ADD_OR_UPDATE
  27. _table.AddOrUpdate(value, Undefined);
  28. #else
  29. _table.Remove(value);
  30. _table.Add(value, Undefined);
  31. #endif
  32. }
  33. }