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 {
0 commit comments