You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							438 lines
						
					
					
						
							15 KiB
						
					
					
				
			
		
		
	
	
							438 lines
						
					
					
						
							15 KiB
						
					
					
				| /*********************************************************************
 | |
|  * NAN - Native Abstractions for Node.js
 | |
|  *
 | |
|  * Copyright (c) 2018 NAN contributors
 | |
|  *
 | |
|  * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 | |
|  ********************************************************************/
 | |
| 
 | |
| #ifndef NAN_WEAK_H_
 | |
| #define NAN_WEAK_H_
 | |
| 
 | |
| static const int kInternalFieldsInWeakCallback = 2;
 | |
| static const int kNoInternalFieldIndex = -1;
 | |
| 
 | |
| #if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
 | |
|   (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
 | |
| # define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \
 | |
|     v8::WeakCallbackInfo<WeakCallbackInfo<T> > const&
 | |
| # define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \
 | |
|     NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
 | |
| # define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
 | |
| # define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
 | |
| #elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION
 | |
| # define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \
 | |
|     v8::PhantomCallbackData<WeakCallbackInfo<T> > const&
 | |
| # define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \
 | |
|     NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
 | |
| # define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
 | |
| # define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
 | |
| #elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
 | |
| # define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \
 | |
|     v8::PhantomCallbackData<WeakCallbackInfo<T> > const&
 | |
| # define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \
 | |
|     v8::InternalFieldsCallbackData<WeakCallbackInfo<T>, void> const&
 | |
| # define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
 | |
| # define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
 | |
| #elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
 | |
| # define NAN_WEAK_CALLBACK_DATA_TYPE_ \
 | |
|     v8::WeakCallbackData<S, WeakCallbackInfo<T> > 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<v8::Value>, NAN_WEAK_CALLBACK_DATA_TYPE_
 | |
| #endif
 | |
| 
 | |
| template<typename T>
 | |
| class WeakCallbackInfo {
 | |
|  public:
 | |
|   typedef void (*Callback)(const WeakCallbackInfo<T>& data);
 | |
|   WeakCallbackInfo(
 | |
|       Persistent<v8::Value> *persistent
 | |
|     , Callback callback
 | |
|     , void *parameter
 | |
|     , void *field1 = 0
 | |
|     , void *field2 = 0) :
 | |
|         callback_(callback), isolate_(0), parameter_(parameter) {
 | |
|     std::memcpy(&persistent_, persistent, sizeof (v8::Persistent<v8::Value>));
 | |
|     internal_fields_[0] = field1;
 | |
|     internal_fields_[1] = field2;
 | |
|   }
 | |
|   inline v8::Isolate *GetIsolate() const { return isolate_; }
 | |
|   inline T *GetParameter() const { return static_cast<T*>(parameter_); }
 | |
|   inline void *GetInternalField(int index) const {
 | |
|     assert((index == 0 || index == 1) && "internal field index out of bounds");
 | |
|     if (index == 0) {
 | |
|       return internal_fields_[0];
 | |
|     } else {
 | |
|       return internal_fields_[1];
 | |
|     }
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   NAN_DISALLOW_ASSIGN_COPY_MOVE(WeakCallbackInfo)
 | |
|   Callback callback_;
 | |
|   v8::Isolate *isolate_;
 | |
|   void *parameter_;
 | |
|   void *internal_fields_[kInternalFieldsInWeakCallback];
 | |
|   v8::Persistent<v8::Value> persistent_;
 | |
|   template<typename S, typename M> friend class Persistent;
 | |
|   template<typename S> friend class PersistentBase;
 | |
| #if NODE_MODULE_VERSION <= NODE_0_12_MODULE_VERSION
 | |
| # if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
 | |
|   template<typename S>
 | |
|   static void invoke(NAN_WEAK_CALLBACK_SIG_ data);
 | |
|   template<typename S>
 | |
|   static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data);
 | |
| # else
 | |
|   static void invoke(NAN_WEAK_CALLBACK_SIG_ data);
 | |
|   static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data);
 | |
| # endif
 | |
| #else
 | |
| # if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                     \
 | |
|   (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
 | |
|   template<bool isFirstPass>
 | |
|   static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data);
 | |
|   template<bool isFirstPass>
 | |
|   static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data);
 | |
| # else
 | |
|   static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data);
 | |
|   static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data);
 | |
| # endif
 | |
|   static WeakCallbackInfo *unwrapparameter(
 | |
|       NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data);
 | |
|   static WeakCallbackInfo *unwraptwofield(
 | |
|       NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data);
 | |
| #endif
 | |
| };
 | |
| 
 | |
| 
 | |
| #if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
 | |
|   (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
 | |
| 
 | |
| template<typename T>
 | |
| template<bool isFirstPass>
 | |
| void
 | |
| WeakCallbackInfo<T>::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) {
 | |
|   WeakCallbackInfo<T> *cbinfo = unwrapparameter(data);
 | |
|   if (isFirstPass) {
 | |
|     cbinfo->persistent_.Reset();
 | |
|     data.SetSecondPassCallback(invokeparameter<false>);
 | |
|   } else {
 | |
|     cbinfo->callback_(*cbinfo);
 | |
|     delete cbinfo;
 | |
|   }
 | |
| }
 | |
| 
 | |
| template<typename T>
 | |
| template<bool isFirstPass>
 | |
| void
 | |
| WeakCallbackInfo<T>::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) {
 | |
|   WeakCallbackInfo<T> *cbinfo = unwraptwofield(data);
 | |
|   if (isFirstPass) {
 | |
|     cbinfo->persistent_.Reset();
 | |
|     data.SetSecondPassCallback(invoketwofield<false>);
 | |
|   } else {
 | |
|     cbinfo->callback_(*cbinfo);
 | |
|     delete cbinfo;
 | |
|   }
 | |
| }
 | |
| 
 | |
| template<typename T>
 | |
| WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrapparameter(
 | |
|     NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) {
 | |
|   WeakCallbackInfo<T> *cbinfo =
 | |
|       static_cast<WeakCallbackInfo<T>*>(data.GetParameter());
 | |
|   cbinfo->isolate_ = data.GetIsolate();
 | |
|   return cbinfo;
 | |
| }
 | |
| 
 | |
| template<typename T>
 | |
| WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwraptwofield(
 | |
|     NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) {
 | |
|   WeakCallbackInfo<T> *cbinfo =
 | |
|       static_cast<WeakCallbackInfo<T>*>(data.GetInternalField(0));
 | |
|   cbinfo->isolate_ = data.GetIsolate();
 | |
|   return cbinfo;
 | |
| }
 | |
| 
 | |
| #undef NAN_WEAK_PARAMETER_CALLBACK_SIG_
 | |
| #undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_
 | |
| #undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
 | |
| #undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
 | |
| # elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
 | |
| 
 | |
| template<typename T>
 | |
| void
 | |
| WeakCallbackInfo<T>::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) {
 | |
|   WeakCallbackInfo<T> *cbinfo = unwrapparameter(data);
 | |
|   cbinfo->persistent_.Reset();
 | |
|   cbinfo->callback_(*cbinfo);
 | |
|   delete cbinfo;
 | |
| }
 | |
| 
 | |
| template<typename T>
 | |
| void
 | |
| WeakCallbackInfo<T>::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) {
 | |
|   WeakCallbackInfo<T> *cbinfo = unwraptwofield(data);
 | |
|   cbinfo->persistent_.Reset();
 | |
|   cbinfo->callback_(*cbinfo);
 | |
|   delete cbinfo;
 | |
| }
 | |
| 
 | |
| template<typename T>
 | |
| WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrapparameter(
 | |
|     NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) {
 | |
|   WeakCallbackInfo<T> *cbinfo =
 | |
|        static_cast<WeakCallbackInfo<T>*>(data.GetParameter());
 | |
|   cbinfo->isolate_ = data.GetIsolate();
 | |
|   return cbinfo;
 | |
| }
 | |
| 
 | |
| template<typename T>
 | |
| WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwraptwofield(
 | |
|     NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) {
 | |
|   WeakCallbackInfo<T> *cbinfo =
 | |
|        static_cast<WeakCallbackInfo<T>*>(data.GetInternalField1());
 | |
|   cbinfo->isolate_ = data.GetIsolate();
 | |
|   return cbinfo;
 | |
| }
 | |
| 
 | |
| #undef NAN_WEAK_PARAMETER_CALLBACK_SIG_
 | |
| #undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_
 | |
| #undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
 | |
| #undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
 | |
| #elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
 | |
| 
 | |
| template<typename T>
 | |
| template<typename S>
 | |
| void WeakCallbackInfo<T>::invoke(NAN_WEAK_CALLBACK_SIG_ data) {
 | |
|   WeakCallbackInfo<T> *cbinfo = unwrap(data);
 | |
|   cbinfo->persistent_.Reset();
 | |
|   cbinfo->callback_(*cbinfo);
 | |
|   delete cbinfo;
 | |
| }
 | |
| 
 | |
| template<typename T>
 | |
| template<typename S>
 | |
| WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrap(
 | |
|     NAN_WEAK_CALLBACK_DATA_TYPE_ data) {
 | |
|   void *parameter = data.GetParameter();
 | |
|   WeakCallbackInfo<T> *cbinfo =
 | |
|       static_cast<WeakCallbackInfo<T>*>(parameter);
 | |
|   cbinfo->isolate_ = data.GetIsolate();
 | |
|   return cbinfo;
 | |
| }
 | |
| 
 | |
| #undef NAN_WEAK_CALLBACK_SIG_
 | |
| #undef NAN_WEAK_CALLBACK_DATA_TYPE_
 | |
| #else
 | |
| 
 | |
| template<typename T>
 | |
| void WeakCallbackInfo<T>::invoke(NAN_WEAK_CALLBACK_SIG_ data) {
 | |
|   WeakCallbackInfo<T> *cbinfo = unwrap(data);
 | |
|   cbinfo->persistent_.Dispose();
 | |
|   cbinfo->persistent_.Clear();
 | |
|   cbinfo->callback_(*cbinfo);
 | |
|   delete cbinfo;
 | |
| }
 | |
| 
 | |
| template<typename T>
 | |
| WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrap(
 | |
|     NAN_WEAK_CALLBACK_DATA_TYPE_ data) {
 | |
|   WeakCallbackInfo<T> *cbinfo =
 | |
|       static_cast<WeakCallbackInfo<T>*>(data);
 | |
|   cbinfo->isolate_ = v8::Isolate::GetCurrent();
 | |
|   return cbinfo;
 | |
| }
 | |
| 
 | |
| #undef NAN_WEAK_CALLBACK_SIG_
 | |
| #undef NAN_WEAK_CALLBACK_DATA_TYPE_
 | |
| #endif
 | |
| 
 | |
| #if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
 | |
|   (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
 | |
| template<typename T, typename M>
 | |
| template<typename P>
 | |
| inline void Persistent<T, M>::SetWeak(
 | |
|     P *parameter
 | |
|   , typename WeakCallbackInfo<P>::Callback callback
 | |
|   , WeakCallbackType type) {
 | |
|   WeakCallbackInfo<P> *wcbd;
 | |
|   if (type == WeakCallbackType::kParameter) {
 | |
|     wcbd = new WeakCallbackInfo<P>(
 | |
|         reinterpret_cast<Persistent<v8::Value>*>(this)
 | |
|       , callback
 | |
|       , parameter);
 | |
|     v8::PersistentBase<T>::SetWeak(
 | |
|         wcbd
 | |
|       , WeakCallbackInfo<P>::template invokeparameter<true>
 | |
|       , type);
 | |
|   } else {
 | |
|     v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
 | |
|     assert((*self_v)->IsObject());
 | |
|     v8::Local<v8::Object> self((*self_v).As<v8::Object>());
 | |
|     int count = self->InternalFieldCount();
 | |
|     void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
 | |
|     for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
 | |
|       internal_fields[i] = self->GetAlignedPointerFromInternalField(i);
 | |
|     }
 | |
|     wcbd = new WeakCallbackInfo<P>(
 | |
|         reinterpret_cast<Persistent<v8::Value>*>(this)
 | |
|       , callback
 | |
|       , 0
 | |
|       , internal_fields[0]
 | |
|       , internal_fields[1]);
 | |
|     self->SetAlignedPointerInInternalField(0, wcbd);
 | |
|     v8::PersistentBase<T>::SetWeak(
 | |
|         static_cast<WeakCallbackInfo<P>*>(0)
 | |
|       , WeakCallbackInfo<P>::template invoketwofield<true>
 | |
|       , type);
 | |
|   }
 | |
| }
 | |
| #elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION
 | |
| template<typename T, typename M>
 | |
| template<typename P>
 | |
| inline void Persistent<T, M>::SetWeak(
 | |
|     P *parameter
 | |
|   , typename WeakCallbackInfo<P>::Callback callback
 | |
|   , WeakCallbackType type) {
 | |
|   WeakCallbackInfo<P> *wcbd;
 | |
|   if (type == WeakCallbackType::kParameter) {
 | |
|     wcbd = new WeakCallbackInfo<P>(
 | |
|         reinterpret_cast<Persistent<v8::Value>*>(this)
 | |
|       , callback
 | |
|       , parameter);
 | |
|     v8::PersistentBase<T>::SetPhantom(
 | |
|         wcbd
 | |
|       , WeakCallbackInfo<P>::invokeparameter);
 | |
|   } else {
 | |
|     v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
 | |
|     assert((*self_v)->IsObject());
 | |
|     v8::Local<v8::Object> self((*self_v).As<v8::Object>());
 | |
|     int count = self->InternalFieldCount();
 | |
|     void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
 | |
|     for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
 | |
|       internal_fields[i] = self->GetAlignedPointerFromInternalField(i);
 | |
|     }
 | |
|     wcbd = new WeakCallbackInfo<P>(
 | |
|         reinterpret_cast<Persistent<v8::Value>*>(this)
 | |
|       , callback
 | |
|       , 0
 | |
|       , internal_fields[0]
 | |
|       , internal_fields[1]);
 | |
|     self->SetAlignedPointerInInternalField(0, wcbd);
 | |
|     v8::PersistentBase<T>::SetPhantom(
 | |
|         static_cast<WeakCallbackInfo<P>*>(0)
 | |
|       , WeakCallbackInfo<P>::invoketwofield
 | |
|       , 0
 | |
|       , count > 1 ? 1 : kNoInternalFieldIndex);
 | |
|   }
 | |
| }
 | |
| #elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
 | |
| template<typename T, typename M>
 | |
| template<typename P>
 | |
| inline void Persistent<T, M>::SetWeak(
 | |
|     P *parameter
 | |
|   , typename WeakCallbackInfo<P>::Callback callback
 | |
|   , WeakCallbackType type) {
 | |
|   WeakCallbackInfo<P> *wcbd;
 | |
|   if (type == WeakCallbackType::kParameter) {
 | |
|     wcbd = new WeakCallbackInfo<P>(
 | |
|         reinterpret_cast<Persistent<v8::Value>*>(this)
 | |
|       , callback
 | |
|       , parameter);
 | |
|     v8::PersistentBase<T>::SetPhantom(
 | |
|         wcbd
 | |
|       , WeakCallbackInfo<P>::invokeparameter);
 | |
|   } else {
 | |
|     v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
 | |
|     assert((*self_v)->IsObject());
 | |
|     v8::Local<v8::Object> self((*self_v).As<v8::Object>());
 | |
|     int count = self->InternalFieldCount();
 | |
|     void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
 | |
|     for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
 | |
|       internal_fields[i] = self->GetAlignedPointerFromInternalField(i);
 | |
|     }
 | |
|     wcbd = new WeakCallbackInfo<P>(
 | |
|         reinterpret_cast<Persistent<v8::Value>*>(this)
 | |
|       , callback
 | |
|       , 0
 | |
|       , internal_fields[0]
 | |
|       , internal_fields[1]);
 | |
|     self->SetAlignedPointerInInternalField(0, wcbd);
 | |
|     v8::PersistentBase<T>::SetPhantom(
 | |
|         WeakCallbackInfo<P>::invoketwofield
 | |
|       , 0
 | |
|       , count > 1 ? 1 : kNoInternalFieldIndex);
 | |
|   }
 | |
| }
 | |
| #elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
 | |
| template<typename T, typename M>
 | |
| template<typename P>
 | |
| inline void Persistent<T, M>::SetWeak(
 | |
|     P *parameter
 | |
|   , typename WeakCallbackInfo<P>::Callback callback
 | |
|   , WeakCallbackType type) {
 | |
|   WeakCallbackInfo<P> *wcbd;
 | |
|   if (type == WeakCallbackType::kParameter) {
 | |
|     wcbd = new WeakCallbackInfo<P>(
 | |
|         reinterpret_cast<Persistent<v8::Value>*>(this)
 | |
|       , callback
 | |
|       , parameter);
 | |
|     v8::PersistentBase<T>::SetWeak(wcbd, WeakCallbackInfo<P>::invoke);
 | |
|   } else {
 | |
|     v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
 | |
|     assert((*self_v)->IsObject());
 | |
|     v8::Local<v8::Object> self((*self_v).As<v8::Object>());
 | |
|     int count = self->InternalFieldCount();
 | |
|     void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
 | |
|     for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
 | |
|       internal_fields[i] = self->GetAlignedPointerFromInternalField(i);
 | |
|     }
 | |
|     wcbd = new WeakCallbackInfo<P>(
 | |
|         reinterpret_cast<Persistent<v8::Value>*>(this)
 | |
|       , callback
 | |
|       , 0
 | |
|       , internal_fields[0]
 | |
|       , internal_fields[1]);
 | |
|     v8::PersistentBase<T>::SetWeak(wcbd, WeakCallbackInfo<P>::invoke);
 | |
|   }
 | |
| }
 | |
| #else
 | |
| template<typename T>
 | |
| template<typename P>
 | |
| inline void PersistentBase<T>::SetWeak(
 | |
|     P *parameter
 | |
|   , typename WeakCallbackInfo<P>::Callback callback
 | |
|   , WeakCallbackType type) {
 | |
|   WeakCallbackInfo<P> *wcbd;
 | |
|   if (type == WeakCallbackType::kParameter) {
 | |
|     wcbd = new WeakCallbackInfo<P>(
 | |
|         reinterpret_cast<Persistent<v8::Value>*>(this)
 | |
|       , callback
 | |
|       , parameter);
 | |
|     persistent.MakeWeak(wcbd, WeakCallbackInfo<P>::invoke);
 | |
|   } else {
 | |
|     v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
 | |
|     assert((*self_v)->IsObject());
 | |
|     v8::Local<v8::Object> self((*self_v).As<v8::Object>());
 | |
|     int count = self->InternalFieldCount();
 | |
|     void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
 | |
|     for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
 | |
|       internal_fields[i] = self->GetPointerFromInternalField(i);
 | |
|     }
 | |
|     wcbd = new WeakCallbackInfo<P>(
 | |
|         reinterpret_cast<Persistent<v8::Value>*>(this)
 | |
|       , callback
 | |
|       , 0
 | |
|       , internal_fields[0]
 | |
|       , internal_fields[1]);
 | |
|     persistent.MakeWeak(wcbd, WeakCallbackInfo<P>::invoke);
 | |
|   }
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif  // NAN_WEAK_H_
 |