From 2df2bcf9082c4e020eac0095c354444382c3107c Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Wed, 8 May 2024 14:38:34 -0700 Subject: [PATCH] Add `JS_GetTypedArray()` --- quickjs.c | 26 ++++++++++++++++++++++++++ quickjs.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/quickjs.c b/quickjs.c index f000ff7..bf5989d 100644 --- a/quickjs.c +++ b/quickjs.c @@ -53439,6 +53439,32 @@ JSValue JS_NewTypedArray(JSContext *ctx, int argc, JSValueConst *argv, JS_CLASS_UINT8C_ARRAY + type); } +/* Return value is -1 for proxy errors, 0 if `obj` is not a typed array, + 1 if it is a typed array. + The structure pointed to by `desc` is filled on success unless `desc` + is a null pointer. */ +int JS_GetTypedArray(JSContext *ctx, JSValueConst obj, + JSTypedArrayDescriptor *desc) +{ + int class_id; + JSObject *p; + + if (js_resolve_proxy(ctx, &obj, TRUE)) + return -1; + if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) + return 0; + p = JS_VALUE_GET_OBJ(obj); + class_id = p->class_id; + if (class_id < JS_CLASS_UINT8C_ARRAY || class_id > JS_CLASS_FLOAT64_ARRAY) + return 0; + if (desc) { + desc->type = JS_TYPED_ARRAY_UINT8C + (class_id - JS_CLASS_UINT8C_ARRAY); + desc->length = p->u.typed_array->length; + desc->data = p->u.array.u.ptr; + } + return 1; +} + /* Return the buffer associated to the typed array or an exception if it is not a typed array or if the buffer is detached. pbyte_offset, pbyte_length or pbytes_per_element can be NULL. */ diff --git a/quickjs.h b/quickjs.h index edc7b47..84a7e0b 100644 --- a/quickjs.h +++ b/quickjs.h @@ -845,8 +845,40 @@ typedef enum JSTypedArrayEnum { JS_TYPED_ARRAY_FLOAT64, } JSTypedArrayEnum; +static inline int JS_BytesPerElement(JSTypedArrayEnum type) +{ + switch (type) { + case JS_TYPED_ARRAY_UINT8C: + case JS_TYPED_ARRAY_INT8: + case JS_TYPED_ARRAY_UINT8: + return 1; + case JS_TYPED_ARRAY_INT16: + case JS_TYPED_ARRAY_UINT16: + return 2; + case JS_TYPED_ARRAY_INT32: + case JS_TYPED_ARRAY_UINT32: + case JS_TYPED_ARRAY_FLOAT32: + return 4; + default: + return 8; + } +} + JSValue JS_NewTypedArray(JSContext *ctx, int argc, JSValueConst *argv, JSTypedArrayEnum array_type); + +typedef struct JSTypedArrayDescriptor { + JSTypedArrayEnum type; + size_t length; + void *data; +} JSTypedArrayDescriptor; + +/* Return value is -1 for proxy errors, 0 if `obj` is not a typed array, + 1 if it is a typed array. + The structure pointed to by `desc` is filled on success unless `desc` + is a null pointer. */ +int JS_GetTypedArray(JSContext *ctx, JSValueConst obj, + JSTypedArrayDescriptor *desc); JSValue JS_GetTypedArrayBuffer(JSContext *ctx, JSValueConst obj, size_t *pbyte_offset, size_t *pbyte_length,