3232
3333namespace node {
3434
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-
6935void BaseObject::Detach () {
7036 CHECK_GT (pointer_data ()->strong_ptr_count , 0 );
7137 pointer_data ()->is_detached = true ;
@@ -107,28 +73,6 @@ T* BaseObject::FromJSObject(v8::Local<v8::Value> object) {
10773 return static_cast <T*>(FromJSObject (object));
10874}
10975
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-
13276void BaseObject::OnGCCollect () {
13377 delete this ;
13478}
@@ -148,23 +92,6 @@ bool BaseObject::IsWeakOrDetached() const {
14892 return pd->wants_weak_jsobj || pd->is_detached ;
14993}
15094
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-
16895template <int Field>
16996void BaseObject::InternalFieldGet (
17097 v8::Local<v8::String> property,
@@ -185,37 +112,6 @@ bool BaseObject::has_pointer_data() const {
185112 return pointer_data_ != nullptr ;
186113}
187114
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-
219115template <typename T, bool kIsWeak >
220116BaseObject::PointerData*
221117BaseObjectPtrImpl<T, kIsWeak >::pointer_data() const {
0 commit comments