Chromium Code Reviews| Index: gin/array_buffer.cc |
| diff --git a/gin/array_buffer.cc b/gin/array_buffer.cc |
| index ee9f2a5867b21a970daec17881ba4411a2631762..019563fc320740c70968d636b6388ca905641a5e 100644 |
| --- a/gin/array_buffer.cc |
| +++ b/gin/array_buffer.cc |
| @@ -2,17 +2,23 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| -#include "gin/array_buffer.h" |
| - |
| #include <stdlib.h> |
| +#include "base/logging.h" |
| +#include "gin/array_buffer.h" |
| +#include "gin/per_isolate_data.h" |
| + |
| namespace gin { |
| +namespace { |
| + |
| +gin::WrapperInfo g_array_buffer_wrapper_info = {gin::kEmbedderNativeGin}; |
| + |
| +} // namespace |
| + |
| COMPILE_ASSERT(V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT == 2, |
| array_buffers_must_have_two_internal_fields); |
| -static const int kBufferViewPrivateIndex = 0; |
| - |
| // ArrayBufferAllocator ------------------------------------------------------- |
| void* ArrayBufferAllocator::Allocate(size_t length) { |
| @@ -72,6 +78,7 @@ class ArrayBuffer::Private : public base::RefCounted<ArrayBuffer::Private> { |
| v8::Persistent<v8::ArrayBuffer> array_buffer_; |
| scoped_refptr<Private> self_reference_; |
| + v8::Isolate* isolate_; |
| void* buffer_; |
| size_t length_; |
| }; |
| @@ -79,28 +86,34 @@ class ArrayBuffer::Private : public base::RefCounted<ArrayBuffer::Private> { |
| scoped_refptr<ArrayBuffer::Private> ArrayBuffer::Private::From( |
| v8::Isolate* isolate, v8::Handle<v8::ArrayBuffer> array) { |
| if (array->IsExternal()) { |
| + CHECK(WrapperInfo::From(v8::Handle<v8::Object>::Cast(array)) == |
| + &g_array_buffer_wrapper_info) |
| + << "Cannot mix blink and gin ArrayBuffers"; |
|
abarth-chromium
2014/02/19 18:59:57
CHECK_EQ ?
This kind of sucks, but it seems ok in
|
| return make_scoped_refptr(static_cast<Private*>( |
| - array->GetAlignedPointerFromInternalField(kBufferViewPrivateIndex))); |
| + array->GetAlignedPointerFromInternalField(kEncodedValueIndex))); |
| } |
| return make_scoped_refptr(new Private(isolate, array)); |
| } |
| ArrayBuffer::Private::Private(v8::Isolate* isolate, |
| v8::Handle<v8::ArrayBuffer> array) |
| - : array_buffer_(isolate, array) { |
| + : array_buffer_(isolate, array), isolate_(isolate) { |
| // Take ownership of the array buffer. |
| + CHECK(!array->IsExternal()); |
| v8::ArrayBuffer::Contents contents = array->Externalize(); |
| buffer_ = contents.Data(); |
| length_ = contents.ByteLength(); |
| - array->SetAlignedPointerInInternalField(kBufferViewPrivateIndex, this); |
| + array->SetAlignedPointerInInternalField(kWrapperInfoIndex, |
| + &g_array_buffer_wrapper_info); |
| + array->SetAlignedPointerInInternalField(kEncodedValueIndex, this); |
| self_reference_ = this; // Cleared in WeakCallback. |
| array_buffer_.SetWeak(this, WeakCallback); |
| } |
| ArrayBuffer::Private::~Private() { |
| - ArrayBufferAllocator::SharedInstance()->Free(buffer_, length_); |
| + PerIsolateData::From(isolate_)->allocator()->Free(buffer_, length_); |
| } |
| void ArrayBuffer::Private::WeakCallback( |