CustomExternalIterator.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. namespace Js
  6. {
  7. typedef void(*InitIteratorFunction)(Var, Var);
  8. typedef bool(*NextFunction)(Var, Var *, Var *);
  9. enum class ExternalIteratorKind
  10. {
  11. External_Keys,
  12. External_Values,
  13. External_KeyAndValue,
  14. };
  15. class ExternalIteratorCreatorFunction : public RuntimeFunction
  16. {
  17. protected:
  18. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(ExternalIteratorCreatorFunction);
  19. DEFINE_VTABLE_CTOR(ExternalIteratorCreatorFunction, RuntimeFunction);
  20. public:
  21. ExternalIteratorCreatorFunction(DynamicType* type,
  22. FunctionInfo* functionInfo,
  23. JavascriptTypeId typeId,
  24. uint byteCount,
  25. Var prototypeForIterator, InitIteratorFunction initFunction, NextFunction nextFunction);
  26. virtual BOOL IsExternalFunction() override { return TRUE; }
  27. static Var EntryExternalEntries(RecyclableObject* function, CallInfo callInfo, ...);
  28. static Var EntryExternalKeys(RecyclableObject* function, CallInfo callInfo, ...);
  29. static Var EntryExternalValues(RecyclableObject* function, CallInfo callInfo, ...);
  30. void ThrowIfNotValidObject(Var instance);
  31. static Var CreateCustomExternalIterator(Var instance, ExternalIteratorCreatorFunction* function, ExternalIteratorKind kind);
  32. static Var CreateFunction(JavascriptLibrary *library,
  33. JavascriptTypeId typeId,
  34. JavascriptMethod entryPoint,
  35. uint byteCount,
  36. Var prototypeForIterator, InitIteratorFunction initFunction, NextFunction nextFunction);
  37. public:
  38. Field(JavascriptTypeId) m_externalTypeId;
  39. Field(uint) m_extraByteCount;
  40. Field(InitIteratorFunction) m_initFunction;
  41. Field(NextFunction) m_nextFunction;
  42. Field(Var) m_prototypeForIterator;
  43. friend class JavascriptLibrary;
  44. #if ENABLE_TTD
  45. public:
  46. //virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
  47. virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override {
  48. return TTD::NSSnapObjects::SnapObjectType::Invalid;
  49. }
  50. //virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
  51. #endif
  52. };
  53. class JavascriptExternalIteratorNextFunction : public RuntimeFunction
  54. {
  55. protected:
  56. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptExternalIteratorNextFunction);
  57. DEFINE_VTABLE_CTOR(JavascriptExternalIteratorNextFunction, RuntimeFunction);
  58. Field(JavascriptTypeId) m_externalTypeId;
  59. JavascriptExternalIteratorNextFunction(DynamicType* type, FunctionInfo* functionInfo, JavascriptTypeId typeId);
  60. public:
  61. virtual BOOL IsExternalFunction() override { return TRUE; }
  62. JavascriptTypeId GetExternalTypeId() const { return m_externalTypeId; }
  63. static JavascriptExternalIteratorNextFunction* CreateFunction(JavascriptLibrary *library, JavascriptTypeId typeId, JavascriptMethod entryPoint);
  64. friend class JavascriptLibrary;
  65. #if ENABLE_TTD
  66. public:
  67. //virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
  68. virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override {
  69. return TTD::NSSnapObjects::SnapObjectType::Invalid;
  70. }
  71. //virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
  72. #endif
  73. };
  74. class CustomExternalIterator : public DynamicObject
  75. {
  76. private:
  77. Field(ExternalIteratorKind) m_kind;
  78. Field(JavascriptTypeId) m_externalTypeId;
  79. Field(NextFunction) m_nextFunction;
  80. protected:
  81. DEFINE_VTABLE_CTOR(CustomExternalIterator, DynamicObject);
  82. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(CustomExternalIterator);
  83. public:
  84. CustomExternalIterator(DynamicType* type, ExternalIteratorKind kind, JavascriptTypeId typeId, NextFunction nextFunction);
  85. static Var CreateNextFunction(JavascriptLibrary *library, JavascriptTypeId typeId);
  86. static Var EntryNext(RecyclableObject* function, CallInfo callInfo, ...);
  87. };
  88. template <> bool VarIsImpl<CustomExternalIterator>(RecyclableObject* obj);
  89. }