GlobalSymbolRegistry.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System.Diagnostics.CodeAnalysis;
  2. namespace Jint.Native.Symbol;
  3. public sealed class GlobalSymbolRegistry
  4. {
  5. public static readonly JsSymbol AsyncDispose = new("Symbol.asyncDispose");
  6. public static readonly JsSymbol AsyncIterator = new("Symbol.asyncIterator");
  7. public static readonly JsSymbol Dispose = new("Symbol.dispose");
  8. public static readonly JsSymbol HasInstance = new("Symbol.hasInstance");
  9. public static readonly JsSymbol IsConcatSpreadable = new("Symbol.isConcatSpreadable");
  10. public static readonly JsSymbol Iterator = new("Symbol.iterator");
  11. public static readonly JsSymbol Match = new("Symbol.match");
  12. public static readonly JsSymbol MatchAll = new("Symbol.matchAll");
  13. public static readonly JsSymbol Replace = new("Symbol.replace");
  14. public static readonly JsSymbol Search = new("Symbol.search");
  15. public static readonly JsSymbol Species = new("Symbol.species");
  16. public static readonly JsSymbol Split = new("Symbol.split");
  17. public static readonly JsSymbol ToPrimitive = new("Symbol.toPrimitive");
  18. public static readonly JsSymbol ToStringTag = new("Symbol.toStringTag");
  19. public static readonly JsSymbol Unscopables = new("Symbol.unscopables");
  20. // engine-specific created by scripts
  21. private Dictionary<JsValue, JsSymbol>? _customSymbolLookup;
  22. internal bool TryGetSymbol(JsValue key, [NotNullWhen(true)] out JsSymbol? symbol)
  23. {
  24. symbol = null;
  25. return _customSymbolLookup != null
  26. && _customSymbolLookup.TryGetValue(key, out symbol);
  27. }
  28. internal void Add(JsSymbol symbol)
  29. {
  30. _customSymbolLookup ??= new Dictionary<JsValue, JsSymbol>();
  31. _customSymbolLookup[symbol._value] = symbol;
  32. }
  33. internal static JsSymbol CreateSymbol(JsValue description)
  34. {
  35. return new JsSymbol(description);
  36. }
  37. /// <summary>
  38. /// https://tc39.es/ecma262/#sec-keyforsymbol
  39. /// </summary>
  40. internal JsValue KeyForSymbol(JsValue value)
  41. {
  42. if (value is JsSymbol symbol && _customSymbolLookup?.TryGetValue(symbol._value, out var s) == true)
  43. {
  44. return s._value;
  45. }
  46. return JsValue.Undefined;
  47. }
  48. }