File indexing completed on 2026-10-02 09:10:09
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #ifndef SRC_NODE_OBJECT_WRAP_H_
0023 #define SRC_NODE_OBJECT_WRAP_H_
0024
0025 #include "v8.h"
0026 #include <cassert>
0027
0028
0029 namespace node {
0030
0031 class ObjectWrap {
0032 public:
0033 ObjectWrap() {
0034 refs_ = 0;
0035 }
0036
0037
0038 virtual ~ObjectWrap() {
0039 if (persistent().IsEmpty())
0040 return;
0041 persistent().ClearWeak();
0042 persistent().Reset();
0043 }
0044
0045
0046 template <class T>
0047 static inline T* Unwrap(v8::Local<v8::Object> handle) {
0048 assert(!handle.IsEmpty());
0049 assert(handle->InternalFieldCount() > 0);
0050
0051
0052 void* ptr = handle->GetAlignedPointerFromInternalField(
0053 0, v8::kEmbedderDataTypeTagDefault);
0054 ObjectWrap* wrap = static_cast<ObjectWrap*>(ptr);
0055 return static_cast<T*>(wrap);
0056 }
0057
0058
0059 inline v8::Local<v8::Object> handle() {
0060 return handle(v8::Isolate::GetCurrent());
0061 }
0062
0063
0064 inline v8::Local<v8::Object> handle(v8::Isolate* isolate) {
0065 return v8::Local<v8::Object>::New(isolate, persistent());
0066 }
0067
0068
0069
0070 inline v8::Persistent<v8::Object>& persistent() {
0071 return handle_;
0072 }
0073
0074
0075 protected:
0076 inline void Wrap(v8::Local<v8::Object> handle) {
0077 assert(persistent().IsEmpty());
0078 assert(handle->InternalFieldCount() > 0);
0079 handle->SetAlignedPointerInInternalField(
0080 0, this, v8::kEmbedderDataTypeTagDefault);
0081 persistent().Reset(v8::Isolate::GetCurrent(), handle);
0082 MakeWeak();
0083 }
0084
0085
0086 inline void MakeWeak() {
0087 persistent().SetWeak(this, WeakCallback, v8::WeakCallbackType::kParameter);
0088 }
0089
0090
0091
0092
0093
0094 virtual void Ref() {
0095 assert(!persistent().IsEmpty());
0096 persistent().ClearWeak();
0097 refs_++;
0098 }
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109 virtual void Unref() {
0110 assert(!persistent().IsEmpty());
0111 assert(!persistent().IsWeak());
0112 assert(refs_ > 0);
0113 if (--refs_ == 0)
0114 MakeWeak();
0115 }
0116
0117 int refs_;
0118
0119 private:
0120 static void WeakCallback(
0121 const v8::WeakCallbackInfo<ObjectWrap>& data) {
0122 ObjectWrap* wrap = data.GetParameter();
0123 assert(wrap->refs_ == 0);
0124 wrap->handle_.Reset();
0125 delete wrap;
0126 }
0127
0128
0129 v8::Persistent<v8::Object> handle_;
0130 };
0131
0132 }
0133
0134 #endif