25 uint8_t* GetDataPointer(v8::Local<v8::ArrayBuffer> buffer) {
26 return reinterpret_cast<uint8_t*
>(buffer->GetContents().Data());
28 #elif defined(USING_JSC) 29 void FreeData(
void* data,
void*) {
42 : buffer_(
std::move(other.buffer_)),
45 own_ptr_(other.own_ptr_) {
56 buffer_ = std::move(other.buffer_);
59 own_ptr_ = other.own_ptr_;
73 ClearAndAllocateBuffer(other.
Size());
78 ClearAndAllocateBuffer(size);
79 std::memcpy(ptr_, buffer, size_);
87 if (value->IsArrayBuffer()) {
89 ptr_ = GetDataPointer(buffer);
90 size_ = buffer->ByteLength();
91 }
else if (value->IsArrayBufferView()) {
92 v8::Local<v8::ArrayBufferView> view = value.As<v8::ArrayBufferView>();
93 ptr_ = GetDataPointer(view->Buffer()) + view->ByteOffset();
94 size_ = view->ByteLength();
99 buffer_ = value.As<v8::Object>();
100 #elif defined(USING_JSC) 102 auto type = JSValueGetTypedArrayType(cx, value,
nullptr);
103 if (
type == kJSTypedArrayTypeNone)
106 LocalVar<JsObject>
object = UnsafeJsCast<JsObject>(value);
107 if (
type == kJSTypedArrayTypeArrayBuffer) {
108 ptr_ =
reinterpret_cast<uint8_t*
>(
109 JSObjectGetArrayBufferBytesPtr(cx,
object,
nullptr));
110 size_ = JSObjectGetArrayBufferByteLength(cx,
object,
nullptr);
112 ptr_ =
reinterpret_cast<uint8_t*
>(
113 JSObjectGetTypedArrayBytesPtr(cx,
object,
nullptr)) +
114 JSObjectGetTypedArrayByteOffset(cx,
object,
nullptr);
115 size_ = JSObjectGetTypedArrayByteLength(cx,
object,
nullptr);
124 if (buffer_.
empty()) {
125 DCHECK(own_ptr_ || (!ptr_ && size_ == 0));
126 #if defined(USING_V8) 127 buffer_ = v8::ArrayBuffer::New(
GetIsolate(), ptr_, size_,
128 v8::ArrayBufferCreationMode::kInternalized);
129 #elif defined(USING_JSC) 130 buffer_ = Handle<JsObject>(JSObjectMakeArrayBufferWithBytesNoCopy(
131 GetContext(), ptr_, size_, &FreeData,
nullptr,
nullptr));
133 CHECK(!buffer_.
empty());
136 return buffer_.
value();
142 DCHECK(!buffer_.
empty());
144 #if defined(USING_V8) 145 LocalVar<JsObject> local_buffer = buffer_.
handle();
146 LocalVar<v8::ArrayBuffer> array_buffer;
148 if (local_buffer->IsArrayBuffer()) {
151 DCHECK(array_buffer->IsArrayBufferView());
152 LocalVar<v8::ArrayBufferView> view = local_buffer.As<v8::ArrayBufferView>();
153 array_buffer = view->Buffer();
154 start = view->ByteOffset();
161 return v8::DataView::New(array_buffer, start, size_);
163 return v8::Int8Array::New(array_buffer, start, size_);
165 return v8::Uint8Array::New(array_buffer, start, size_);
167 return v8::Uint8ClampedArray::New(array_buffer, start, size_);
169 return v8::Int16Array::New(array_buffer, start, size_ / 2);
171 return v8::Uint16Array::New(array_buffer, start, size_ / 2);
173 return v8::Int32Array::New(array_buffer, start, size_ / 4);
175 return v8::Uint32Array::New(array_buffer, start, size_ / 4);
177 return v8::Float32Array::New(array_buffer, start, size_ / 4);
179 return v8::Float64Array::New(array_buffer, start, size_ / 8);
181 LOG(FATAL) <<
"Invalid enum value " << kind;
183 #elif defined(USING_JSC) 185 LocalVar<JsObject> array_buffer = buffer_.
handle();
187 auto buffer_type = JSValueGetTypedArrayType(cx, array_buffer,
nullptr);
188 DCHECK_NE(buffer_type, kJSTypedArrayTypeNone);
189 if (buffer_type != kJSTypedArrayTypeArrayBuffer) {
190 array_buffer = JSObjectGetTypedArrayBuffer(cx, buffer_.
handle(),
nullptr);
191 start = JSObjectGetTypedArrayByteOffset(cx, buffer_.
handle(),
nullptr);
194 JSTypedArrayType jsc_kind;
195 size_t elem_size = 1;
200 jsc_kind = kJSTypedArrayTypeInt8Array;
203 jsc_kind = kJSTypedArrayTypeUint8Array;
206 jsc_kind = kJSTypedArrayTypeUint8ClampedArray;
209 jsc_kind = kJSTypedArrayTypeInt16Array;
213 jsc_kind = kJSTypedArrayTypeUint16Array;
217 jsc_kind = kJSTypedArrayTypeInt32Array;
221 jsc_kind = kJSTypedArrayTypeUint32Array;
225 jsc_kind = kJSTypedArrayTypeFloat32Array;
229 jsc_kind = kJSTypedArrayTypeFloat64Array;
233 LOG(FATAL) <<
"Invalid enum value " << kind;
235 return JSObjectMakeTypedArrayWithArrayBufferAndOffset(
236 cx, jsc_kind, array_buffer, start, size_ / elem_size,
nullptr);
241 tracer->
Trace(&buffer_);
244 void ByteBuffer::ClearFields() {
251 void ByteBuffer::ClearAndAllocateBuffer(
size_t size) {
258 ptr_ =
reinterpret_cast<uint8_t*
>(std::malloc(size_));
void SetFromDynamicBuffer(const util::DynamicBuffer &other)
ReturnVal< JsValue > ToJsValue() const override
const uint8_t * data() const
void CopyDataTo(uint8_t *dest, size_t size) const
ReturnVal< JsValue > value() const
void Trace(const Traceable *ptr)
ByteBuffer & operator=(const ByteBuffer &other)=delete
void SetFromBuffer(const void *buffer, size_t size)
void Trace(memory::HeapTracer *tracer) const override
JSContextRef GetContext()
Handle< T > handle() const
v8::Isolate * GetIsolate()
bool TryConvert(Handle< JsValue > value) override