Add JS_GetTypedArray()

This commit is contained in:
Dmitry Volyntsev 2024-05-08 14:38:34 -07:00
parent 97be5a32af
commit 2df2bcf908
2 changed files with 58 additions and 0 deletions

View File

@ -53439,6 +53439,32 @@ JSValue JS_NewTypedArray(JSContext *ctx, int argc, JSValueConst *argv,
JS_CLASS_UINT8C_ARRAY + type); 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 /* 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, it is not a typed array or if the buffer is detached. pbyte_offset,
pbyte_length or pbytes_per_element can be NULL. */ pbyte_length or pbytes_per_element can be NULL. */

View File

@ -845,8 +845,40 @@ typedef enum JSTypedArrayEnum {
JS_TYPED_ARRAY_FLOAT64, JS_TYPED_ARRAY_FLOAT64,
} JSTypedArrayEnum; } 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, JSValue JS_NewTypedArray(JSContext *ctx, int argc, JSValueConst *argv,
JSTypedArrayEnum array_type); 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, JSValue JS_GetTypedArrayBuffer(JSContext *ctx, JSValueConst obj,
size_t *pbyte_offset, size_t *pbyte_offset,
size_t *pbyte_length, size_t *pbyte_length,