diff --git a/src/node_object_wrap.h b/src/node_object_wrap.h index 6656664bdfd..7e26f25b0dd 100644 --- a/src/node_object_wrap.h +++ b/src/node_object_wrap.h @@ -13,15 +13,12 @@ class ObjectWrap { } virtual ~ObjectWrap ( ) { - if (!handle_.IsEmpty()) { - assert(handle_.IsNearDeath()); - handle_->SetInternalField(0, v8::Undefined()); - handle_.Dispose(); - handle_.Clear(); - } + assert(handle_.IsNearDeath()); + handle_->SetInternalField(0, v8::Undefined()); + handle_.Dispose(); + handle_.Clear(); } - protected: template static inline T* Unwrap (v8::Handle handle) { @@ -31,6 +28,9 @@ class ObjectWrap { handle->GetInternalField(0))->Value()); } + v8::Persistent handle_; // ro + + protected: inline void Wrap (v8::Handle handle) { assert(handle_.IsEmpty()); @@ -51,8 +51,8 @@ class ObjectWrap { */ virtual void Ref() { assert(!handle_.IsEmpty()); - assert(handle_.IsWeak()); refs_++; + handle_.ClearWeak(); } /* Unref() marks an object as detached from the event loop. This is its @@ -66,13 +66,11 @@ class ObjectWrap { */ virtual void Unref() { assert(!handle_.IsEmpty()); - assert(handle_.IsWeak()); + assert(!handle_.IsWeak()); assert(refs_ > 0); - refs_--; - if (refs_ == 0 && handle_.IsNearDeath()) delete this; + if (--refs_ == 0) { MakeWeak(); } } - v8::Persistent handle_; // ro int refs_; // ro private: @@ -80,11 +78,8 @@ class ObjectWrap { { ObjectWrap *obj = static_cast(data); assert(value == obj->handle_); - if (obj->refs_ == 0) { - delete obj; - } else { - obj->MakeWeak(); - } + assert(!obj->refs_); + if (value.IsNearDeath()) delete obj; } };