aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-07-04 16:34:42 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-07-04 16:34:42 -0700
commita6d4283986c27bb20ac2a23e827f09ba415e814a (patch)
tree0dc6bef85b6956ce3e82ec06708414bddd14a776 /src
parentabd9d8bcab2eb3bb33c0f1df73e71ecf188ef8f1 (diff)
downloadbun-a6d4283986c27bb20ac2a23e827f09ba415e814a.tar.gz
bun-a6d4283986c27bb20ac2a23e827f09ba415e814a.tar.zst
bun-a6d4283986c27bb20ac2a23e827f09ba415e814a.zip
[jsc] Attempt to make detecting ArrayBuffer/Uint8Array faster
Diffstat (limited to 'src')
-rw-r--r--src/bun.js/bindings/bindings.cpp141
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;
}