From 18ed0bc9cfa68643ea488fb58d1d9e6359b144de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Isager=20Dalsgar=C3=B0?= Date: Mon, 15 Jun 2026 14:18:44 +0200 Subject: [PATCH 1/3] Expose missing type predicates --- quickjs.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ quickjs.h | 18 +++++++++++ 2 files changed, 109 insertions(+) diff --git a/quickjs.c b/quickjs.c index fa5a7a9d0..2a9150828 100644 --- a/quickjs.c +++ b/quickjs.c @@ -3846,6 +3846,97 @@ JSClassID JS_GetClassID(JSValue v) return p->class_id; } +JS_BOOL JS_IsArrayBuffer(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_ARRAY_BUFFER; +} + +JS_BOOL JS_IsDataView(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_DATAVIEW; +} + +JS_BOOL JS_IsDate(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_DATE; +} + +JS_BOOL JS_IsRegExp(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_REGEXP; +} + +JS_BOOL JS_IsPromise(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_PROMISE; +} + +JS_BOOL JS_IsProxy(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_PROXY; +} + +JS_BOOL JS_IsMap(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_MAP; +} + +JS_BOOL JS_IsSet(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_SET; +} + +JS_BOOL JS_IsWeakMap(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_WEAKMAP; +} + +JS_BOOL JS_IsWeakSet(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_WEAKSET; +} + +JS_BOOL JS_IsWeakRef(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_WEAK_REF; +} + +JS_BOOL JS_IsAsyncFunction(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_ASYNC_FUNCTION; +} + +JS_BOOL JS_IsGeneratorFunction(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_GENERATOR_FUNCTION; +} + +JS_BOOL JS_IsGenerator(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_GENERATOR; +} + +JS_BOOL JS_IsArguments(JSValueConst v) +{ + JSClassID class_id = JS_GetClassID(v); + return class_id == JS_CLASS_ARGUMENTS || class_id == JS_CLASS_MAPPED_ARGUMENTS; +} + +JS_BOOL JS_IsMapIterator(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_MAP_ITERATOR; +} + +JS_BOOL JS_IsSetIterator(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_SET_ITERATOR; +} + +JS_BOOL JS_IsModuleNamespace(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_MODULE_NS; +} + BOOL JS_IsRegisteredClass(JSRuntime *rt, JSClassID class_id) { return (class_id < rt->class_count && diff --git a/quickjs.h b/quickjs.h index 476d73513..d964b4976 100644 --- a/quickjs.h +++ b/quickjs.h @@ -770,6 +770,24 @@ JS_BOOL JS_SetConstructorBit(JSContext *ctx, JSValueConst func_obj, JS_BOOL val) JSValue JS_NewArray(JSContext *ctx); int JS_IsArray(JSContext *ctx, JSValueConst val); +JS_BOOL JS_IsArrayBuffer(JSValueConst val); +JS_BOOL JS_IsDataView(JSValueConst val); +JS_BOOL JS_IsDate(JSValueConst val); +JS_BOOL JS_IsRegExp(JSValueConst val); +JS_BOOL JS_IsPromise(JSValueConst val); +JS_BOOL JS_IsProxy(JSValueConst val); +JS_BOOL JS_IsMap(JSValueConst val); +JS_BOOL JS_IsSet(JSValueConst val); +JS_BOOL JS_IsWeakMap(JSValueConst val); +JS_BOOL JS_IsWeakSet(JSValueConst val); +JS_BOOL JS_IsWeakRef(JSValueConst val); +JS_BOOL JS_IsAsyncFunction(JSValueConst val); +JS_BOOL JS_IsGeneratorFunction(JSValueConst val); +JS_BOOL JS_IsGenerator(JSValueConst val); +JS_BOOL JS_IsArguments(JSValueConst val); +JS_BOOL JS_IsMapIterator(JSValueConst val); +JS_BOOL JS_IsSetIterator(JSValueConst val); +JS_BOOL JS_IsModuleNamespace(JSValueConst val); JSValue JS_NewDate(JSContext *ctx, double epoch_ms); From 27711522aa078bd3856efb5f07bc0bcab69f5ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Isager=20Dalsgar=C3=B0?= Date: Mon, 15 Jun 2026 14:23:33 +0200 Subject: [PATCH 2/3] `JS_GetClassID()` accepts `JSValueConst` --- quickjs.c | 2 +- quickjs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/quickjs.c b/quickjs.c index 2a9150828..20f078a19 100644 --- a/quickjs.c +++ b/quickjs.c @@ -3837,7 +3837,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) diff --git a/quickjs.h b/quickjs.h index d964b4976..608e41f05 100644 --- a/quickjs.h +++ b/quickjs.h @@ -546,7 +546,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); From cff4790b5d7913c2dbcd84e873115635138a2195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Isager=20Dalsgar=C3=B0?= Date: Tue, 16 Jun 2026 13:07:59 +0200 Subject: [PATCH 3/3] Add more predicates --- quickjs.c | 11 +++++++++++ quickjs.h | 2 ++ 2 files changed, 13 insertions(+) diff --git a/quickjs.c b/quickjs.c index 20f078a19..ce00972ec 100644 --- a/quickjs.c +++ b/quickjs.c @@ -3851,6 +3851,17 @@ JS_BOOL JS_IsArrayBuffer(JSValueConst v) return JS_GetClassID(v) == JS_CLASS_ARRAY_BUFFER; } +JS_BOOL JS_IsSharedArrayBuffer(JSValueConst v) +{ + return JS_GetClassID(v) == JS_CLASS_SHARED_ARRAY_BUFFER; +} + +JS_BOOL JS_IsTypedArray(JSValueConst v) +{ + JSClassID class_id = JS_GetClassID(v); + return class_id >= JS_CLASS_UINT8C_ARRAY && class_id <= JS_CLASS_FLOAT64_ARRAY; +} + JS_BOOL JS_IsDataView(JSValueConst v) { return JS_GetClassID(v) == JS_CLASS_DATAVIEW; diff --git a/quickjs.h b/quickjs.h index 608e41f05..e02874f90 100644 --- a/quickjs.h +++ b/quickjs.h @@ -771,6 +771,8 @@ JS_BOOL JS_SetConstructorBit(JSContext *ctx, JSValueConst func_obj, JS_BOOL val) JSValue JS_NewArray(JSContext *ctx); int JS_IsArray(JSContext *ctx, JSValueConst val); JS_BOOL JS_IsArrayBuffer(JSValueConst val); +JS_BOOL JS_IsSharedArrayBuffer(JSValueConst val); +JS_BOOL JS_IsTypedArray(JSValueConst val); JS_BOOL JS_IsDataView(JSValueConst val); JS_BOOL JS_IsDate(JSValueConst val); JS_BOOL JS_IsRegExp(JSValueConst val);