From 9c2a19eaac5d1a2b79e924f480fd0a4f3500b525 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Thu, 9 May 2024 13:13:45 -0700 Subject: [PATCH] Update `JS_NewTypedArray()` to C level API --- quickjs.c | 18 +++++++++++++++--- quickjs.h | 4 ++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/quickjs.c b/quickjs.c index f000ff7..3017ec6 100644 --- a/quickjs.c +++ b/quickjs.c @@ -53429,14 +53429,26 @@ static JSValue js_typed_array_get_byteOffset(JSContext *ctx, return JS_NewInt32(ctx, ta->offset); } -JSValue JS_NewTypedArray(JSContext *ctx, int argc, JSValueConst *argv, +JSValue JS_NewTypedArray(JSContext *ctx, size_t length, const void *init, JSTypedArrayEnum type) { + JSValue args[1], ret; + if (type < JS_TYPED_ARRAY_UINT8C || type > JS_TYPED_ARRAY_FLOAT64) return JS_ThrowRangeError(ctx, "invalid typed array type"); - return js_typed_array_constructor(ctx, JS_UNDEFINED, argc, argv, - JS_CLASS_UINT8C_ARRAY + type); + args[0] = JS_NewInt64(ctx, length); + ret = js_typed_array_constructor(ctx, JS_UNDEFINED, 1, (JSValueConst *)args, + JS_CLASS_UINT8C_ARRAY + type); + JS_FreeValue(ctx, args[0]); + + if (init != NULL && !JS_IsException(ret)) { + JSObject *p = JS_VALUE_GET_OBJ(ret); + size_t len = length * (1 << typed_array_size_log2(p->class_id)); + memcpy(p->u.array.u.ptr, init, len); + } + + return ret; } /* Return the buffer associated to the typed array or an exception if diff --git a/quickjs.h b/quickjs.h index edc7b47..3fd80f4 100644 --- a/quickjs.h +++ b/quickjs.h @@ -845,8 +845,8 @@ typedef enum JSTypedArrayEnum { JS_TYPED_ARRAY_FLOAT64, } JSTypedArrayEnum; -JSValue JS_NewTypedArray(JSContext *ctx, int argc, JSValueConst *argv, - JSTypedArrayEnum array_type); +JSValue JS_NewTypedArray(JSContext *ctx, size_t length, const void *init, + JSTypedArrayEnum type); JSValue JS_GetTypedArrayBuffer(JSContext *ctx, JSValueConst obj, size_t *pbyte_offset, size_t *pbyte_length,