From 719fb1d79881a51948dcd85d0c2ce1da201c7fce Mon Sep 17 00:00:00 2001 From: David Siegel Date: Sat, 8 Nov 2014 21:14:28 +0100 Subject: [PATCH 1/6] WeakPersistent redesign: Launch a PR to chat with @kkoopa --- test/cpp/weak.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/cpp/weak.cpp b/test/cpp/weak.cpp index 609b9ffb..c5770444 100644 --- a/test/cpp/weak.cpp +++ b/test/cpp/weak.cpp @@ -8,6 +8,8 @@ #include +//============================================================================== + NAN_WEAK_CALLBACK(weakCallback) { int *parameter = data.GetParameter(); NanMakeCallback(NanGetCurrentContext()->Global(), data.GetValue(), 0, NULL); From 8734a5e74b0165c2929ffec436565bae2bb66689 Mon Sep 17 00:00:00 2001 From: David Siegel Date: Thu, 20 Nov 2014 15:14:05 +0100 Subject: [PATCH 2/6] Weak Persistent: Use explicit types in weak callback definition. --- test/cpp/weak.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cpp/weak.cpp b/test/cpp/weak.cpp index c5770444..51e01981 100644 --- a/test/cpp/weak.cpp +++ b/test/cpp/weak.cpp @@ -10,7 +10,7 @@ //============================================================================== -NAN_WEAK_CALLBACK(weakCallback) { +void weakCallback(_NanWeakCallbackData const& data) { int *parameter = data.GetParameter(); NanMakeCallback(NanGetCurrentContext()->Global(), data.GetValue(), 0, NULL); if ((*parameter)++ == 0) { From 7178ea6e1a540030c3cf25d65ae80cd08054bed6 Mon Sep 17 00:00:00 2001 From: David Siegel Date: Thu, 20 Nov 2014 19:55:41 +0100 Subject: [PATCH 3/6] WeakPersistent handling: Refactored for clarity. --- nan.h | 113 ++++++++++++++++++++++++++++++++++++++++++++++ test/cpp/weak.cpp | 2 +- 2 files changed, 114 insertions(+), 1 deletion(-) diff --git a/nan.h b/nan.h index e4903398..e106e51e 100644 --- a/nan.h +++ b/nan.h @@ -627,6 +627,8 @@ NAN_INLINE v8::Local _NanEnsureLocal(v8::Local val) { handle.Reset(v8::Isolate::GetCurrent(), obj); } +#if 0 +//============================================================================== template class _NanWeakCallbackData; @@ -706,6 +708,8 @@ NAN_INLINE _NanWeakCallbackInfo* NanMakeWeakPersistent( # define NAN_WEAK_CALLBACK(name) \ template \ static void name(const _NanWeakCallbackData &data) +//============================================================================== +#endif # define _NAN_ERROR(fun, errmsg) fun(NanNew(errmsg)) @@ -1426,6 +1430,8 @@ NAN_INLINE _NanWeakCallbackInfo* NanMakeWeakPersistent( handle = v8::Persistent::New(obj); } +#if 0 +//============================================================================== template class _NanWeakCallbackData; @@ -1511,6 +1517,8 @@ NAN_INLINE _NanWeakCallbackInfo* NanMakeWeakPersistent( # define NAN_WEAK_CALLBACK(name) \ template \ static void name(const _NanWeakCallbackData &data) +//============================================================================== +#endif # define _NAN_ERROR(fun, errmsg) \ fun(v8::String::New(errmsg)) @@ -2409,4 +2417,109 @@ 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); + 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 51e01981..622d9528 100644 --- a/test/cpp/weak.cpp +++ b/test/cpp/weak.cpp @@ -10,7 +10,7 @@ //============================================================================== -void weakCallback(_NanWeakCallbackData const& data) { +void weakCallback(NanWeakCallbackData & data) { int *parameter = data.GetParameter(); NanMakeCallback(NanGetCurrentContext()->Global(), data.GetValue(), 0, NULL); if ((*parameter)++ == 0) { From 5f7702493d7c30e93c66175a3b370f311570b1b3 Mon Sep 17 00:00:00 2001 From: David Siegel Date: Thu, 20 Nov 2014 20:23:48 +0100 Subject: [PATCH 4/6] WeakPersistent handling: Removed old implementation --- nan.h | 174 ---------------------------------------------------------- 1 file changed, 174 deletions(-) diff --git a/nan.h b/nan.h index e106e51e..3bfd72d0 100644 --- a/nan.h +++ b/nan.h @@ -627,90 +627,6 @@ NAN_INLINE v8::Local _NanEnsureLocal(v8::Local val) { handle.Reset(v8::Isolate::GetCurrent(), obj); } -#if 0 -//============================================================================== - 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) -//============================================================================== -#endif - # define _NAN_ERROR(fun, errmsg) fun(NanNew(errmsg)) # define _NAN_THROW_ERROR(fun, errmsg) \ @@ -1430,96 +1346,6 @@ NAN_INLINE _NanWeakCallbackInfo* NanMakeWeakPersistent( handle = v8::Persistent::New(obj); } -#if 0 -//============================================================================== - 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) -//============================================================================== -#endif - # define _NAN_ERROR(fun, errmsg) \ fun(v8::String::New(errmsg)) From 09e818b17244e5ffd8454c263e0e38a382f5c6c8 Mon Sep 17 00:00:00 2001 From: David Siegel Date: Thu, 20 Nov 2014 20:24:52 +0100 Subject: [PATCH 5/6] WeakPersistent handling: Cosmetics, indentation and no- linting. --- nan.h | 102 +++++++++++++++++++++++----------------------- test/cpp/weak.cpp | 3 +- 2 files changed, 54 insertions(+), 51 deletions(-) diff --git a/nan.h b/nan.h index 3bfd72d0..903a761e 100644 --- a/nan.h +++ b/nan.h @@ -2247,7 +2247,7 @@ NAN_INLINE void NanSetInstanceTemplate( #if (NODE_MODULE_VERSION > 0x000B) # define NAN_WEAK_CALLBACK_DATA_TYPE_ \ - v8::WeakCallbackData > const& + v8::WeakCallbackData > const& # define NAN_WEAK_CALLBACK_SIG_ \ NAN_WEAK_CALLBACK_DATA_TYPE_ #else @@ -2258,42 +2258,44 @@ NAN_INLINE void NanSetInstanceTemplate( template class NanWeakCallbackData { - public: // constructors - typedef void (*Callback)(NanWeakCallbackData & data); - 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; - } + 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); + static inline + NanWeakCallbackData * + unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data); - private: // data members - P* const parameter; - Callback const callback; - v8::Persistent persistent; + private: // data members + P* const parameter; + Callback const callback; + v8::Persistent persistent; }; #undef NAN_WEAK_CALLBACK_DATA_TYPE_ @@ -2302,35 +2304,35 @@ class NanWeakCallbackData { #if (NODE_MODULE_VERSION > 0x000B) template -NanWeakCallbackData::~NanWeakCallbackData() { persistent.Reset(); } +NanWeakCallbackData::~NanWeakCallbackData() { persistent.Reset(); } template void -NanWeakCallbackData::Revive() { persistent.SetWeak(this, &invoke); } +NanWeakCallbackData::Revive() { persistent.SetWeak(this, &invoke); } template -NanWeakCallbackData * -NanWeakCallbackData::unwrap( +NanWeakCallbackData * +NanWeakCallbackData::unwrap( v8::WeakCallbackData const& data) { - return data.GetParameter(); + return data.GetParameter(); } #else template -NanWeakCallbackData::~NanWeakCallbackData() { - persistent.Dispose(); - persistent.Clear(); +NanWeakCallbackData::~NanWeakCallbackData() { + persistent.Dispose(); + persistent.Clear(); } template void -NanWeakCallbackData::Revive() { persistent.MakeWeak(this, &invoke); } +NanWeakCallbackData::Revive() { persistent.MakeWeak(this, &invoke); } template -NanWeakCallbackData * -NanWeakCallbackData::unwrap(void * data) { - return static_cast(data); +NanWeakCallbackData * +NanWeakCallbackData::unwrap(void * data) { + return static_cast(data); } #endif @@ -2341,11 +2343,11 @@ NanMakeWeakPersistent( v8::Handle handle , P* parameter , typename NanWeakCallbackData::Callback callback) { - return new NanWeakCallbackData(handle, parameter, callback); + return new NanWeakCallbackData(handle, parameter, callback); } -# define NAN_WEAK_CALLBACK(name) \ - template \ - static void name(const NanWeakCallbackData &data) +# 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 622d9528..2e17c8c6 100644 --- a/test/cpp/weak.cpp +++ b/test/cpp/weak.cpp @@ -10,7 +10,8 @@ //============================================================================== -void weakCallback(NanWeakCallbackData & data) { +void weakCallback( +NanWeakCallbackData & data) { // NOLINT(runtime/references) int *parameter = data.GetParameter(); NanMakeCallback(NanGetCurrentContext()->Global(), data.GetValue(), 0, NULL); if ((*parameter)++ == 0) { From a645391c9eee189198ab1c778f91fbca464cff57 Mon Sep 17 00:00:00 2001 From: David Siegel Date: Thu, 20 Nov 2014 22:03:49 +0100 Subject: [PATCH 6/6] WeakPersistent handling: Cosmetics. --- nan.h | 3 +-- test/cpp/weak.cpp | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/nan.h b/nan.h index 903a761e..895382f7 100644 --- a/nan.h +++ b/nan.h @@ -2248,8 +2248,7 @@ NAN_INLINE void NanSetInstanceTemplate( #if (NODE_MODULE_VERSION > 0x000B) # define NAN_WEAK_CALLBACK_DATA_TYPE_ \ v8::WeakCallbackData > const& -# define NAN_WEAK_CALLBACK_SIG_ \ - NAN_WEAK_CALLBACK_DATA_TYPE_ +# define NAN_WEAK_CALLBACK_SIG_ NAN_WEAK_CALLBACK_DATA_TYPE_ #else # define NAN_WEAK_CALLBACK_DATA_TYPE_ void * # define NAN_WEAK_CALLBACK_SIG_ \ diff --git a/test/cpp/weak.cpp b/test/cpp/weak.cpp index 2e17c8c6..0d20b709 100644 --- a/test/cpp/weak.cpp +++ b/test/cpp/weak.cpp @@ -8,8 +8,6 @@ #include -//============================================================================== - void weakCallback( NanWeakCallbackData & data) { // NOLINT(runtime/references) int *parameter = data.GetParameter(); @@ -24,7 +22,7 @@ NanWeakCallbackData & data) { // NOLINT(runtime/references) 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; }