diff --git a/gin/array_buffer.cc b/gin/array_buffer.cc index d592b276eaf549..dba7763ad551e4 100644 --- a/gin/array_buffer.cc +++ b/gin/array_buffer.cc @@ -73,10 +73,10 @@ class ArrayBuffer::Private : public base::RefCounted { Private(v8::Isolate* isolate, v8::Handle array); ~Private(); - static void WeakCallback( - const v8::WeakCallbackData& data); + static void FirstWeakCallback(const v8::WeakCallbackInfo& data); + static void SecondWeakCallback(const v8::WeakCallbackInfo& data); - v8::Persistent array_buffer_; + v8::Global array_buffer_; scoped_refptr self_reference_; v8::Isolate* isolate_; void* buffer_; @@ -108,18 +108,25 @@ ArrayBuffer::Private::Private(v8::Isolate* isolate, &g_array_buffer_wrapper_info); array->SetAlignedPointerInInternalField(kEncodedValueIndex, this); - self_reference_ = this; // Cleared in WeakCallback. - array_buffer_.SetWeak(this, WeakCallback); + self_reference_ = this; // Cleared in SecondWeakCallback. + array_buffer_.SetWeak(this, FirstWeakCallback, + v8::WeakCallbackType::kParameter); } ArrayBuffer::Private::~Private() { PerIsolateData::From(isolate_)->allocator()->Free(buffer_, length_); } -void ArrayBuffer::Private::WeakCallback( - const v8::WeakCallbackData& data) { +void ArrayBuffer::Private::FirstWeakCallback( + const v8::WeakCallbackInfo& data) { Private* parameter = data.GetParameter(); parameter->array_buffer_.Reset(); + data.SetSecondPassCallback(SecondWeakCallback); +} + +void ArrayBuffer::Private::SecondWeakCallback( + const v8::WeakCallbackInfo& data) { + Private* parameter = data.GetParameter(); parameter->self_reference_ = NULL; } diff --git a/gin/function_template.cc b/gin/function_template.cc index f76a05bea6ba32..7b85170ad5e225 100644 --- a/gin/function_template.cc +++ b/gin/function_template.cc @@ -10,7 +10,8 @@ namespace internal { CallbackHolderBase::CallbackHolderBase(v8::Isolate* isolate) : v8_ref_(isolate, v8::External::New(isolate, this)) { - v8_ref_.SetWeak(this, &CallbackHolderBase::WeakCallback); + v8_ref_.SetWeak(this, &CallbackHolderBase::FirstWeakCallback, + v8::WeakCallbackType::kParameter); } CallbackHolderBase::~CallbackHolderBase() { @@ -22,9 +23,15 @@ v8::Handle CallbackHolderBase::GetHandle(v8::Isolate* isolate) { } // static -void CallbackHolderBase::WeakCallback( - const v8::WeakCallbackData& data) { +void CallbackHolderBase::FirstWeakCallback( + const v8::WeakCallbackInfo& data) { data.GetParameter()->v8_ref_.Reset(); + data.SetSecondPassCallback(SecondWeakCallback); +} + +// static +void CallbackHolderBase::SecondWeakCallback( + const v8::WeakCallbackInfo& data) { delete data.GetParameter(); } diff --git a/gin/function_template.h b/gin/function_template.h index a2e1755ddaea95..1c8e2bef6bb468 100644 --- a/gin/function_template.h +++ b/gin/function_template.h @@ -51,10 +51,12 @@ class GIN_EXPORT CallbackHolderBase { virtual ~CallbackHolderBase(); private: - static void WeakCallback( - const v8::WeakCallbackData& data); + static void FirstWeakCallback( + const v8::WeakCallbackInfo& data); + static void SecondWeakCallback( + const v8::WeakCallbackInfo& data); - v8::Persistent v8_ref_; + v8::Global v8_ref_; DISALLOW_COPY_AND_ASSIGN(CallbackHolderBase); }; diff --git a/gin/wrappable.cc b/gin/wrappable.cc index a330fefc8e89bb..4137609cf91756 100644 --- a/gin/wrappable.cc +++ b/gin/wrappable.cc @@ -22,10 +22,16 @@ ObjectTemplateBuilder WrappableBase::GetObjectTemplateBuilder( return ObjectTemplateBuilder(isolate); } -void WrappableBase::WeakCallback( - const v8::WeakCallbackData& data) { +void WrappableBase::FirstWeakCallback( + const v8::WeakCallbackInfo& data) { WrappableBase* wrappable = data.GetParameter(); wrappable->wrapper_.Reset(); + data.SetSecondPassCallback(SecondWeakCallback); +} + +void WrappableBase::SecondWeakCallback( + const v8::WeakCallbackInfo& data) { + WrappableBase* wrappable = data.GetParameter(); delete wrappable; } @@ -55,7 +61,7 @@ v8::Handle WrappableBase::GetWrapperImpl(v8::Isolate* isolate, wrapper->SetAlignedPointerInInternalField(kWrapperInfoIndex, info); wrapper->SetAlignedPointerInInternalField(kEncodedValueIndex, this); wrapper_.Reset(isolate, wrapper); - wrapper_.SetWeak(this, WeakCallback); + wrapper_.SetWeak(this, FirstWeakCallback, v8::WeakCallbackType::kParameter); return wrapper; } diff --git a/gin/wrappable.h b/gin/wrappable.h index ff52b19a06f57c..ea4edcfffcc864 100644 --- a/gin/wrappable.h +++ b/gin/wrappable.h @@ -68,10 +68,12 @@ class GIN_EXPORT WrappableBase { WrapperInfo* wrapper_info); private: - static void WeakCallback( - const v8::WeakCallbackData& data); + static void FirstWeakCallback( + const v8::WeakCallbackInfo& data); + static void SecondWeakCallback( + const v8::WeakCallbackInfo& data); - v8::Persistent wrapper_; // Weak + v8::Global wrapper_; // Weak DISALLOW_COPY_AND_ASSIGN(WrappableBase); };