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
			| 
								 
											4 years ago
										 
									 | 
							
								/*********************************************************************
							 | 
						||
| 
								 | 
							
								 * 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_
							 |