v8::Local<v8::Object> DOMTypedArray<WTFTypedArray, V8TypedArray>::wrap(v8::Isolate* isolate, v8::Local<v8::Object> creationContext) { // It's possible that no one except for the new wrapper owns this object at // this moment, so we have to prevent GC to collect this object until the // object gets associated with the wrapper. RefPtr<ThisType> protect(this); ASSERT(!DOMDataStore::containsWrapper(this, isolate)); const WrapperTypeInfo* wrapperTypeInfo = this->wrapperTypeInfo(); RefPtr<DOMArrayBufferBase> buffer = this->bufferBase(); v8::Local<v8::Value> v8Buffer = toV8(buffer.get(), creationContext, isolate); if (v8Buffer.IsEmpty()) return v8::Local<v8::Object>(); ASSERT(isShared() == v8Buffer->IsSharedArrayBuffer()); v8::Local<v8::Object> wrapper; if (isShared()) { wrapper = V8TypedArray::New(v8Buffer.As<v8::SharedArrayBuffer>(), byteOffset(), length()); } else { wrapper = V8TypedArray::New(v8Buffer.As<v8::ArrayBuffer>(), byteOffset(), length()); } return associateWithWrapper(isolate, wrapperTypeInfo, wrapper); }
v8::Handle<v8::Object> DOMArrayBuffer::wrap(v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) { // It's possible that no one except for the new wrapper owns this object at // this moment, so we have to prevent GC to collect this object until the // object gets associated with the wrapper. RefPtr<DOMArrayBuffer> protect(this); ASSERT(!DOMDataStore::containsWrapper(this, isolate)); v8::EscapableHandleScope handleScope(isolate); v8::Handle<v8::Context> context = isolate->GetCurrentContext(); if (context == node::g_context) { context = nodeToDOMContext(context); } v8::Context::Scope context_scope(context); const WrapperTypeInfo* wrapperTypeInfo = this->wrapperTypeInfo(); v8::Local<v8::Object> wrapper = v8::ArrayBuffer::New(isolate, data(), byteLength()); // Only when we create a new wrapper, let V8 know that we allocated and // associated a new memory block with the wrapper. Note that // setDeallocationObserver implicitly calls // DOMArrayBufferDeallocationObserver::blinkAllocatedMemory. buffer()->setDeallocationObserver(DOMArrayBufferDeallocationObserver::instance()); // FIXME: escape associateWithWrapper(isolate, wrapperTypeInfo, wrapper); return handleScope.Escape(wrapper); }
v8::Handle<v8::Object> DOMArrayBuffer::wrap(v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) { // It's possible that no one except for the new wrapper owns this object at // this moment, so we have to prevent GC to collect this object until the // object gets associated with the wrapper. RefPtr<DOMArrayBuffer> protect(this); ASSERT(!DOMDataStore::containsWrapperNonTemplate(this, isolate)); const WrapperTypeInfo* wrapperTypeInfo = this->wrapperTypeInfo(); v8::Handle<v8::Object> wrapper = v8::ArrayBuffer::New(isolate, data(), byteLength()); // Only when we create a new wrapper, let V8 know that we allocated and // associated a new memory block with the wrapper. Note that // setDeallocationObserver implicitly calls // DOMArrayBufferDeallocationObserver::blinkAllocatedMemory. buffer()->setDeallocationObserver(DOMArrayBufferDeallocationObserver::instance()); return associateWithWrapper(wrapperTypeInfo, wrapper, isolate); }