JavascriptWeakSet.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. namespace Js
  7. {
  8. class JavascriptWeakSet : public DynamicObject
  9. {
  10. private:
  11. #if ENABLE_WEAK_REFERENCE_REGIONS
  12. typedef JsUtil::WeakReferenceRegionKeyDictionary<RecyclableObject*, bool, RecyclerPointerComparer> KeySet;
  13. typedef const RecyclerWeakReferenceRegionItem<RecyclableObject*>& WeakType;
  14. #else
  15. typedef JsUtil::WeaklyReferencedKeyDictionary<RecyclableObject, bool, RecyclerPointerComparer<const RecyclableObject*>> KeySet;
  16. typedef const RecyclerWeakReference<RecyclableObject>* WeakType;
  17. #endif
  18. Field(KeySet) keySet;
  19. DEFINE_VTABLE_CTOR_MEMBER_INIT(JavascriptWeakSet, DynamicObject, keySet);
  20. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptWeakSet);
  21. public:
  22. JavascriptWeakSet(DynamicType* type);
  23. void Add(RecyclableObject* key);
  24. bool Delete(RecyclableObject* key);
  25. bool Has(RecyclableObject* key);
  26. virtual BOOL GetDiagTypeString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext) override;
  27. class EntryInfo
  28. {
  29. public:
  30. static FunctionInfo NewInstance;
  31. static FunctionInfo Add;
  32. static FunctionInfo Delete;
  33. static FunctionInfo Has;
  34. };
  35. static Var NewInstance(RecyclableObject* function, CallInfo callInfo, ...);
  36. static Var EntryAdd(RecyclableObject* function, CallInfo callInfo, ...);
  37. static Var EntryDelete(RecyclableObject* function, CallInfo callInfo, ...);
  38. static Var EntryHas(RecyclableObject* function, CallInfo callInfo, ...);
  39. public:
  40. // For diagnostics and heap enum provide size and allow enumeration of key value pairs
  41. int Size() { keySet.Clean(); return keySet.Count(); }
  42. template <typename Fn>
  43. void Map(Fn fn)
  44. {
  45. return keySet.Map([&](RecyclableObject* key, bool, WeakType)
  46. {
  47. fn(key);
  48. });
  49. }
  50. #if ENABLE_TTD
  51. public:
  52. virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
  53. virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
  54. virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
  55. #endif
  56. };
  57. template <> inline bool VarIsImpl<JavascriptWeakSet>(RecyclableObject* obj)
  58. {
  59. return JavascriptOperators::GetTypeId(obj) == TypeIds_WeakSet;
  60. }
  61. }