diff --git a/nan.h b/nan.h index e4903398..895382f7 100644 --- a/nan.h +++ b/nan.h @@ -627,86 +627,6 @@ NAN_INLINE v8::Local _NanEnsureLocal(v8::Local val) { handle.Reset(v8::Isolate::GetCurrent(), obj); } - template - class _NanWeakCallbackData; - - template - struct _NanWeakCallbackInfo { - typedef void (*Callback)(const _NanWeakCallbackData& data); - NAN_INLINE _NanWeakCallbackInfo(v8::Handle handle, P* param, Callback cb) - : parameter(param), callback(cb) { - NanAssignPersistent(persistent, handle); - } - - NAN_INLINE ~_NanWeakCallbackInfo() { - persistent.Reset(); - } - - P* const parameter; - Callback const callback; - v8::Persistent persistent; - }; - - template - class _NanWeakCallbackData { - public: - NAN_INLINE _NanWeakCallbackData(_NanWeakCallbackInfo *info) - : info_(info) { } - - NAN_INLINE v8::Local GetValue() const { - return NanNew(info_->persistent); - } - - NAN_INLINE P* GetParameter() const { return info_->parameter; } - - NAN_INLINE bool IsNearDeath() const { - return info_->persistent.IsNearDeath(); - } - - NAN_INLINE void Revive() const; - - NAN_INLINE _NanWeakCallbackInfo* GetCallbackInfo() const { - return info_; - } - - NAN_DEPRECATED NAN_INLINE void Dispose() const { - } - - private: - _NanWeakCallbackInfo* info_; - }; - - template - static void _NanWeakCallbackDispatcher( - const v8::WeakCallbackData > &data) { - _NanWeakCallbackInfo *info = data.GetParameter(); - _NanWeakCallbackData wcbd(info); - info->callback(wcbd); - if (wcbd.IsNearDeath()) { - delete wcbd.GetCallbackInfo(); - } - } - - template - NAN_INLINE void _NanWeakCallbackData::Revive() const { - info_->persistent.SetWeak(info_, &_NanWeakCallbackDispatcher); - } - -template -NAN_INLINE _NanWeakCallbackInfo* NanMakeWeakPersistent( - v8::Handle handle - , P* parameter - , typename _NanWeakCallbackInfo::Callback callback) { - _NanWeakCallbackInfo *cbinfo = - new _NanWeakCallbackInfo(handle, parameter, callback); - cbinfo->persistent.SetWeak(cbinfo, &_NanWeakCallbackDispatcher); - return cbinfo; -} - -# define NAN_WEAK_CALLBACK(name) \ - template \ - static void name(const _NanWeakCallbackData &data) - # define _NAN_ERROR(fun, errmsg) fun(NanNew(errmsg)) # define _NAN_THROW_ERROR(fun, errmsg) \ @@ -1426,92 +1346,6 @@ NAN_INLINE _NanWeakCallbackInfo* NanMakeWeakPersistent( handle = v8::Persistent::New(obj); } - template - class _NanWeakCallbackData; - - template - struct _NanWeakCallbackInfo { - typedef void (*Callback)(const _NanWeakCallbackData &data); - NAN_INLINE _NanWeakCallbackInfo(v8::Handle handle, P* param, Callback cb) - : parameter(param) - , callback(cb) - , persistent(v8::Persistent::New(handle)) { } - - NAN_INLINE ~_NanWeakCallbackInfo() { - persistent.Dispose(); - persistent.Clear(); - } - - P* const parameter; - Callback const callback; - v8::Persistent persistent; - }; - - template - class _NanWeakCallbackData { - public: - NAN_INLINE _NanWeakCallbackData(_NanWeakCallbackInfo *info) - : info_(info) { } - - NAN_INLINE v8::Local GetValue() const { - return NanNew(info_->persistent); - } - - NAN_INLINE P* GetParameter() const { return info_->parameter; } - - NAN_INLINE bool IsNearDeath() const { - return info_->persistent.IsNearDeath(); - } - - NAN_INLINE void Revive() const; - - NAN_INLINE _NanWeakCallbackInfo* GetCallbackInfo() const { - return info_; - } - - NAN_DEPRECATED NAN_INLINE void Dispose() const { - } - - private: - _NanWeakCallbackInfo* info_; - }; - - template - static void _NanWeakPersistentDispatcher( - v8::Persistent object, void *data) { - _NanWeakCallbackInfo* info = - static_cast<_NanWeakCallbackInfo*>(data); - _NanWeakCallbackData wcbd(info); - info->callback(wcbd); - if (wcbd.IsNearDeath()) { - delete wcbd.GetCallbackInfo(); - } - } - - template - NAN_INLINE void _NanWeakCallbackData::Revive() const { - info_->persistent.MakeWeak( - info_ - , &_NanWeakPersistentDispatcher); - } - - template - NAN_INLINE _NanWeakCallbackInfo* NanMakeWeakPersistent( - v8::Handle handle - , P* parameter - , typename _NanWeakCallbackInfo::Callback callback) { - _NanWeakCallbackInfo *cbinfo = - new _NanWeakCallbackInfo(handle, parameter, callback); - cbinfo->persistent.MakeWeak( - cbinfo - , &_NanWeakPersistentDispatcher); - return cbinfo; - } - -# define NAN_WEAK_CALLBACK(name) \ - template \ - static void name(const _NanWeakCallbackData &data) - # define _NAN_ERROR(fun, errmsg) \ fun(v8::String::New(errmsg)) @@ -2409,4 +2243,110 @@ NAN_INLINE void NanSetInstanceTemplate( NanSetTemplate(templ->InstanceTemplate(), name, value, attributes); } +//=== Weak Persistent Handling ================================================= + +#if (NODE_MODULE_VERSION > 0x000B) +# define NAN_WEAK_CALLBACK_DATA_TYPE_ \ + v8::WeakCallbackData > const& +# define NAN_WEAK_CALLBACK_SIG_ NAN_WEAK_CALLBACK_DATA_TYPE_ +#else +# define NAN_WEAK_CALLBACK_DATA_TYPE_ void * +# define NAN_WEAK_CALLBACK_SIG_ \ + v8::Persistent, NAN_WEAK_CALLBACK_DATA_TYPE_ +#endif + +template +class NanWeakCallbackData { + public: // constructors + typedef void (*Callback)( + NanWeakCallbackData & data // NOLINT(runtime/references) + ); + NanWeakCallbackData(v8::Handle handle, P* param, Callback cb) + : parameter(param), callback(cb) { + NanAssignPersistent(persistent, handle); + Revive(); + } + inline ~NanWeakCallbackData(); + + public: // member functions + v8::Local GetValue() const { return NanNew(persistent); } + P* GetParameter() const { return parameter; } + bool IsNearDeath() const { return persistent.IsNearDeath(); } + inline void Revive(); + + NAN_DEPRECATED void Dispose() const {} + + private: // static member functions + static + void + invoke(NAN_WEAK_CALLBACK_SIG_ data) { + NanWeakCallbackData * wcbd = unwrap(data); + wcbd->callback(*wcbd); + if (wcbd->IsNearDeath()) { + delete wcbd; + } + } + + static inline + NanWeakCallbackData * + unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data); + + private: // data members + P* const parameter; + Callback const callback; + v8::Persistent persistent; +}; + +#undef NAN_WEAK_CALLBACK_DATA_TYPE_ +#undef NAN_WEAK_CALLBACK_SIG_ + +#if (NODE_MODULE_VERSION > 0x000B) + +template +NanWeakCallbackData::~NanWeakCallbackData() { persistent.Reset(); } + +template +void +NanWeakCallbackData::Revive() { persistent.SetWeak(this, &invoke); } + +template +NanWeakCallbackData * +NanWeakCallbackData::unwrap( + v8::WeakCallbackData const& data) { + return data.GetParameter(); +} + +#else + +template +NanWeakCallbackData::~NanWeakCallbackData() { + persistent.Dispose(); + persistent.Clear(); +} + +template +void +NanWeakCallbackData::Revive() { persistent.MakeWeak(this, &invoke); } + +template +NanWeakCallbackData * +NanWeakCallbackData::unwrap(void * data) { + return static_cast(data); +} +#endif + +template +inline +NanWeakCallbackData* +NanMakeWeakPersistent( + v8::Handle handle + , P* parameter + , typename NanWeakCallbackData::Callback callback) { + return new NanWeakCallbackData(handle, parameter, callback); +} + +# define NAN_WEAK_CALLBACK(name) \ + template \ + static void name(const NanWeakCallbackData &data) + #endif // NAN_H_ diff --git a/test/cpp/weak.cpp b/test/cpp/weak.cpp index 609b9ffb..0d20b709 100644 --- a/test/cpp/weak.cpp +++ b/test/cpp/weak.cpp @@ -8,7 +8,8 @@ #include -NAN_WEAK_CALLBACK(weakCallback) { +void weakCallback( +NanWeakCallbackData & data) { // NOLINT(runtime/references) int *parameter = data.GetParameter(); NanMakeCallback(NanGetCurrentContext()->Global(), data.GetValue(), 0, NULL); if ((*parameter)++ == 0) { @@ -21,7 +22,7 @@ NAN_WEAK_CALLBACK(weakCallback) { v8::Handle wrap(v8::Local func) { v8::Local lstring = NanNew("result"); int *parameter = new int(0); - NanMakeWeakPersistent(func, parameter, &weakCallback); + NanMakeWeakPersistent(func, parameter, weakCallback); return lstring; }