JsrtExternalObject.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. #include "JsrtPch.h"
  6. #include "jsrtHelper.h"
  7. #include "JsrtExternalObject.h"
  8. #include "Types/PathTypeHandler.h"
  9. JsrtExternalType::JsrtExternalType(Js::ScriptContext* scriptContext, JsFinalizeCallback finalizeCallback)
  10. : Js::DynamicType(
  11. scriptContext,
  12. Js::TypeIds_Object,
  13. scriptContext->GetLibrary()->GetObjectPrototype(),
  14. nullptr,
  15. Js::SimplePathTypeHandler::New(scriptContext, scriptContext->GetLibrary()->GetRootPath(), 0, 0, 0, true, true),
  16. true,
  17. true)
  18. , jsFinalizeCallback(finalizeCallback)
  19. {
  20. this->flags |= TypeFlagMask_JsrtExternal;
  21. }
  22. JsrtExternalObject::JsrtExternalObject(JsrtExternalType * type, void *data) :
  23. slot(data),
  24. Js::DynamicObject(type, false/* initSlots*/)
  25. {
  26. }
  27. /* static */
  28. JsrtExternalObject* JsrtExternalObject::Create(void *data, JsFinalizeCallback finalizeCallback, Js::ScriptContext *scriptContext)
  29. {
  30. Js::DynamicType * dynamicType = scriptContext->GetLibrary()->GetCachedJsrtExternalType(reinterpret_cast<uintptr_t>(finalizeCallback));
  31. if (dynamicType == nullptr)
  32. {
  33. dynamicType = RecyclerNew(scriptContext->GetRecycler(), JsrtExternalType, scriptContext, finalizeCallback);
  34. scriptContext->GetLibrary()->CacheJsrtExternalType(reinterpret_cast<uintptr_t>(finalizeCallback), dynamicType);
  35. }
  36. Assert(dynamicType->IsJsrtExternal());
  37. Assert(dynamicType->GetIsShared());
  38. return RecyclerNewFinalized(scriptContext->GetRecycler(), JsrtExternalObject, static_cast<JsrtExternalType*>(dynamicType), data);
  39. }
  40. bool JsrtExternalObject::Is(Js::Var value)
  41. {
  42. if (Js::TaggedNumber::Is(value))
  43. {
  44. return false;
  45. }
  46. return (VirtualTableInfo<JsrtExternalObject>::HasVirtualTable(value)) ||
  47. (VirtualTableInfo<Js::CrossSiteObject<JsrtExternalObject>>::HasVirtualTable(value));
  48. }
  49. JsrtExternalObject * JsrtExternalObject::FromVar(Js::Var value)
  50. {
  51. Assert(Is(value));
  52. return static_cast<JsrtExternalObject *>(value);
  53. }
  54. void JsrtExternalObject::Finalize(bool isShutdown)
  55. {
  56. JsFinalizeCallback finalizeCallback = this->GetExternalType()->GetJsFinalizeCallback();
  57. if (nullptr != finalizeCallback)
  58. {
  59. JsrtCallbackState scope(nullptr);
  60. finalizeCallback(this->slot);
  61. }
  62. }
  63. void JsrtExternalObject::Dispose(bool isShutdown)
  64. {
  65. }
  66. void * JsrtExternalObject::GetSlotData() const
  67. {
  68. return this->slot;
  69. }
  70. void JsrtExternalObject::SetSlotData(void * data)
  71. {
  72. this->slot = data;
  73. }
  74. Js::DynamicType* JsrtExternalObject::DuplicateType()
  75. {
  76. return RecyclerNew(this->GetScriptContext()->GetRecycler(), JsrtExternalType,
  77. this->GetExternalType());
  78. }
  79. #if ENABLE_TTD
  80. TTD::NSSnapObjects::SnapObjectType JsrtExternalObject::GetSnapTag_TTD() const
  81. {
  82. return TTD::NSSnapObjects::SnapObjectType::SnapExternalObject;
  83. }
  84. void JsrtExternalObject::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc)
  85. {
  86. TTD::NSSnapObjects::StdExtractSetKindSpecificInfo<void*, TTD::NSSnapObjects::SnapObjectType::SnapExternalObject>(objData, nullptr);
  87. }
  88. #endif