JsrtExternalObject.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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::SimplePathTypeHandlerNoAttr::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::RecyclableObject * prototype, 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. JsrtExternalObject * externalObject = RecyclerNewFinalized(scriptContext->GetRecycler(), JsrtExternalObject, static_cast<JsrtExternalType*>(dynamicType), data);
  39. if (prototype != nullptr)
  40. {
  41. externalObject->SetPrototype(prototype);
  42. }
  43. return externalObject;
  44. }
  45. bool JsrtExternalObject::Is(Js::Var value)
  46. {
  47. if (Js::TaggedNumber::Is(value))
  48. {
  49. return false;
  50. }
  51. return (VirtualTableInfo<JsrtExternalObject>::HasVirtualTable(value)) ||
  52. (VirtualTableInfo<Js::CrossSiteObject<JsrtExternalObject>>::HasVirtualTable(value));
  53. }
  54. JsrtExternalObject * JsrtExternalObject::FromVar(Js::Var value)
  55. {
  56. AssertOrFailFast(Is(value));
  57. return static_cast<JsrtExternalObject *>(value);
  58. }
  59. JsrtExternalObject * JsrtExternalObject::UnsafeFromVar(Js::Var value)
  60. {
  61. Assert(Is(value));
  62. return static_cast<JsrtExternalObject *>(value);
  63. }
  64. void JsrtExternalObject::Finalize(bool isShutdown)
  65. {
  66. JsFinalizeCallback finalizeCallback = this->GetExternalType()->GetJsFinalizeCallback();
  67. if (nullptr != finalizeCallback)
  68. {
  69. JsrtCallbackState scope(nullptr);
  70. finalizeCallback(this->slot);
  71. }
  72. }
  73. void JsrtExternalObject::Dispose(bool isShutdown)
  74. {
  75. }
  76. void * JsrtExternalObject::GetSlotData() const
  77. {
  78. return this->slot;
  79. }
  80. void JsrtExternalObject::SetSlotData(void * data)
  81. {
  82. this->slot = data;
  83. }
  84. Js::DynamicType* JsrtExternalObject::DuplicateType()
  85. {
  86. return RecyclerNew(this->GetScriptContext()->GetRecycler(), JsrtExternalType,
  87. this->GetExternalType());
  88. }
  89. #if ENABLE_TTD
  90. TTD::NSSnapObjects::SnapObjectType JsrtExternalObject::GetSnapTag_TTD() const
  91. {
  92. return TTD::NSSnapObjects::SnapObjectType::SnapExternalObject;
  93. }
  94. void JsrtExternalObject::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc)
  95. {
  96. TTD::NSSnapObjects::StdExtractSetKindSpecificInfo<void*, TTD::NSSnapObjects::SnapObjectType::SnapExternalObject>(objData, nullptr);
  97. }
  98. #endif