@@ -79,10 +79,11 @@ class object_registry final : public class_info
79
79
func_.Reset (isolate, func);
80
80
js_func_.Reset (isolate, js_func);
81
81
82
- // each JavaScript instance has 2 internal fields:
82
+ // each JavaScript instance has 3 internal fields:
83
83
// 0 - pointer to a wrapped C++ object
84
84
// 1 - pointer to this object_registry
85
- func->InstanceTemplate ()->SetInternalFieldCount (2 );
85
+ // 2 - pointer to the object destructor
86
+ func->InstanceTemplate ()->SetInternalFieldCount (3 );
86
87
func->Inherit (js_func);
87
88
}
88
89
@@ -105,7 +106,7 @@ class object_registry final : public class_info
105
106
106
107
~object_registry ()
107
108
{
108
- remove_objects (true );
109
+ remove_objects ();
109
110
}
110
111
111
112
v8::Isolate* isolate () { return isolate_; }
@@ -166,24 +167,24 @@ class object_registry final : public class_info
166
167
return false ;
167
168
}
168
169
169
- void remove_object (object_id const & obj, bool call_dtor )
170
+ void remove_object (object_id const & obj)
170
171
{
171
172
auto it = objects_.find (Traits::key (obj));
172
173
assert (it != objects_.end () && " no object" );
173
174
if (it != objects_.end ())
174
175
{
175
176
v8::HandleScope scope (isolate_);
176
- reset_object (*it, call_dtor );
177
+ reset_object (*it);
177
178
objects_.erase (it);
178
179
}
179
180
}
180
181
181
- void remove_objects (bool call_dtor )
182
+ void remove_objects ()
182
183
{
183
184
v8::HandleScope scope (isolate_);
184
185
for (auto & object : objects_)
185
186
{
186
- reset_object (object, call_dtor );
187
+ reset_object (object);
187
188
}
188
189
objects_.clear ();
189
190
}
@@ -236,20 +237,15 @@ class object_registry final : public class_info
236
237
237
238
obj->SetAlignedPointerInInternalField (0 , Traits::pointer_id (object));
238
239
obj->SetAlignedPointerInInternalField (1 , this );
240
+ obj->SetAlignedPointerInInternalField (2 , call_dtor? /* dtor_*/ this : nullptr );
239
241
240
242
v8::UniquePersistent<v8::Object> pobj (isolate_, obj);
241
- pobj.SetWeak (call_dtor? this : nullptr ,
242
- [](v8::WeakCallbackInfo<object_registry> const & data)
243
+ pobj.SetWeak (this , [](v8::WeakCallbackInfo<object_registry> const & data)
243
244
{
244
- bool const call_dtor = (data.GetParameter () != nullptr );
245
245
object_id object = data.GetInternalField (0 );
246
246
object_registry* this_ = static_cast <object_registry*>(data.GetInternalField (1 ));
247
- this_->remove_object (object, call_dtor );
247
+ this_->remove_object (object);
248
248
}, v8::WeakCallbackType::kInternalFields );
249
- if (!call_dtor)
250
- {
251
- pobj.MarkIndependent ();
252
- }
253
249
objects_.emplace (object, std::move (pobj));
254
250
255
251
return scope.Escape (obj);
@@ -272,7 +268,7 @@ class object_registry final : public class_info
272
268
while (value->IsObject ())
273
269
{
274
270
v8::Handle <v8::Object> obj = value->ToObject ();
275
- if (obj->InternalFieldCount () == 2 )
271
+ if (obj->InternalFieldCount () == 3 )
276
272
{
277
273
object_id id = obj->GetAlignedPointerFromInternalField (0 );
278
274
if (id)
@@ -295,19 +291,22 @@ class object_registry final : public class_info
295
291
}
296
292
297
293
private:
298
- void reset_object (std::pair<pointer_type const , v8::UniquePersistent<v8::Object>>& object, bool call_dtor )
294
+ void reset_object (std::pair<pointer_type const , v8::UniquePersistent<v8::Object>>& object)
299
295
{
296
+ bool call_dtor = true ;
300
297
if (!object.second .IsNearDeath ())
301
298
{
302
299
v8::Local<v8::Object> obj = to_local (isolate_, object.second );
303
- assert (obj->InternalFieldCount () == 2 );
300
+ assert (obj->InternalFieldCount () == 3 );
304
301
assert (obj->GetAlignedPointerFromInternalField (0 ) == Traits::pointer_id (object.first ));
305
302
assert (obj->GetAlignedPointerFromInternalField (1 ) == this );
303
+ call_dtor = (obj->GetAlignedPointerFromInternalField (2 ) != nullptr );
306
304
// remove internal fields to disable unwrapping for this V8 Object
307
305
obj->SetAlignedPointerInInternalField (0 , nullptr );
308
306
obj->SetAlignedPointerInInternalField (1 , nullptr );
307
+ obj->SetAlignedPointerInInternalField (2 , nullptr );
309
308
}
310
- if (call_dtor && !object. second . IsIndependent () )
309
+ if (call_dtor)
311
310
{
312
311
dtor_ (isolate_, object.first );
313
312
}
@@ -612,7 +611,7 @@ class class_
612
611
static void unreference_external (v8::Isolate* isolate, object_pointer_type const & ext)
613
612
{
614
613
using namespace detail ;
615
- return classes::find<Traits>(isolate, type_id<T>()).remove_object (Traits::pointer_id (ext), false );
614
+ return classes::find<Traits>(isolate, type_id<T>()).remove_object (Traits::pointer_id (ext));
616
615
}
617
616
618
617
// / As reference_external but delete memory for C++ object
@@ -654,14 +653,14 @@ class class_
654
653
static void destroy_object (v8::Isolate* isolate, object_pointer_type const & obj)
655
654
{
656
655
using namespace detail ;
657
- classes::find<Traits>(isolate, type_id<T>()).remove_object (Traits::pointer_id (obj), true );
656
+ classes::find<Traits>(isolate, type_id<T>()).remove_object (Traits::pointer_id (obj));
658
657
}
659
658
660
659
// / Destroy all wrapped C++ objects of this class
661
660
static void destroy_objects (v8::Isolate* isolate)
662
661
{
663
662
using namespace detail ;
664
- classes::find<Traits>(isolate, type_id<T>()).remove_objects (true );
663
+ classes::find<Traits>(isolate, type_id<T>()).remove_objects ();
665
664
}
666
665
667
666
// / Destroy all wrapped C++ objects and this binding class_
0 commit comments