diff options
-rw-r--r-- | src/bun.js/bindings/bindings.cpp | 141 |
1 files changed, 128 insertions, 13 deletions
diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp index a7a8e8327..10f31821c 100644 --- a/src/bun.js/bindings/bindings.cpp +++ b/src/bun.js/bindings/bindings.cpp @@ -951,30 +951,145 @@ bool JSC__JSValue__asArrayBuffer_(JSC__JSValue JSValue0, JSC__JSGlobalObject* ar JSC::VM& vm = arg1->vm(); JSC::JSValue value = JSC::JSValue::decode(JSValue0); - if (!value.isObject()) { + if (UNLIKELY(!value) || !value.isCell()) { return false; } - JSC::JSObject* object = value.getObject(); - - if (JSC::JSArrayBufferView* typedArray = JSC::jsDynamicCast<JSC::JSArrayBufferView*>(object)) { - arg2->ptr = reinterpret_cast<char*>(typedArray->vector()); + switch (value.asCell()->type()) { + case JSC::JSType::Uint8ArrayType: { + JSC::JSUint8Array* typedArray = JSC::jsCast<JSC::JSUint8Array*>(value); arg2->len = typedArray->length(); arg2->byte_len = typedArray->byteLength(); arg2->offset = typedArray->byteOffset(); - arg2->cell_type = typedArray->type(); + arg2->cell_type = JSC::JSType::Uint8ArrayType; + arg2->ptr = (char*)typedArray->vector(); return true; } - - if (JSC::ArrayBuffer* buffer = JSC::toPossiblySharedArrayBuffer(vm, value)) { - buffer->pinAndLock(); - arg2->ptr = reinterpret_cast<char*>(buffer->data()); - arg2->len = buffer->byteLength(); - arg2->byte_len = buffer->byteLength(); + case JSC::JSType::ArrayBufferType: { + JSC::ArrayBuffer* typedArray = JSC::jsCast<JSC::JSArrayBuffer*>(value)->impl(); + arg2->len = typedArray->byteLength(); + arg2->byte_len = typedArray->byteLength(); arg2->offset = 0; - arg2->cell_type = 40; + arg2->cell_type = JSC::JSType::ArrayBufferType; + arg2->ptr = (char*)typedArray->data(); + return true; + } + case JSC::JSType::Int8ArrayType: { + JSC::JSInt8Array* typedArray = JSC::jsCast<JSC::JSInt8Array*>(value); + arg2->len = typedArray->length(); + arg2->byte_len = typedArray->byteLength(); + arg2->offset = typedArray->byteOffset(); + arg2->cell_type = JSC::JSType::Int8ArrayType; + arg2->ptr = (char*)typedArray->vector(); + return true; + } + + case JSC::JSType::Uint8ClampedArrayType: { + JSC::JSUint8ClampedArray* typedArray = JSC::jsCast<JSC::JSUint8ClampedArray*>(value); + arg2->len = typedArray->length(); + arg2->byte_len = typedArray->byteLength(); + arg2->offset = typedArray->byteOffset(); + arg2->cell_type = JSC::JSType::Uint8ClampedArrayType; + arg2->ptr = (char*)typedArray->vector(); + return true; + } + case JSC::JSType::Int16ArrayType: { + JSC::JSInt16Array* typedArray = JSC::jsCast<JSC::JSInt16Array*>(value); + arg2->len = typedArray->length(); + arg2->byte_len = typedArray->byteLength(); + arg2->offset = typedArray->byteOffset(); + arg2->cell_type = JSC::JSType::Int16ArrayType; + arg2->ptr = (char*)typedArray->vector(); return true; } + case JSC::JSType::Uint16ArrayType: { + JSC::JSUint16Array* typedArray = JSC::jsCast<JSC::JSUint16Array*>(value); + arg2->len = typedArray->length(); + arg2->byte_len = typedArray->byteLength(); + arg2->offset = typedArray->byteOffset(); + arg2->cell_type = JSC::JSType::Uint16ArrayType; + arg2->ptr = (char*)typedArray->vector(); + return true; + } + case JSC::JSType::Int32ArrayType: { + JSC::JSInt32Array* typedArray = JSC::jsCast<JSC::JSInt32Array*>(value); + arg2->len = typedArray->length(); + arg2->byte_len = typedArray->byteLength(); + arg2->offset = typedArray->byteOffset(); + arg2->cell_type = JSC::JSType::Int32ArrayType; + arg2->ptr = (char*)typedArray->vector(); + return true; + } + case JSC::JSType::Uint32ArrayType: { + JSC::JSUint32Array* typedArray = JSC::jsCast<JSC::JSUint32Array*>(value); + arg2->len = typedArray->length(); + arg2->byte_len = typedArray->byteLength(); + arg2->offset = typedArray->byteOffset(); + arg2->cell_type = JSC::JSType::Uint32ArrayType; + arg2->ptr = (char*)typedArray->vector(); + return true; + } + case JSC::JSType::Float32ArrayType: { + JSC::JSFloat32Array* typedArray = JSC::jsCast<JSC::JSFloat32Array*>(value); + arg2->len = typedArray->length(); + arg2->byte_len = typedArray->byteLength(); + arg2->offset = typedArray->byteOffset(); + arg2->cell_type = JSC::JSType::Float32ArrayType; + arg2->ptr = (char*)typedArray->vector(); + return true; + } + case JSC::JSType::Float64ArrayType: { + JSC::JSFloat64Array* typedArray = JSC::jsCast<JSC::JSFloat64Array*>(value); + arg2->len = typedArray->length(); + arg2->byte_len = typedArray->byteLength(); + arg2->offset = typedArray->byteOffset(); + arg2->cell_type = JSC::JSType::Float64ArrayType; + arg2->ptr = (char*)typedArray->vector(); + return true; + } + case JSC::JSType::BigInt64ArrayType: { + JSC::JSBigInt64Array* typedArray = JSC::jsCast<JSC::JSBigInt64Array*>(value); + arg2->len = typedArray->length(); + arg2->byte_len = typedArray->byteLength(); + arg2->offset = typedArray->byteOffset(); + arg2->cell_type = JSC::JSType::BigInt64ArrayType; + arg2->ptr = (char*)typedArray->vector(); + return true; + } + case JSC::JSType::BigUint64ArrayType: { + JSC::JSBigUint64Array* typedArray = JSC::jsCast<JSC::JSBigUint64Array*>(value); + arg2->len = typedArray->length(); + arg2->byte_len = typedArray->byteLength(); + arg2->offset = typedArray->byteOffset(); + arg2->cell_type = JSC::JSType::BigUint64ArrayType; + arg2->ptr = (char*)typedArray->vector(); + return true; + } + case JSC::JSType::ObjectType: + case JSC::JSType::FinalObjectType: { + if (JSC::JSArrayBufferView* view = JSC::jsDynamicCast<JSC::JSArrayBufferView*>(value)) { + arg2->len = view->length(); + arg2->byte_len = view->byteLength(); + arg2->offset = view->byteOffset(); + arg2->cell_type = view->type(); + arg2->ptr = (char*)view->vector(); + return true; + } + + if (JSC::JSArrayBuffer* jsBuffer = JSC::jsDynamicCast<JSC::JSArrayBuffer*>(value)) { + JSC::ArrayBuffer* buffer = jsBuffer->impl(); + if (!buffer) + return false; + arg2->len = buffer->byteLength(); + arg2->byte_len = buffer->byteLength(); + arg2->offset = 0; + arg2->cell_type = JSC::JSType::ArrayBufferType; + arg2->ptr = (char*)buffer->data(); + return true; + } + break; + } + } return false; } |