From: Fabrice Bellard Date: Mon, 2 Nov 2026 16:37:50 +0000 (+0100) Subject: exported IsArrayBuffer, IsImmutableArrayBuffer, SetImmutableArrayBuffer, NewUint8Arra... X-Git-Url: https://git.kaiwu.me/?a=commitdiff_plain;h=5e741b896af621de9d367691ff10d583b89cdda8;p=quickjs.git exported IsArrayBuffer, IsImmutableArrayBuffer, SetImmutableArrayBuffer, NewUint8Array, JS_NewUint8ArrayCopy and NewUint8ArrayCopy2. Modified JS_GetClassID to take JSValueConst as input --- diff --git a/quickjs.c b/quickjs.c index 6048781..6dadfee 100644 --- a/quickjs.c +++ b/quickjs.c @@ -3925,7 +3925,7 @@ JSClassID JS_NewClassID(JSClassID *pclass_id) return class_id; } -JSClassID JS_GetClassID(JSValue v) +JSClassID JS_GetClassID(JSValueConst v) { JSObject *p; if (JS_VALUE_GET_TAG(v) != JS_TAG_OBJECT) @@ -60694,6 +60694,11 @@ JSValue JS_NewArrayBufferCopy(JSContext *ctx, const uint8_t *buf, size_t len) TRUE); } +BOOL JS_IsArrayBuffer(JSValueConst obj) +{ + return JS_GetClassID(obj) == JS_CLASS_ARRAY_BUFFER; +} + static JSValue js_array_buffer_constructor0(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv, JSClassID class_id) @@ -60933,6 +60938,23 @@ void JS_DetachArrayBuffer(JSContext *ctx, JSValueConst obj) js_array_buffer_update_typed_arrays(abuf); } +int JS_IsImmutableArrayBuffer(JSValueConst obj) +{ + JSArrayBuffer *abuf = JS_GetOpaque(obj, JS_CLASS_ARRAY_BUFFER); + if (!abuf) + return -1; + return abuf->immutable; +} + +int JS_SetImmutableArrayBuffer(JSValueConst obj, BOOL immutable) +{ + JSArrayBuffer *abuf = JS_GetOpaque(obj, JS_CLASS_ARRAY_BUFFER); + if (!abuf) + return -1; + abuf->immutable = (immutable != 0); + return 0; +} + /* get an ArrayBuffer or SharedArrayBuffer */ static JSArrayBuffer *js_get_array_buffer(JSContext *ctx, JSValueConst obj) { @@ -63246,18 +63268,11 @@ static size_t u8a_hex_decode(const char *src, size_t src_len, return written; } -static JSValue JS_NewUint8ArrayCopy(JSContext *ctx, const uint8_t *buf, size_t len) +static JSValue js_new_uint8array(JSContext *ctx, JSValue buffer) { - JSValue buffer, obj; + JSValue obj; JSArrayBuffer *abuf; - buffer = js_array_buffer_constructor3(ctx, JS_UNDEFINED, len, NULL, - JS_CLASS_ARRAY_BUFFER, - (uint8_t *)buf, - js_array_buffer_free, NULL, - TRUE); - if (JS_IsException(buffer)) - return JS_EXCEPTION; obj = JS_CreateFromConstructor(ctx, JS_UNDEFINED, JS_CLASS_UINT8_ARRAY); if (JS_IsException(obj)) { JS_FreeValue(ctx, buffer); @@ -63273,6 +63288,49 @@ static JSValue JS_NewUint8ArrayCopy(JSContext *ctx, const uint8_t *buf, size_t l return obj; } +JSValue JS_NewUint8Array(JSContext *ctx, uint8_t *buf, size_t len, + JSFreeArrayBufferDataFunc *free_func, + void *opaque, BOOL is_shared) +{ + JSClassID class_id = + is_shared ? JS_CLASS_SHARED_ARRAY_BUFFER : JS_CLASS_ARRAY_BUFFER; + JSValue buffer = js_array_buffer_constructor3(ctx, JS_UNDEFINED, len, NULL, + class_id, buf, free_func, + opaque, FALSE); + if (JS_IsException(buffer)) + return JS_EXCEPTION; + return js_new_uint8array(ctx, buffer); +} + +JSValue JS_NewUint8ArrayCopy2(JSContext *ctx, const uint8_t *buf, size_t len, BOOL is_immutable) +{ + JSValue buffer = js_array_buffer_constructor3(ctx, JS_UNDEFINED, len, NULL, + JS_CLASS_ARRAY_BUFFER, + (uint8_t *)buf, + js_array_buffer_free, NULL, + TRUE); + if (JS_IsException(buffer)) + return JS_EXCEPTION; + if (is_immutable) { + JS_SetImmutableArrayBuffer(buffer, TRUE); + } + return js_new_uint8array(ctx, buffer); +} + +JSValue JS_NewUint8ArrayCopy(JSContext *ctx, const uint8_t *buf, size_t len) +{ + return JS_NewUint8ArrayCopy2(ctx, buf, len, FALSE); +} + +int JS_GetTypedArrayType(JSValueConst obj) +{ + JSClassID class_id = JS_GetClassID(obj); + if (class_id >= JS_CLASS_UINT8C_ARRAY && class_id <= JS_CLASS_FLOAT64_ARRAY) + return class_id - JS_CLASS_UINT8C_ARRAY; + else + return -1; +} + /* Validate that this_val is a Uint8Array (type check only, no detach check). Returns the JSObject pointer or NULL on error (throws). */ static JSObject *check_uint8array(JSContext *ctx, JSValueConst this_val, BOOL is_write) diff --git a/quickjs.h b/quickjs.h index 747d849..e3fc629 100644 --- a/quickjs.h +++ b/quickjs.h @@ -574,7 +574,7 @@ typedef struct JSClassDef { #define JS_INVALID_CLASS_ID 0 JSClassID JS_NewClassID(JSClassID *pclass_id); /* Returns the class ID if `v` is an object, otherwise returns JS_INVALID_CLASS_ID. */ -JSClassID JS_GetClassID(JSValue v); +JSClassID JS_GetClassID(JSValueConst v); int JS_NewClass(JSRuntime *rt, JSClassID class_id, const JSClassDef *class_def); int JS_IsRegisteredClass(JSRuntime *rt, JSClassID class_id); @@ -920,6 +920,11 @@ JSValue JS_NewArrayBuffer(JSContext *ctx, uint8_t *buf, size_t len, JSValue JS_NewArrayBufferCopy(JSContext *ctx, const uint8_t *buf, size_t len); void JS_DetachArrayBuffer(JSContext *ctx, JSValueConst obj); uint8_t *JS_GetArrayBuffer(JSContext *ctx, size_t *psize, JSValueConst obj); +JS_BOOL JS_IsArrayBuffer(JSValueConst obj); +// returns true or false if obj is an ArrayBuffer, -1 otherwise +int JS_IsImmutableArrayBuffer(JSValueConst obj); +// returns 0 if obj is an ArrayBuffer, -1 otherwise +int JS_SetImmutableArrayBuffer(JSValueConst obj, JS_BOOL immutable); typedef enum JSTypedArrayEnum { JS_TYPED_ARRAY_UINT8C = 0, @@ -942,6 +947,13 @@ JSValue JS_GetTypedArrayBuffer(JSContext *ctx, JSValueConst obj, size_t *pbyte_offset, size_t *pbyte_length, size_t *pbytes_per_element); +/* returns -1 if not a typed array otherwise return a JSTypedArrayEnum value */ +int JS_GetTypedArrayType(JSValueConst obj); +JSValue JS_NewUint8Array(JSContext *ctx, uint8_t *buf, size_t len, + JSFreeArrayBufferDataFunc *free_func, + void *opaque, JS_BOOL is_shared); +JSValue JS_NewUint8ArrayCopy(JSContext *ctx, const uint8_t *buf, size_t len); +JSValue JS_NewUint8ArrayCopy2(JSContext *ctx, const uint8_t *buf, size_t len, JS_BOOL is_immutable); typedef struct { void *(*sab_alloc)(void *opaque, size_t size); void (*sab_free)(void *opaque, void *ptr);