|
32 | 32 |
|
33 | 33 | namespace node { |
34 | 34 |
|
35 | | -BaseObject::BaseObject(Environment* env, v8::Local<v8::Object> object) |
36 | | - : persistent_handle_(env->isolate(), object), env_(env) { |
37 | | - CHECK_EQ(false, object.IsEmpty()); |
38 | | - CHECK_GT(object->InternalFieldCount(), 0); |
39 | | - object->SetAlignedPointerInInternalField( |
40 | | - BaseObject::kSlot, |
41 | | - static_cast<void*>(this)); |
42 | | - env->AddCleanupHook(DeleteMe, static_cast<void*>(this)); |
43 | | - env->modify_base_object_count(1); |
44 | | -} |
45 | | - |
46 | | -BaseObject::~BaseObject() { |
47 | | - env()->modify_base_object_count(-1); |
48 | | - env()->RemoveCleanupHook(DeleteMe, static_cast<void*>(this)); |
49 | | - |
50 | | - if (UNLIKELY(has_pointer_data())) { |
51 | | - PointerData* metadata = pointer_data(); |
52 | | - CHECK_EQ(metadata->strong_ptr_count, 0); |
53 | | - metadata->self = nullptr; |
54 | | - if (metadata->weak_ptr_count == 0) |
55 | | - delete metadata; |
56 | | - } |
57 | | - |
58 | | - if (persistent_handle_.IsEmpty()) { |
59 | | - // This most likely happened because the weak callback below cleared it. |
60 | | - return; |
61 | | - } |
62 | | - |
63 | | - { |
64 | | - v8::HandleScope handle_scope(env()->isolate()); |
65 | | - object()->SetAlignedPointerInInternalField(BaseObject::kSlot, nullptr); |
66 | | - } |
67 | | -} |
68 | | - |
69 | 35 | void BaseObject::Detach() { |
70 | 36 | CHECK_GT(pointer_data()->strong_ptr_count, 0); |
71 | 37 | pointer_data()->is_detached = true; |
@@ -107,28 +73,6 @@ T* BaseObject::FromJSObject(v8::Local<v8::Value> object) { |
107 | 73 | return static_cast<T*>(FromJSObject(object)); |
108 | 74 | } |
109 | 75 |
|
110 | | - |
111 | | -void BaseObject::MakeWeak() { |
112 | | - if (has_pointer_data()) { |
113 | | - pointer_data()->wants_weak_jsobj = true; |
114 | | - if (pointer_data()->strong_ptr_count > 0) return; |
115 | | - } |
116 | | - |
117 | | - persistent_handle_.SetWeak( |
118 | | - this, |
119 | | - [](const v8::WeakCallbackInfo<BaseObject>& data) { |
120 | | - BaseObject* obj = data.GetParameter(); |
121 | | - // Clear the persistent handle so that ~BaseObject() doesn't attempt |
122 | | - // to mess with internal fields, since the JS object may have |
123 | | - // transitioned into an invalid state. |
124 | | - // Refs: https://github.com/nodejs/node/issues/18897 |
125 | | - obj->persistent_handle_.Reset(); |
126 | | - CHECK_IMPLIES(obj->has_pointer_data(), |
127 | | - obj->pointer_data()->strong_ptr_count == 0); |
128 | | - obj->OnGCCollect(); |
129 | | - }, v8::WeakCallbackType::kParameter); |
130 | | -} |
131 | | - |
132 | 76 | void BaseObject::OnGCCollect() { |
133 | 77 | delete this; |
134 | 78 | } |
@@ -148,23 +92,6 @@ bool BaseObject::IsWeakOrDetached() const { |
148 | 92 | return pd->wants_weak_jsobj || pd->is_detached; |
149 | 93 | } |
150 | 94 |
|
151 | | -void BaseObject::LazilyInitializedJSTemplateConstructor( |
152 | | - const v8::FunctionCallbackInfo<v8::Value>& args) { |
153 | | - DCHECK(args.IsConstructCall()); |
154 | | - DCHECK_GT(args.This()->InternalFieldCount(), 0); |
155 | | - args.This()->SetAlignedPointerInInternalField(BaseObject::kSlot, nullptr); |
156 | | -} |
157 | | - |
158 | | -v8::Local<v8::FunctionTemplate> |
159 | | -BaseObject::MakeLazilyInitializedJSTemplate(Environment* env) { |
160 | | - v8::Local<v8::FunctionTemplate> t = |
161 | | - env->NewFunctionTemplate(LazilyInitializedJSTemplateConstructor); |
162 | | - t->Inherit(BaseObject::GetConstructorTemplate(env)); |
163 | | - t->InstanceTemplate()->SetInternalFieldCount( |
164 | | - BaseObject::kInternalFieldCount); |
165 | | - return t; |
166 | | -} |
167 | | - |
168 | 95 | template <int Field> |
169 | 96 | void BaseObject::InternalFieldGet( |
170 | 97 | v8::Local<v8::String> property, |
@@ -185,37 +112,6 @@ bool BaseObject::has_pointer_data() const { |
185 | 112 | return pointer_data_ != nullptr; |
186 | 113 | } |
187 | 114 |
|
188 | | -BaseObject::PointerData* BaseObject::pointer_data() { |
189 | | - if (!has_pointer_data()) { |
190 | | - PointerData* metadata = new PointerData(); |
191 | | - metadata->wants_weak_jsobj = persistent_handle_.IsWeak(); |
192 | | - metadata->self = this; |
193 | | - pointer_data_ = metadata; |
194 | | - } |
195 | | - CHECK(has_pointer_data()); |
196 | | - return pointer_data_; |
197 | | -} |
198 | | - |
199 | | -void BaseObject::decrease_refcount() { |
200 | | - CHECK(has_pointer_data()); |
201 | | - PointerData* metadata = pointer_data(); |
202 | | - CHECK_GT(metadata->strong_ptr_count, 0); |
203 | | - unsigned int new_refcount = --metadata->strong_ptr_count; |
204 | | - if (new_refcount == 0) { |
205 | | - if (metadata->is_detached) { |
206 | | - OnGCCollect(); |
207 | | - } else if (metadata->wants_weak_jsobj && !persistent_handle_.IsEmpty()) { |
208 | | - MakeWeak(); |
209 | | - } |
210 | | - } |
211 | | -} |
212 | | - |
213 | | -void BaseObject::increase_refcount() { |
214 | | - unsigned int prev_refcount = pointer_data()->strong_ptr_count++; |
215 | | - if (prev_refcount == 0 && !persistent_handle_.IsEmpty()) |
216 | | - persistent_handle_.ClearWeak(); |
217 | | -} |
218 | | - |
219 | 115 | template <typename T, bool kIsWeak> |
220 | 116 | BaseObject::PointerData* |
221 | 117 | BaseObjectPtrImpl<T, kIsWeak>::pointer_data() const { |
|