JsrtExternalObject.h 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. #include "ChakraCommon.h"
  7. #define BEGIN_INTERCEPTOR(scriptContext) \
  8. BEGIN_LEAVE_SCRIPT(scriptContext) \
  9. try {
  10. #define END_INTERCEPTOR(scriptContext) \
  11. } \
  12. catch (...) \
  13. { \
  14. Assert(false); \
  15. } \
  16. END_LEAVE_SCRIPT(scriptContext) \
  17. \
  18. if (scriptContext->HasRecordedException()) \
  19. { \
  20. scriptContext->RethrowRecordedException(NULL); \
  21. }
  22. class JsrtExternalType sealed : public Js::DynamicType
  23. {
  24. public:
  25. JsrtExternalType(JsrtExternalType *type) : Js::DynamicType(type), jsFinalizeCallback(type->jsFinalizeCallback) {}
  26. JsrtExternalType(Js::ScriptContext* scriptContext, JsFinalizeCallback finalizeCallback);
  27. //Js::PropertyId GetNameId() const { return ((Js::PropertyRecord *)typeDescription.className)->GetPropertyId(); }
  28. JsFinalizeCallback GetJsFinalizeCallback() const { return this->jsFinalizeCallback; }
  29. private:
  30. FieldNoBarrier(JsFinalizeCallback) jsFinalizeCallback;
  31. };
  32. AUTO_REGISTER_RECYCLER_OBJECT_DUMPER(JsrtExternalType, &Js::Type::DumpObjectFunction);
  33. class JsrtExternalObject : public Js::DynamicObject
  34. {
  35. protected:
  36. DEFINE_VTABLE_CTOR(JsrtExternalObject, Js::DynamicObject);
  37. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JsrtExternalObject);
  38. public:
  39. JsrtExternalObject(JsrtExternalType * type, void *data);
  40. static bool Is(Js::Var value);
  41. static JsrtExternalObject * FromVar(Js::Var value);
  42. static JsrtExternalObject * UnsafeFromVar(Js::Var value);
  43. static JsrtExternalObject * Create(void *data, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype, Js::ScriptContext *scriptContext);
  44. JsrtExternalType * GetExternalType() const { return (JsrtExternalType *)this->GetType(); }
  45. void Finalize(bool isShutdown) override;
  46. void Dispose(bool isShutdown) override;
  47. bool HasReadOnlyPropertiesInvisibleToTypeHandler() override { return true; }
  48. Js::DynamicType* DuplicateType() override;
  49. void * GetSlotData() const;
  50. void SetSlotData(void * data);
  51. private:
  52. Field(void *) slot;
  53. #if ENABLE_TTD
  54. public:
  55. virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
  56. virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
  57. #endif
  58. };
  59. AUTO_REGISTER_RECYCLER_OBJECT_DUMPER(JsrtExternalObject, &Js::RecyclableObject::DumpObjectFunction);