Index: gin/array_buffer.cc |
diff --git a/gin/array_buffer.cc b/gin/array_buffer.cc |
index e8236fc520511e0cc0e700b7260374fbefbddcaa..43dd8da348fa6a3a1125523339f7fd2a9c5ebfd3 100644 |
--- a/gin/array_buffer.cc |
+++ b/gin/array_buffer.cc |
@@ -32,7 +32,7 @@ ArrayBufferAllocator* ArrayBufferAllocator::SharedInstance() { |
return instance; |
} |
-// BufferView::Private -------------------------------------------------------- |
+// ArrayBuffer::Private ------------------------------------------------------- |
// This class exists to solve a tricky lifetime problem. The V8 API doesn't |
// want to expose a direct view into the memory behind an array buffer because |
@@ -42,18 +42,18 @@ ArrayBufferAllocator* ArrayBufferAllocator::SharedInstance() { |
// we're done with it and when V8 is done with it. |
// |
// To determine whether we're done with the memory, every view we have into |
-// the array buffer takes a reference to the BufferView::Private object that |
+// the array buffer takes a reference to the ArrayBuffer::Private object that |
// actually owns the memory. To determine when V8 is done with the memory, we |
// open a weak handle to the ArrayBuffer object. When we receive the weak |
// callback, we know the object is about to be garbage collected and we can |
// drop V8's implied reference to the memory. |
// |
-// The final subtlety is that we need every BufferView into the same array |
-// buffer to AddRef the same BufferView::Private. To make that work, we store a |
-// pointer to the BufferView::Private object in an internal field of the |
+// The final subtlety is that we need every ArrayBuffer into the same array |
+// buffer to AddRef the same ArrayBuffer::Private. To make that work, we store |
+// a pointer to the ArrayBuffer::Private object in an internal field of the |
// ArrayBuffer object. |
// |
-class BufferView::Private { |
+class ArrayBuffer::Private { |
public: |
static scoped_refptr<Private> From(v8::Isolate* isolate, |
v8::Handle<v8::ArrayBuffer> array); |
@@ -77,7 +77,7 @@ class BufferView::Private { |
size_t length_; |
}; |
-scoped_refptr<BufferView::Private> BufferView::Private::From( |
+scoped_refptr<ArrayBuffer::Private> ArrayBuffer::Private::From( |
v8::Isolate* isolate, v8::Handle<v8::ArrayBuffer> array) { |
if (array->IsExternal()) { |
return make_scoped_refptr(static_cast<Private*>( |
@@ -86,18 +86,18 @@ scoped_refptr<BufferView::Private> BufferView::Private::From( |
return make_scoped_refptr(new Private(isolate, array)); |
} |
-void BufferView::Private::AddRef() { |
+void ArrayBuffer::Private::AddRef() { |
++ref_count_; |
} |
-void BufferView::Private::Release() { |
+void ArrayBuffer::Private::Release() { |
if (--ref_count_) |
return; |
delete this; |
} |
-BufferView::Private::Private(v8::Isolate* isolate, |
- v8::Handle<v8::ArrayBuffer> array) |
+ArrayBuffer::Private::Private(v8::Isolate* isolate, |
+ v8::Handle<v8::ArrayBuffer> array) |
: ref_count_(0), |
array_buffer_(isolate, array) { |
// Take ownership of the array buffer. |
@@ -111,40 +111,73 @@ BufferView::Private::Private(v8::Isolate* isolate, |
array_buffer_.SetWeak(this, WeakCallback); |
} |
-BufferView::Private::~Private() { |
+ArrayBuffer::Private::~Private() { |
ArrayBufferAllocator::SharedInstance()->Free(buffer_, length_); |
} |
-void BufferView::Private::WeakCallback( |
+void ArrayBuffer::Private::WeakCallback( |
const v8::WeakCallbackData<v8::ArrayBuffer, Private>& data) { |
Private* parameter = data.GetParameter(); |
parameter->array_buffer_.Reset(); |
- parameter->Release(); // Balanced in BufferView::Private::Private. |
+ parameter->Release(); // Balanced in ArrayBuffer::Private::Private. |
} |
-// BufferView ----------------------------------------------------------------- |
+// ArrayBuffer ---------------------------------------------------------------- |
-BufferView::BufferView(v8::Isolate* isolate, |
- v8::Handle<v8::ArrayBufferView> view) { |
- Initialize(isolate, view->Buffer()); |
- uint8_t* ptr = static_cast<uint8_t*>(bytes_); |
- bytes_ = static_cast<void*>(ptr + view->ByteOffset()); |
- num_bytes_ = view->ByteLength(); |
+ArrayBuffer::ArrayBuffer(v8::Isolate* isolate) |
+ : isolate_(isolate), |
+ bytes_(0), |
+ num_bytes_(0) { |
} |
-BufferView::BufferView(v8::Isolate* isolate, |
- v8::Handle<v8::ArrayBuffer> array) { |
- Initialize(isolate, array); |
+ArrayBuffer::ArrayBuffer(v8::Isolate* isolate, |
+ v8::Handle<v8::ArrayBuffer> array) |
+ : isolate_(isolate) { |
+ private_ = ArrayBuffer::Private::From(isolate_, array); |
+ bytes_ = private_->buffer(); |
+ num_bytes_ = private_->length(); |
} |
-BufferView::~BufferView() { |
+ArrayBuffer::~ArrayBuffer() { |
} |
-void BufferView::Initialize(v8::Isolate* isolate, |
- v8::Handle<v8::ArrayBuffer> array) { |
- private_ = BufferView::Private::From(isolate, array); |
- bytes_ = private_->buffer(); |
- num_bytes_ = private_->length(); |
+// Converter<ArrayBuffer> ----------------------------------------------------- |
+ |
+bool Converter<ArrayBuffer>::FromV8(v8::Handle<v8::Value> val, |
+ ArrayBuffer* out) { |
+ if (!val->IsArrayBuffer()) |
+ return false; |
+ *out = ArrayBuffer(out->isolate(), v8::Handle<v8::ArrayBuffer>::Cast(val)); |
+ return true; |
+} |
+ |
+// ArrayBufferView ------------------------------------------------------------ |
+ |
+ArrayBufferView::ArrayBufferView(v8::Isolate* isolate) |
+ : array_buffer_(isolate), |
+ offset_(0), |
+ num_bytes_(0) { |
+} |
+ |
+ArrayBufferView::ArrayBufferView(v8::Isolate* isolate, |
+ v8::Handle<v8::ArrayBufferView> view) |
+ : array_buffer_(isolate, view->Buffer()), |
+ offset_(view->ByteOffset()), |
+ num_bytes_(view->ByteLength()) { |
+} |
+ |
+ArrayBufferView::~ArrayBufferView() { |
+} |
+ |
+// Converter<ArrayBufferView> ------------------------------------------------- |
+ |
+bool Converter<ArrayBufferView>::FromV8(v8::Handle<v8::Value> val, |
+ ArrayBufferView* out) { |
+ if (!val->IsArrayBufferView()) |
+ return false; |
+ *out = ArrayBufferView(out->isolate(), |
+ v8::Handle<v8::ArrayBufferView>::Cast(val)); |
+ return true; |
} |
} // namespace gin |