1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "core/dom/DOMArrayBuffer.h"
8 #include "bindings/core/v8/DOMDataStore.h"
9 #include "bindings/core/v8/V8DOMWrapper.h"
10 #include "core/dom/DOMArrayBufferDeallocationObserver.h"
14 v8::Handle<v8::Object> DOMArrayBuffer::wrap(v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
16 // It's possible that no one except for the new wrapper owns this object at
17 // this moment, so we have to prevent GC to collect this object until the
18 // object gets associated with the wrapper.
19 RefPtr<DOMArrayBuffer> protect(this);
21 ASSERT(!DOMDataStore::containsWrapper(this, isolate));
23 const WrapperTypeInfo* wrapperTypeInfo = this->wrapperTypeInfo();
24 v8::Handle<v8::Object> wrapper = v8::ArrayBuffer::New(isolate, data(), byteLength());
26 // Only when we create a new wrapper, let V8 know that we allocated and
27 // associated a new memory block with the wrapper. Note that
28 // setDeallocationObserver implicitly calls
29 // DOMArrayBufferDeallocationObserver::blinkAllocatedMemory.
30 buffer()->setDeallocationObserver(DOMArrayBufferDeallocationObserver::instance());
32 return associateWithWrapper(wrapperTypeInfo, wrapper, isolate);
35 v8::Handle<v8::Object> DOMArrayBuffer::associateWithWrapper(const WrapperTypeInfo* wrapperTypeInfo, v8::Handle<v8::Object> wrapper, v8::Isolate* isolate)
37 // This function does not set a deallocation observer to the underlying
38 // array buffer. It's a caller's duty.
40 return V8DOMWrapper::associateObjectWithWrapper(isolate, this, wrapperTypeInfo, wrapper);