Index: include/v8.h |
diff --git a/include/v8.h b/include/v8.h |
index fef350b47573848b971b4c34e3527c4ee44def99..004420c11d3670943574e159c4171eb5731e2c8a 100644 |
--- a/include/v8.h |
+++ b/include/v8.h |
@@ -120,7 +120,10 @@ class Value; |
template <class T> class Handle; |
template <class T> class Local; |
template <class T> class Eternal; |
-template <class T> class Persistent; |
+template<class T> class NonCopyablePersistentTraits; |
+template<class T, |
+ class M = NonCopyablePersistentTraits<T> > class Persistent; |
+template<class T, class P> class WeakCallbackObject; |
class FunctionTemplate; |
class ObjectTemplate; |
class Data; |
@@ -142,6 +145,7 @@ class Object; |
template<typename T> class CustomArguments; |
class PropertyCallbackArguments; |
class FunctionCallbackArguments; |
+class GlobalHandles; |
} |
@@ -169,27 +173,6 @@ class UniqueId { |
intptr_t data_; |
}; |
- |
-// --- Weak Handles --- |
- |
- |
-/** |
- * A weak reference callback function. |
- * |
- * This callback should either explicitly invoke Dispose on |object| if |
- * V8 wrapper is not needed anymore, or 'revive' it by invocation of MakeWeak. |
- * |
- * \param object the weak global object to be reclaimed by the garbage collector |
- * \param parameter the value passed in when making the weak global object |
- */ |
-template<typename T, typename P> |
-class WeakReferenceCallbacks { |
- public: |
- typedef void (*Revivable)(Isolate* isolate, |
- Persistent<T>* object, |
- P* parameter); |
-}; |
- |
// --- Handles --- |
#define TYPE_CHECK(T, S) \ |
@@ -230,13 +213,6 @@ template <class T> class Handle { |
*/ |
V8_INLINE(Handle()) : val_(0) {} |
-#ifdef V8_USE_UNSAFE_HANDLES |
- /** |
- * Creates a new handle for the specified value. |
- */ |
- V8_INLINE(explicit Handle(T* val)) : val_(val) {} |
-#endif |
- |
/** |
* Creates a handle for the contents of the specified handle. This |
* constructor allows you to pass handles as arguments by value and |
@@ -285,7 +261,6 @@ template <class T> class Handle { |
return *a == *b; |
} |
-#ifndef V8_USE_UNSAFE_HANDLES |
template <class S> V8_INLINE( |
bool operator==(const Persistent<S>& that) const) { |
internal::Object** a = reinterpret_cast<internal::Object**>(**this); |
@@ -294,7 +269,6 @@ template <class T> class Handle { |
if (b == 0) return false; |
return *a == *b; |
} |
-#endif |
/** |
* Checks whether two handles are different. |
@@ -306,12 +280,10 @@ template <class T> class Handle { |
return !operator==(that); |
} |
-#ifndef V8_USE_UNSAFE_HANDLES |
template <class S> V8_INLINE( |
bool operator!=(const Persistent<S>& that) const) { |
return !operator==(that); |
} |
-#endif |
template <class S> V8_INLINE(static Handle<T> Cast(Handle<S> that)) { |
#ifdef V8_ENABLE_CHECKS |
@@ -326,11 +298,9 @@ template <class T> class Handle { |
return Handle<S>::Cast(*this); |
} |
-#ifndef V8_USE_UNSAFE_HANDLES |
V8_INLINE(static Handle<T> New(Isolate* isolate, Handle<T> that)) { |
return New(isolate, that.val_); |
} |
- // TODO(dcarney): remove before cutover |
V8_INLINE(static Handle<T> New(Isolate* isolate, const Persistent<T>& that)) { |
return New(isolate, that.val_); |
} |
@@ -343,11 +313,10 @@ template <class T> class Handle { |
* Creates a new handle for the specified value. |
*/ |
V8_INLINE(explicit Handle(T* val)) : val_(val) {} |
-#endif |
private: |
friend class Utils; |
- template<class F> friend class Persistent; |
+ template<class F, class M> friend class Persistent; |
template<class F> friend class Local; |
template<class F> friend class FunctionCallbackInfo; |
template<class F> friend class PropertyCallbackInfo; |
@@ -359,9 +328,7 @@ template <class T> class Handle { |
friend class Context; |
friend class HandleScope; |
-#ifndef V8_USE_UNSAFE_HANDLES |
V8_INLINE(static Handle<T> New(Isolate* isolate, T* that)); |
-#endif |
T* val_; |
}; |
@@ -374,7 +341,6 @@ template <class T> class Handle { |
* handle scope are destroyed when the handle scope is destroyed. Hence it |
* is not necessary to explicitly deallocate local handles. |
*/ |
-// TODO(dcarney): deprecate entire class |
template <class T> class Local : public Handle<T> { |
public: |
V8_INLINE(Local()); |
@@ -389,10 +355,6 @@ template <class T> class Local : public Handle<T> { |
} |
-#ifdef V8_USE_UNSAFE_HANDLES |
- template <class S> V8_INLINE(Local(S* that) : Handle<T>(that)) { } |
-#endif |
- |
template <class S> V8_INLINE(static Local<T> Cast(Local<S> that)) { |
#ifdef V8_ENABLE_CHECKS |
// If we're going to perform the type check then we have to check |
@@ -401,12 +363,10 @@ template <class T> class Local : public Handle<T> { |
#endif |
return Local<T>(T::Cast(*that)); |
} |
-#ifndef V8_USE_UNSAFE_HANDLES |
template <class S> V8_INLINE(Local(Handle<S> that)) |
: Handle<T>(reinterpret_cast<T*>(*that)) { |
TYPE_CHECK(T, S); |
} |
-#endif |
template <class S> V8_INLINE(Local<S> As()) { |
return Local<S>::Cast(*this); |
@@ -419,21 +379,20 @@ template <class T> class Local : public Handle<T> { |
*/ |
V8_INLINE(static Local<T> New(Handle<T> that)); |
V8_INLINE(static Local<T> New(Isolate* isolate, Handle<T> that)); |
-#ifndef V8_USE_UNSAFE_HANDLES |
- // TODO(dcarney): remove before cutover |
- V8_INLINE(static Local<T> New(Isolate* isolate, const Persistent<T>& that)); |
+ template<class M> |
+ V8_INLINE(static Local<T> New(Isolate* isolate, |
+ const Persistent<T, M>& that)); |
#ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR |
private: |
#endif |
template <class S> V8_INLINE(Local(S* that) : Handle<T>(that)) { } |
-#endif |
private: |
friend class Utils; |
template<class F> friend class Eternal; |
- template<class F> friend class Persistent; |
+ template<class F, class M> friend class Persistent; |
template<class F> friend class Handle; |
template<class F> friend class FunctionCallbackInfo; |
template<class F> friend class PropertyCallbackInfo; |
@@ -468,6 +427,61 @@ template <class T> class Eternal { |
}; |
+template<class T, class P> |
+class WeakCallbackData { |
+ public: |
+ typedef void (*Callback)(const WeakCallbackData<T, P>& data); |
+ |
+ V8_INLINE(Isolate* GetIsolate()) const { return isolate_; } |
+ V8_INLINE(Local<T> GetValue()) const { return handle_; } |
+ V8_INLINE(P* GetParameter()) const { return parameter_; } |
+ |
+ private: |
+ friend class internal::GlobalHandles; |
+ WeakCallbackData(Isolate* isolate, Local<T> handle, P* parameter) |
+ : isolate_(isolate), handle_(handle), parameter_(parameter) { } |
+ Isolate* isolate_; |
+ Local<T> handle_; |
+ P* parameter_; |
+}; |
+ |
+ |
+// TODO(dcarney): Remove this class. |
+template<typename T, |
+ typename P, |
+ typename M = NonCopyablePersistentTraits<T> > |
+class WeakReferenceCallbacks { |
+ public: |
+ typedef void (*Revivable)(Isolate* isolate, |
+ Persistent<T, M>* object, |
+ P* parameter); |
+}; |
+ |
+ |
+/** |
+ * Default traits for Persistent. This class does not allow |
+ * use of the copy constructor or assignment operator. |
+ * At present kResetInDestructor is not set, but that will change in a future |
+ * version. |
+ */ |
+template<class T> |
+class NonCopyablePersistentTraits { |
+ public: |
+ typedef Persistent<T, NonCopyablePersistentTraits<T> > NonCopyablePersistent; |
+ static const bool kResetInDestructor = false; |
+ template<class S, class M> |
+ V8_INLINE(static void Copy(const Persistent<S, M>& source, |
+ NonCopyablePersistent* dest)) { |
+ Uncompilable<Object>(); |
+ } |
+ // TODO(dcarney): come up with a good compile error here. |
+ template<class O> |
+ V8_INLINE(static void Uncompilable()) { |
+ TYPE_CHECK(O, Primitive); |
+ } |
+}; |
+ |
+ |
/** |
* An object reference that is independent of any handle scope. Where |
* a Local handle only lives as long as the HandleScope in which it was |
@@ -477,106 +491,92 @@ template <class T> class Eternal { |
* A persistent handle contains a reference to a storage cell within |
* the v8 engine which holds an object value and which is updated by |
* the garbage collector whenever the object is moved. A new storage |
- * cell can be created using Persistent::New and existing handles can |
- * be disposed using Persistent::Dispose. Since persistent handles |
- * are passed by value you may have many persistent handle objects |
- * that point to the same storage cell. For instance, if you pass a |
- * persistent handle as an argument to a function you will not get two |
- * different storage cells but rather two references to the same |
- * storage cell. |
+ * cell can be created using the constructor or Persistent::Reset and |
+ * existing handles can be disposed using Persistent::Reset. |
+ * |
+ * Copy, assignment and destructor bevavior is controlled by the traits |
+ * class M. |
*/ |
-template <class T> class Persistent // NOLINT |
-#ifdef V8_USE_UNSAFE_HANDLES |
- : public Handle<T> { |
-#else |
- { // NOLINT |
-#endif |
+template <class T, class M> class Persistent { |
public: |
-#ifndef V8_USE_UNSAFE_HANDLES |
+ /** |
+ * A Persistent with no storage cell. |
+ */ |
V8_INLINE(Persistent()) : val_(0) { } |
- // TODO(dcarney): add this back before cutover. |
-// V8_INLINE(~Persistent()) { |
-// Dispose(); |
-// } |
- V8_INLINE(bool IsEmpty() const) { return val_ == 0; } |
- // TODO(dcarney): remove somehow before cutover |
- // The handle should either be 0, or a pointer to a live cell. |
- V8_INLINE(void Clear()) { val_ = 0; } |
- |
/** |
- * A constructor that creates a new global cell pointing to that. In contrast |
- * to the copy constructor, this creates a new persistent handle which needs |
- * to be separately disposed. |
+ * Construct a Persistent from a Handle. |
+ * When the Handle is non-empty, a new storage cell is created |
+ * pointing to the same object, and no flags are set. |
*/ |
template <class S> V8_INLINE(Persistent(Isolate* isolate, Handle<S> that)) |
- : val_(New(isolate, *that)) { } |
- |
- template <class S> V8_INLINE(Persistent(Isolate* isolate, |
- const Persistent<S>& that)) // NOLINT |
- : val_(New(isolate, *that)) { } |
- |
-#else |
+ : val_(New(isolate, *that)) { |
+ TYPE_CHECK(T, S); |
+ } |
/** |
- * Creates an empty persistent handle that doesn't point to any |
- * storage cell. |
+ * Construct a Persistent from a Persistent. |
+ * When the Persistent is non-empty, a new storage cell is created |
+ * pointing to the same object, and no flags are set. |
*/ |
- V8_INLINE(Persistent()) : Handle<T>() { } |
- |
+ template <class S, class M2> |
+ V8_INLINE(Persistent(Isolate* isolate, const Persistent<S, M2>& that)) |
+ : val_(New(isolate, *that)) { |
+ TYPE_CHECK(T, S); |
+ } |
/** |
- * Creates a persistent handle for the same storage cell as the |
- * specified handle. This constructor allows you to pass persistent |
- * handles as arguments by value and to assign between persistent |
- * handles. However, attempting to assign between incompatible |
- * persistent handles, for instance from a Persistent<String> to a |
- * Persistent<Number> will cause a compile-time error. Assigning |
- * between compatible persistent handles, for instance assigning a |
- * Persistent<String> to a variable declared as Persistent<Value>, |
- * is allowed as String is a subclass of Value. |
+ * The copy constructors and assignment operator create a Persistent |
+ * exactly as the Persistent constructor, but the Copy function from the |
+ * traits class is called, allowing the setting of flags based on the |
+ * copied Persistent. |
*/ |
- template <class S> V8_INLINE(Persistent(Persistent<S> that)) |
- : Handle<T>(reinterpret_cast<T*>(*that)) { |
- /** |
- * This check fails when trying to convert between incompatible |
- * handles. For example, converting from a Handle<String> to a |
- * Handle<Number>. |
- */ |
- TYPE_CHECK(T, S); |
+ V8_INLINE(Persistent(const Persistent& that)) : val_(0) { |
+ Copy(that); |
+ } |
+ template <class S, class M2> |
+ V8_INLINE(Persistent(const Persistent<S, M2>& that)) : val_(0) { |
+ Copy(that); |
+ } |
+ V8_INLINE(Persistent& operator=(const Persistent& that)) { // NOLINT |
+ Copy(that); |
+ return *this; |
+ } |
+ template <class S, class M2> |
+ V8_INLINE(Persistent& operator=(const Persistent<S, M2>& that)) { // NOLINT |
+ Copy(that); |
+ return *this; |
} |
- |
- template <class S> V8_INLINE(Persistent(S* that)) : Handle<T>(that) { } |
- |
/** |
- * A constructor that creates a new global cell pointing to that. In contrast |
- * to the copy constructor, this creates a new persistent handle which needs |
- * to be separately disposed. |
+ * The destructor will dispose the Persistent based on the |
+ * kResetInDestructor flags in the traits class. Since not calling dispose |
+ * can result in a memory leak, it is recommended to always set this flag. |
*/ |
- template <class S> V8_INLINE(Persistent(Isolate* isolate, Handle<S> that)) |
- : Handle<T>(New(isolate, that)) { } |
+ V8_INLINE(~Persistent()) { |
+ if (M::kResetInDestructor) Reset(); |
+ } |
/** |
- * "Casts" a plain handle which is known to be a persistent handle |
- * to a persistent handle. |
+ * If non-empty, destroy the underlying storage cell |
+ * IsEmpty() will return true after this call. |
*/ |
- template <class S> explicit V8_INLINE(Persistent(Handle<S> that)) |
- : Handle<T>(*that) { } |
- |
-#endif |
- |
-#ifdef V8_USE_UNSAFE_HANDLES |
- template <class S> V8_INLINE(static Persistent<T> Cast(Persistent<S> that)) { |
-#ifdef V8_ENABLE_CHECKS |
- // If we're going to perform the type check then we have to check |
- // that the handle isn't empty before doing the checked cast. |
- if (that.IsEmpty()) return Persistent<T>(); |
-#endif |
- return Persistent<T>(T::Cast(*that)); |
- } |
+ V8_INLINE(void Reset()); |
+ template <class S> |
+ /** |
+ * If non-empty, destroy the underlying storage cell |
+ * and create a new one with the contents of other if other is non empty |
+ */ |
+ V8_INLINE(void Reset(Isolate* isolate, const Handle<S>& other)); |
+ /** |
+ * If non-empty, destroy the underlying storage cell |
+ * and create a new one with the contents of other if other is non empty |
+ */ |
+ template <class S, class M2> |
+ V8_INLINE(void Reset(Isolate* isolate, const Persistent<S, M2>& other)); |
+ // TODO(dcarney): deprecate |
+ V8_INLINE(void Dispose()) { Reset(); } |
+ V8_DEPRECATED(V8_INLINE(void Dispose(Isolate* isolate))) { Reset(); } |
- template <class S> V8_INLINE(Persistent<S> As()) { |
- return Persistent<S>::Cast(*this); |
- } |
+ V8_INLINE(bool IsEmpty() const) { return val_ == 0; } |
-#else |
+ // TODO(dcarney): this is pretty useless, fix or remove |
template <class S> |
V8_INLINE(static Persistent<T>& Cast(Persistent<S>& that)) { // NOLINT |
#ifdef V8_ENABLE_CHECKS |
@@ -587,20 +587,13 @@ template <class T> class Persistent // NOLINT |
return reinterpret_cast<Persistent<T>&>(that); |
} |
+ // TODO(dcarney): this is pretty useless, fix or remove |
template <class S> V8_INLINE(Persistent<S>& As()) { // NOLINT |
return Persistent<S>::Cast(*this); |
} |
-#endif |
- |
-#ifdef V8_USE_UNSAFE_HANDLES |
- V8_DEPRECATED(static Persistent<T> New(Handle<T> that)); |
- V8_INLINE(static Persistent<T> New(Isolate* isolate, Handle<T> that)); |
- V8_INLINE(static Persistent<T> New(Isolate* isolate, Persistent<T> that)); |
-#endif |
-#ifndef V8_USE_UNSAFE_HANDLES |
- template <class S> V8_INLINE( |
- bool operator==(const Persistent<S>& that) const) { |
+ template <class S, class M2> V8_INLINE( |
+ bool operator==(const Persistent<S, M2>& that) const) { |
internal::Object** a = reinterpret_cast<internal::Object**>(**this); |
internal::Object** b = reinterpret_cast<internal::Object**>(*that); |
if (a == 0) return b == 0; |
@@ -616,52 +609,35 @@ template <class T> class Persistent // NOLINT |
return *a == *b; |
} |
- template <class S> V8_INLINE( |
- bool operator!=(const Persistent<S>& that) const) { |
+ template <class S, class M2> V8_INLINE( |
+ bool operator!=(const Persistent<S, M2>& that) const) { |
return !operator==(that); |
} |
template <class S> V8_INLINE(bool operator!=(const Handle<S>& that) const) { |
return !operator==(that); |
} |
-#endif |
- V8_INLINE(void Dispose()); |
+ template<typename P> |
+ V8_INLINE(void SetWeak( |
+ P* parameter, |
+ typename WeakCallbackData<T, P>::Callback callback)); |
- /** |
- * Releases the storage cell referenced by this persistent handle. |
- * Does not remove the reference to the cell from any handles. |
- * This handle's reference, and any other references to the storage |
- * cell remain and IsEmpty will still return false. |
- */ |
- V8_DEPRECATED(V8_INLINE(void Dispose(Isolate* isolate))) { Dispose(); } |
+ template<typename S, typename P> |
+ V8_INLINE(void SetWeak( |
+ P* parameter, |
+ typename WeakCallbackData<S, P>::Callback callback)); |
- /** |
- * Make the reference to this object weak. When only weak handles |
- * refer to the object, the garbage collector will perform a |
- * callback to the given V8::NearDeathCallback function, passing |
- * it the object reference and the given parameters. |
- */ |
+ // TODO(dcarney): deprecate |
template<typename S, typename P> |
V8_INLINE(void MakeWeak( |
- P* parameters, |
+ P* parameter, |
typename WeakReferenceCallbacks<S, P>::Revivable callback)); |
+ // TODO(dcarney): deprecate |
template<typename P> |
V8_INLINE(void MakeWeak( |
- P* parameters, |
- typename WeakReferenceCallbacks<T, P>::Revivable callback)); |
- |
- template<typename S, typename P> |
- V8_DEPRECATED(void MakeWeak( |
- Isolate* isolate, |
- P* parameters, |
- typename WeakReferenceCallbacks<S, P>::Revivable callback)); |
- |
- template<typename P> |
- V8_DEPRECATED(void MakeWeak( |
- Isolate* isolate, |
- P* parameters, |
+ P* parameter, |
typename WeakReferenceCallbacks<T, P>::Revivable callback)); |
V8_INLINE(void ClearWeak()); |
@@ -735,68 +711,35 @@ template <class T> class Persistent // NOLINT |
return WrapperClassId(); |
} |
- /** |
- * Disposes the current contents of the handle and replaces it. |
- */ |
- V8_INLINE(void Reset(Isolate* isolate, const Handle<T>& other)); |
- |
-#ifndef V8_USE_UNSAFE_HANDLES |
- V8_INLINE(void Reset(Isolate* isolate, const Persistent<T>& other)); |
-#endif |
- |
- /** |
- * Returns the underlying raw pointer and clears the handle. The caller is |
- * responsible of eventually destroying the underlying object (by creating a |
- * Persistent handle which points to it and Disposing it). In the future, |
- * destructing a Persistent will also Dispose it. With this function, the |
- * embedder can let the Persistent go out of scope without it getting |
- * disposed. |
- */ |
+ // TODO(dcarney): remove |
V8_INLINE(T* ClearAndLeak()); |
-#ifndef V8_USE_UNSAFE_HANDLES |
- |
- private: |
- // TODO(dcarney): make unlinkable before cutover |
- V8_INLINE(Persistent(const Persistent& that)) : val_(that.val_) {} |
- // TODO(dcarney): make unlinkable before cutover |
- V8_INLINE(Persistent& operator=(const Persistent& that)) { // NOLINT |
- this->val_ = that.val_; |
- return *this; |
- } |
+ // TODO(dcarney): remove |
+ V8_INLINE(void Clear()) { val_ = 0; } |
- public: |
+ // TODO(dcarney): remove |
#ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR |
private: |
#endif |
- // TODO(dcarney): remove before cutover |
template <class S> V8_INLINE(Persistent(S* that)) : val_(that) { } |
- // TODO(dcarney): remove before cutover |
V8_INLINE(T* operator*() const) { return val_; } |
private: |
- // TODO(dcarney): remove before cutover |
- V8_INLINE(T* operator->() const) { return val_; } |
- public: |
-#endif |
- |
- private: |
friend class Utils; |
template<class F> friend class Handle; |
template<class F> friend class Local; |
- template<class F> friend class Persistent; |
+ template<class F1, class F2> friend class Persistent; |
template<class F> friend class ReturnValue; |
V8_INLINE(static T* New(Isolate* isolate, T* that)); |
+ template<class S, class M2> |
+ V8_INLINE(void Copy(const Persistent<S, M2>& that)); |
-#ifndef V8_USE_UNSAFE_HANDLES |
T* val_; |
-#endif |
}; |
- |
/** |
* A stack-allocated class that governs a number of local handles. |
* After a handle scope has been created, all local handles will be |
@@ -4719,10 +4662,13 @@ class V8_EXPORT V8 { |
static internal::Object** GlobalizeReference(internal::Isolate* isolate, |
internal::Object** handle); |
+ static internal::Object** CopyPersistent(internal::Object** handle); |
static void DisposeGlobal(internal::Object** global_handle); |
typedef WeakReferenceCallbacks<Value, void>::Revivable RevivableCallback; |
+ typedef WeakCallbackData<Value, void>::Callback WeakCallback; |
static void MakeWeak(internal::Object** global_handle, |
void* data, |
+ WeakCallback weak_callback, |
RevivableCallback weak_reference_callback); |
static void ClearWeak(internal::Object** global_handle); |
static void Eternalize(Isolate* isolate, |
@@ -4733,7 +4679,7 @@ class V8_EXPORT V8 { |
template <class T> friend class Handle; |
template <class T> friend class Local; |
template <class T> friend class Eternal; |
- template <class T> friend class Persistent; |
+ template <class T, class M> friend class Persistent; |
friend class Context; |
}; |
@@ -5074,11 +5020,7 @@ class V8_EXPORT Context { |
} |
// TODO(dcarney): deprecate |
V8_INLINE(Scope(Isolate* isolate, Persistent<Context>& context)) // NOLINT |
-#ifndef V8_USE_UNSAFE_HANDLES |
: context_(Handle<Context>::New(isolate, context)) { |
-#else |
- : context_(Local<Context>::New(isolate, context)) { |
-#endif |
context_->Enter(); |
} |
V8_INLINE(~Scope()) { context_->Exit(); } |
@@ -5568,9 +5510,9 @@ Local<T> Local<T>::New(Isolate* isolate, Handle<T> that) { |
return New(isolate, that.val_); |
} |
-#ifndef V8_USE_UNSAFE_HANDLES |
template <class T> |
-Local<T> Local<T>::New(Isolate* isolate, const Persistent<T>& that) { |
+template <class M> |
+Local<T> Local<T>::New(Isolate* isolate, const Persistent<T, M>& that) { |
return New(isolate, that.val_); |
} |
@@ -5582,7 +5524,6 @@ Handle<T> Handle<T>::New(Isolate* isolate, T* that) { |
return Handle<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( |
reinterpret_cast<internal::Isolate*>(isolate), *p))); |
} |
-#endif |
template <class T> |
@@ -5609,27 +5550,8 @@ Local<T> Eternal<T>::Get(Isolate* isolate) { |
} |
-#ifdef V8_USE_UNSAFE_HANDLES |
-template <class T> |
-Persistent<T> Persistent<T>::New(Handle<T> that) { |
- return New(Isolate::GetCurrent(), that.val_); |
-} |
- |
- |
-template <class T> |
-Persistent<T> Persistent<T>::New(Isolate* isolate, Handle<T> that) { |
- return New(Isolate::GetCurrent(), that.val_); |
-} |
- |
-template <class T> |
-Persistent<T> Persistent<T>::New(Isolate* isolate, Persistent<T> that) { |
- return New(Isolate::GetCurrent(), that.val_); |
-} |
-#endif |
- |
- |
-template <class T> |
-T* Persistent<T>::New(Isolate* isolate, T* that) { |
+template <class T, class M> |
+T* Persistent<T, M>::New(Isolate* isolate, T* that) { |
if (that == NULL) return NULL; |
internal::Object** p = reinterpret_cast<internal::Object**>(that); |
return reinterpret_cast<T*>( |
@@ -5638,8 +5560,20 @@ T* Persistent<T>::New(Isolate* isolate, T* that) { |
} |
-template <class T> |
-bool Persistent<T>::IsIndependent() const { |
+template <class T, class M> |
+template <class S, class M2> |
+void Persistent<T, M>::Copy(const Persistent<S, M2>& that) { |
+ TYPE_CHECK(T, S); |
+ Reset(); |
+ if (that.IsEmpty()) return; |
+ internal::Object** p = reinterpret_cast<internal::Object**>(that.val_); |
+ this->val_ = reinterpret_cast<T*>(V8::CopyPersistent(p)); |
+ M::Copy(that, this); |
+} |
+ |
+ |
+template <class T, class M> |
+bool Persistent<T, M>::IsIndependent() const { |
typedef internal::Internals I; |
if (this->IsEmpty()) return false; |
return I::GetNodeFlag(reinterpret_cast<internal::Object**>(this->val_), |
@@ -5647,8 +5581,8 @@ bool Persistent<T>::IsIndependent() const { |
} |
-template <class T> |
-bool Persistent<T>::IsNearDeath() const { |
+template <class T, class M> |
+bool Persistent<T, M>::IsNearDeath() const { |
typedef internal::Internals I; |
if (this->IsEmpty()) return false; |
uint8_t node_state = |
@@ -5658,8 +5592,8 @@ bool Persistent<T>::IsNearDeath() const { |
} |
-template <class T> |
-bool Persistent<T>::IsWeak() const { |
+template <class T, class M> |
+bool Persistent<T, M>::IsWeak() const { |
typedef internal::Internals I; |
if (this->IsEmpty()) return false; |
return I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_)) == |
@@ -5667,66 +5601,89 @@ bool Persistent<T>::IsWeak() const { |
} |
-template <class T> |
-void Persistent<T>::Dispose() { |
+template <class T, class M> |
+void Persistent<T, M>::Reset() { |
if (this->IsEmpty()) return; |
V8::DisposeGlobal(reinterpret_cast<internal::Object**>(this->val_)); |
-#ifndef V8_USE_UNSAFE_HANDLES |
val_ = 0; |
-#endif |
} |
-template <class T> |
+template <class T, class M> |
+template <class S> |
+void Persistent<T, M>::Reset(Isolate* isolate, const Handle<S>& other) { |
+ TYPE_CHECK(T, S); |
+ Reset(); |
+ if (other.IsEmpty()) return; |
+ this->val_ = New(isolate, other.val_); |
+} |
+ |
+ |
+template <class T, class M> |
+template <class S, class M2> |
+void Persistent<T, M>::Reset(Isolate* isolate, |
+ const Persistent<S, M2>& other) { |
+ TYPE_CHECK(T, S); |
+ Reset(); |
+ if (other.IsEmpty()) return; |
+ this->val_ = New(isolate, other.val_); |
+} |
+ |
+ |
+template <class T, class M> |
template <typename S, typename P> |
-void Persistent<T>::MakeWeak( |
- P* parameters, |
- typename WeakReferenceCallbacks<S, P>::Revivable callback) { |
+void Persistent<T, M>::SetWeak( |
+ P* parameter, |
+ typename WeakCallbackData<S, P>::Callback callback) { |
TYPE_CHECK(S, T); |
- typedef typename WeakReferenceCallbacks<Value, void>::Revivable Revivable; |
+ typedef typename WeakCallbackData<Value, void>::Callback Callback; |
V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_), |
- parameters, |
- reinterpret_cast<Revivable>(callback)); |
+ parameter, |
+ reinterpret_cast<Callback>(callback), |
+ NULL); |
} |
-template <class T> |
+template <class T, class M> |
template <typename P> |
-void Persistent<T>::MakeWeak( |
- P* parameters, |
- typename WeakReferenceCallbacks<T, P>::Revivable callback) { |
- MakeWeak<T, P>(parameters, callback); |
+void Persistent<T, M>::SetWeak( |
+ P* parameter, |
+ typename WeakCallbackData<T, P>::Callback callback) { |
+ SetWeak<T, P>(parameter, callback); |
} |
-template <class T> |
+template <class T, class M> |
template <typename S, typename P> |
-void Persistent<T>::MakeWeak( |
- Isolate* isolate, |
+void Persistent<T, M>::MakeWeak( |
P* parameters, |
typename WeakReferenceCallbacks<S, P>::Revivable callback) { |
- MakeWeak<S, P>(parameters, callback); |
+ TYPE_CHECK(S, T); |
+ typedef typename WeakReferenceCallbacks<Value, void>::Revivable Revivable; |
+ V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_), |
+ parameters, |
+ NULL, |
+ reinterpret_cast<Revivable>(callback)); |
} |
-template <class T> |
-template<typename P> |
-void Persistent<T>::MakeWeak( |
- Isolate* isolate, |
+template <class T, class M> |
+template <typename P> |
+void Persistent<T, M>::MakeWeak( |
P* parameters, |
typename WeakReferenceCallbacks<T, P>::Revivable callback) { |
- MakeWeak<P>(parameters, callback); |
+ MakeWeak<T, P>(parameters, callback); |
} |
-template <class T> |
-void Persistent<T>::ClearWeak() { |
+template <class T, class M> |
+void Persistent<T, M>::ClearWeak() { |
V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_)); |
} |
-template <class T> |
-void Persistent<T>::MarkIndependent() { |
+template <class T, class M> |
+void Persistent<T, M>::MarkIndependent() { |
typedef internal::Internals I; |
if (this->IsEmpty()) return; |
I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_), |
@@ -5735,8 +5692,8 @@ void Persistent<T>::MarkIndependent() { |
} |
-template <class T> |
-void Persistent<T>::MarkPartiallyDependent() { |
+template <class T, class M> |
+void Persistent<T, M>::MarkPartiallyDependent() { |
typedef internal::Internals I; |
if (this->IsEmpty()) return; |
I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_), |
@@ -5745,54 +5702,17 @@ void Persistent<T>::MarkPartiallyDependent() { |
} |
-template <class T> |
-void Persistent<T>::Reset(Isolate* isolate, const Handle<T>& other) { |
- Dispose(); |
-#ifdef V8_USE_UNSAFE_HANDLES |
- *this = *New(isolate, other); |
-#else |
- if (other.IsEmpty()) { |
- this->val_ = NULL; |
- return; |
- } |
- internal::Object** p = reinterpret_cast<internal::Object**>(other.val_); |
- this->val_ = reinterpret_cast<T*>( |
- V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), p)); |
-#endif |
-} |
- |
- |
-#ifndef V8_USE_UNSAFE_HANDLES |
-template <class T> |
-void Persistent<T>::Reset(Isolate* isolate, const Persistent<T>& other) { |
- Dispose(); |
- if (other.IsEmpty()) { |
- this->val_ = NULL; |
- return; |
- } |
- internal::Object** p = reinterpret_cast<internal::Object**>(other.val_); |
- this->val_ = reinterpret_cast<T*>( |
- V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), p)); |
-} |
-#endif |
- |
- |
-template <class T> |
-T* Persistent<T>::ClearAndLeak() { |
+template <class T, class M> |
+T* Persistent<T, M>::ClearAndLeak() { |
T* old; |
-#ifdef V8_USE_UNSAFE_HANDLES |
- old = **this; |
- *this = Persistent<T>(); |
-#else |
old = val_; |
val_ = NULL; |
-#endif |
return old; |
} |
-template <class T> |
-void Persistent<T>::SetWrapperClassId(uint16_t class_id) { |
+template <class T, class M> |
+void Persistent<T, M>::SetWrapperClassId(uint16_t class_id) { |
typedef internal::Internals I; |
if (this->IsEmpty()) return; |
internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_); |
@@ -5801,8 +5721,8 @@ void Persistent<T>::SetWrapperClassId(uint16_t class_id) { |
} |
-template <class T> |
-uint16_t Persistent<T>::WrapperClassId() const { |
+template <class T, class M> |
+uint16_t Persistent<T, M>::WrapperClassId() const { |
typedef internal::Internals I; |
if (this->IsEmpty()) return 0; |
internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_); |