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