JavascriptMap.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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 JavascriptMap : public DynamicObject
  9. {
  10. public:
  11. typedef JsUtil::KeyValuePair<Field(Var), Field(Var)> MapDataKeyValuePair;
  12. typedef MapOrSetDataNode<MapDataKeyValuePair> MapDataNode;
  13. typedef MapOrSetDataList<MapDataKeyValuePair> MapDataList;
  14. typedef JsUtil::BaseDictionary<Var, MapDataNode*, Recycler> SimpleVarDataMap;
  15. typedef JsUtil::BaseDictionary<Var, MapDataNode*, Recycler, PowerOf2SizePolicy, SameValueZeroComparer> ComplexVarDataMap;
  16. private:
  17. enum class MapKind : uint8
  18. {
  19. // An EmptyMap is a map containing no elements
  20. EmptyMap,
  21. // A SimpleVarMap is a map containing only Vars which are comparable by pointer, and don't require
  22. // value comparison
  23. //
  24. // Addition of a Var that is not comparable by pointer value causes the set to be promoted to a ComplexVarSet
  25. SimpleVarMap,
  26. // A ComplexVarMap is a map containing Vars for which we must inspect the values to do a comparison
  27. // This includes Strings and (sometimes) JavascriptNumbers
  28. ComplexVarMap
  29. };
  30. Field(MapDataList) list;
  31. union MapUnion
  32. {
  33. Field(SimpleVarDataMap*) simpleVarMap;
  34. Field(ComplexVarDataMap*) complexVarMap;
  35. MapUnion() {}
  36. };
  37. Field(MapUnion) u;
  38. Field(MapKind) kind = MapKind::EmptyMap;
  39. DEFINE_VTABLE_CTOR_MEMBER_INIT(JavascriptMap, DynamicObject, list);
  40. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptMap);
  41. template <bool isComplex>
  42. bool DeleteFromVarMap(Var value);
  43. bool DeleteFromSimpleVarMap(Var value);
  44. void SetOnEmptyMap(Var key, Var value);
  45. bool TrySetOnSimpleVarMap(Var key, Var value);
  46. void SetOnComplexVarMap(Var key, Var value);
  47. void PromoteToComplexVarMap();
  48. public:
  49. JavascriptMap(DynamicType* type);
  50. static JavascriptMap* New(ScriptContext* scriptContext);
  51. void Clear();
  52. bool Delete(Var key);
  53. bool Get(Var key, Var* value);
  54. bool Has(Var key);
  55. void Set(Var key, Var value);
  56. int Size();
  57. MapDataList::Iterator GetIterator();
  58. virtual BOOL GetDiagTypeString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext) override;
  59. class EntryInfo
  60. {
  61. public:
  62. static FunctionInfo NewInstance;
  63. static FunctionInfo Clear;
  64. static FunctionInfo Delete;
  65. static FunctionInfo ForEach;
  66. static FunctionInfo Get;
  67. static FunctionInfo Has;
  68. static FunctionInfo Set;
  69. static FunctionInfo SizeGetter;
  70. static FunctionInfo Entries;
  71. static FunctionInfo Keys;
  72. static FunctionInfo Values;
  73. static FunctionInfo GetterSymbolSpecies;
  74. };
  75. static Var NewInstance(RecyclableObject* function, CallInfo callInfo, ...);
  76. static Var EntryClear(RecyclableObject* function, CallInfo callInfo, ...);
  77. static Var EntryDelete(RecyclableObject* function, CallInfo callInfo, ...);
  78. static Var EntryForEach(RecyclableObject* function, CallInfo callInfo, ...);
  79. static Var EntryGet(RecyclableObject* function, CallInfo callInfo, ...);
  80. static Var EntryHas(RecyclableObject* function, CallInfo callInfo, ...);
  81. static Var EntrySet(RecyclableObject* function, CallInfo callInfo, ...);
  82. static Var EntrySizeGetter(RecyclableObject* function, CallInfo callInfo, ...);
  83. static Var EntryEntries(RecyclableObject* function, CallInfo callInfo, ...);
  84. static Var EntryKeys(RecyclableObject* function, CallInfo callInfo, ...);
  85. static Var EntryValues(RecyclableObject* function, CallInfo callInfo, ...);
  86. static Var EntryGetterSymbolSpecies(RecyclableObject* function, CallInfo callInfo, ...);
  87. #if ENABLE_TTD
  88. public:
  89. virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
  90. virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
  91. virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
  92. static JavascriptMap* CreateForSnapshotRestore(ScriptContext* ctx);
  93. #endif
  94. };
  95. template <> inline bool VarIsImpl<JavascriptMap>(RecyclableObject* obj)
  96. {
  97. return JavascriptOperators::GetTypeId(obj) == TypeIds_Map;
  98. }
  99. }