| Index: include/v8.h
|
| diff --git a/include/v8.h b/include/v8.h
|
| index 8df90d2887cffb3d87fecc38446aeb68c33bf63e..37e0ddc34d870acf1a45a87f0a4c76e6c95df198 100644
|
| --- a/include/v8.h
|
| +++ b/include/v8.h
|
| @@ -516,6 +516,18 @@ template <class T> class PersistentBase {
|
| P* parameter,
|
| typename WeakCallbackData<S, P>::Callback callback);
|
|
|
| + // Phantom persistents work like weak persistents, except that the pointer to
|
| + // the object being collected is not available in the finalization callback.
|
| + // This enables the garbage collector to collect the object and any objects
|
| + // it references transitively in one GC cycle.
|
| + template <typename P>
|
| + V8_INLINE void SetPhantom(P* parameter,
|
| + typename WeakCallbackData<T, P>::Callback callback);
|
| +
|
| + template <typename S, typename P>
|
| + V8_INLINE void SetPhantom(P* parameter,
|
| + typename WeakCallbackData<S, P>::Callback callback);
|
| +
|
| template<typename P>
|
| V8_INLINE P* ClearWeak();
|
|
|
| @@ -5477,14 +5489,15 @@ class V8_EXPORT V8 {
|
| private:
|
| V8();
|
|
|
| + enum WeakHandleType { PhantomHandle, NonphantomHandle };
|
| +
|
| 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 WeakCallbackData<Value, void>::Callback WeakCallback;
|
| - static void MakeWeak(internal::Object** global_handle,
|
| - void* data,
|
| - WeakCallback weak_callback);
|
| + static void MakeWeak(internal::Object** global_handle, void* data,
|
| + WeakCallback weak_callback, WeakHandleType phantom);
|
| static void* ClearWeak(internal::Object** global_handle);
|
| static void Eternalize(Isolate* isolate,
|
| Value* handle,
|
| @@ -6355,9 +6368,8 @@ void PersistentBase<T>::SetWeak(
|
| typename WeakCallbackData<S, P>::Callback callback) {
|
| TYPE_CHECK(S, T);
|
| typedef typename WeakCallbackData<Value, void>::Callback Callback;
|
| - V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_),
|
| - parameter,
|
| - reinterpret_cast<Callback>(callback));
|
| + V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_), parameter,
|
| + reinterpret_cast<Callback>(callback), V8::NonphantomHandle);
|
| }
|
|
|
|
|
| @@ -6371,7 +6383,26 @@ void PersistentBase<T>::SetWeak(
|
|
|
|
|
| template <class T>
|
| -template<typename P>
|
| +template <typename S, typename P>
|
| +void PersistentBase<T>::SetPhantom(
|
| + P* parameter, typename WeakCallbackData<S, P>::Callback callback) {
|
| + TYPE_CHECK(S, T);
|
| + typedef typename WeakCallbackData<Value, void>::Callback Callback;
|
| + V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_), parameter,
|
| + reinterpret_cast<Callback>(callback), V8::PhantomHandle);
|
| +}
|
| +
|
| +
|
| +template <class T>
|
| +template <typename P>
|
| +void PersistentBase<T>::SetPhantom(
|
| + P* parameter, typename WeakCallbackData<T, P>::Callback callback) {
|
| + SetPhantom<T, P>(parameter, callback);
|
| +}
|
| +
|
| +
|
| +template <class T>
|
| +template <typename P>
|
| P* PersistentBase<T>::ClearWeak() {
|
| return reinterpret_cast<P*>(
|
| V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_)));
|
|
|