Index: gin/array_buffer.cc |
diff --git a/gin/array_buffer.cc b/gin/array_buffer.cc |
index 43dd8da348fa6a3a1125523339f7fd2a9c5ebfd3..9f93bf94514656e896c8e853d8871d49d5fb6c81 100644 |
--- a/gin/array_buffer.cc |
+++ b/gin/array_buffer.cc |
@@ -53,26 +53,25 @@ ArrayBufferAllocator* ArrayBufferAllocator::SharedInstance() { |
// a pointer to the ArrayBuffer::Private object in an internal field of the |
// ArrayBuffer object. |
// |
-class ArrayBuffer::Private { |
+class ArrayBuffer::Private : public base::RefCounted<ArrayBuffer::Private> { |
public: |
static scoped_refptr<Private> From(v8::Isolate* isolate, |
v8::Handle<v8::ArrayBuffer> array); |
- void AddRef(); |
- void Release(); |
- |
void* buffer() const { return buffer_; } |
size_t length() const { return length_; } |
private: |
+ friend class base::RefCounted<Private>; |
+ |
Private(v8::Isolate* isolate, v8::Handle<v8::ArrayBuffer> array); |
~Private(); |
static void WeakCallback( |
const v8::WeakCallbackData<v8::ArrayBuffer, Private>& data); |
- size_t ref_count_; |
v8::Persistent<v8::ArrayBuffer> array_buffer_; |
+ scoped_refptr<Private> self_reference_; |
void* buffer_; |
size_t length_; |
}; |
@@ -86,20 +85,9 @@ scoped_refptr<ArrayBuffer::Private> ArrayBuffer::Private::From( |
return make_scoped_refptr(new Private(isolate, array)); |
} |
-void ArrayBuffer::Private::AddRef() { |
- ++ref_count_; |
-} |
- |
-void ArrayBuffer::Private::Release() { |
- if (--ref_count_) |
- return; |
- delete this; |
-} |
- |
ArrayBuffer::Private::Private(v8::Isolate* isolate, |
v8::Handle<v8::ArrayBuffer> array) |
- : ref_count_(0), |
- array_buffer_(isolate, array) { |
+ : array_buffer_(isolate, array) { |
// Take ownership of the array buffer. |
v8::ArrayBuffer::Contents contents = array->Externalize(); |
buffer_ = contents.Data(); |
@@ -107,7 +95,7 @@ ArrayBuffer::Private::Private(v8::Isolate* isolate, |
array->SetAlignedPointerInInternalField(kBufferViewPrivateIndex, this); |
- AddRef(); // Balanced in WeakCallback. |
+ self_reference_ = this; // Cleared in WeakCallback. |
array_buffer_.SetWeak(this, WeakCallback); |
} |
@@ -119,7 +107,7 @@ void ArrayBuffer::Private::WeakCallback( |
const v8::WeakCallbackData<v8::ArrayBuffer, Private>& data) { |
Private* parameter = data.GetParameter(); |
parameter->array_buffer_.Reset(); |
- parameter->Release(); // Balanced in ArrayBuffer::Private::Private. |
+ // parameter->self_reference_.clear(); |
} |
// ArrayBuffer ---------------------------------------------------------------- |