1*e1f25825SŁukasz Kosmaty // Copyright 2022-present 650 Industries. All rights reserved.
2*e1f25825SŁukasz Kosmaty 
3*e1f25825SŁukasz Kosmaty #ifdef __cplusplus
4*e1f25825SŁukasz Kosmaty 
5*e1f25825SŁukasz Kosmaty #import <jsi/jsi.h>
6*e1f25825SŁukasz Kosmaty 
7*e1f25825SŁukasz Kosmaty namespace jsi = facebook::jsi;
8*e1f25825SŁukasz Kosmaty 
9*e1f25825SŁukasz Kosmaty namespace expo::common {
10*e1f25825SŁukasz Kosmaty 
11*e1f25825SŁukasz Kosmaty class JSI_EXPORT ObjectDeallocator : public jsi::HostObject {
12*e1f25825SŁukasz Kosmaty public:
13*e1f25825SŁukasz Kosmaty   typedef std::function<void()> Block;
14*e1f25825SŁukasz Kosmaty 
ObjectDeallocator(const Block deallocator)15*e1f25825SŁukasz Kosmaty   ObjectDeallocator(const Block deallocator) : deallocator(deallocator) {};
16*e1f25825SŁukasz Kosmaty 
~ObjectDeallocator()17*e1f25825SŁukasz Kosmaty   virtual ~ObjectDeallocator() {
18*e1f25825SŁukasz Kosmaty     deallocator();
19*e1f25825SŁukasz Kosmaty   }
20*e1f25825SŁukasz Kosmaty 
21*e1f25825SŁukasz Kosmaty   const Block deallocator;
22*e1f25825SŁukasz Kosmaty 
23*e1f25825SŁukasz Kosmaty }; // class ObjectDeallocator
24*e1f25825SŁukasz Kosmaty 
25*e1f25825SŁukasz Kosmaty /**
26*e1f25825SŁukasz Kosmaty  Sets the deallocator block on a given object, which is called when the object is being deallocated.
27*e1f25825SŁukasz Kosmaty  */
28*e1f25825SŁukasz Kosmaty void setDeallocator(
29*e1f25825SŁukasz Kosmaty   jsi::Runtime &runtime,
30*e1f25825SŁukasz Kosmaty   const std::shared_ptr<jsi::Object> &jsThis,
31*e1f25825SŁukasz Kosmaty   ObjectDeallocator::Block deallocatorBlock,
32*e1f25825SŁukasz Kosmaty   const std::string &key = "__expo_object_deallocator__"
33*e1f25825SŁukasz Kosmaty );
34*e1f25825SŁukasz Kosmaty 
35*e1f25825SŁukasz Kosmaty } // namespace expo::common
36*e1f25825SŁukasz Kosmaty 
37*e1f25825SŁukasz Kosmaty #endif
38