details:   
https://github.com/nginx/njs/commit/211f229edd02c87caef872418fe550290edb7326
branches:  master
commit:    211f229edd02c87caef872418fe550290edb7326
user:      Dmitry Volyntsev <xei...@nginx.com>
date:      Wed, 26 Mar 2025 22:13:22 -0700
description:
QuickJS: fixed compatibility issues with QuickJS-NG 0.9.0.

This fixes #872 on Github.

---
 .github/workflows/check-pr.yml     |  2 +-
 auto/quickjs                       | 23 +++++++++++++++++++++++
 external/qjs_query_string_module.c |  4 ++--
 external/qjs_webcrypto_module.c    |  2 +-
 external/qjs_xml_module.c          |  2 +-
 nginx/ngx_http_js_module.c         | 16 ++++++++--------
 src/qjs.h                          | 10 +++++++++-
 src/qjs_buffer.c                   |  2 +-
 8 files changed, 46 insertions(+), 15 deletions(-)

diff --git a/.github/workflows/check-pr.yml b/.github/workflows/check-pr.yml
index 75e590fe..2be02e7b 100644
--- a/.github/workflows/check-pr.yml
+++ b/.github/workflows/check-pr.yml
@@ -52,7 +52,7 @@ jobs:
         run: |
           git clone https://github.com/quickjs-ng/quickjs quickjs-ng
           cd quickjs-ng
-          git checkout v0.8.0
+          git checkout v0.9.0
           CFLAGS="$CC_OPT -fPIC" LDFLAGS=$LD_OPT cmake -B build
           cmake --build build --target qjs -j $(nproc)
 
diff --git a/auto/quickjs b/auto/quickjs
index e4eecd29..60c0888e 100644
--- a/auto/quickjs
+++ b/auto/quickjs
@@ -137,6 +137,29 @@ if [ $NJS_TRY_QUICKJS = YES ]; then
 
         . auto/feature
 
+        njs_feature="QuickJS JS_IsArray()"
+        njs_feature_name=NJS_HAVE_QUICKJS_IS_ARRAY_SINGLE_ARG
+        njs_feature_test="#if defined(__GNUC__) && (__GNUC__ >= 8)
+                          #pragma GCC diagnostic push
+                          #pragma GCC diagnostic ignored 
\"-Wcast-function-type\"
+                          #endif
+
+                          #include <quickjs.h>
+
+                          int main() {
+                              JSRuntime *rt;
+                              JSContext *ctx;
+
+                              rt = JS_NewRuntime();
+                              ctx = JS_NewContext(rt);
+                              (void) JS_IsArray(JS_UNDEFINED);
+                              JS_FreeContext(ctx);
+                              JS_FreeRuntime(rt);
+                              return 0;
+                         }"
+
+        . auto/feature
+
         njs_feature="QuickJS JS_AddIntrinsicBigInt()"
         njs_feature_name=NJS_HAVE_QUICKJS_ADD_INTRINSIC_BIG_INT
         njs_feature_test="#if defined(__GNUC__) && (__GNUC__ >= 8)
diff --git a/external/qjs_query_string_module.c 
b/external/qjs_query_string_module.c
index 63553a53..bb787229 100644
--- a/external/qjs_query_string_module.c
+++ b/external/qjs_query_string_module.c
@@ -403,7 +403,7 @@ qjs_query_string_append(JSContext *cx, JSValue object, 
const u_char *key,
             goto exception;
         }
 
-    } else if (JS_IsArray(cx, prev)) {
+    } else if (qjs_is_array(cx, prev)) {
         length = JS_GetPropertyStr(cx, prev, "length");
 
         if (JS_ToUint32(cx, &len, length) < 0) {
@@ -762,7 +762,7 @@ qjs_query_string_stringify_internal(JSContext *cx, JSValue 
obj, njs_str_t *sep,
             goto fail;
         }
 
-        if (JS_IsArray(cx, val)) {
+        if (qjs_is_array(cx, val)) {
             key = JS_AtomToString(cx, ptab[n].atom);
             if (JS_IsException(key)) {
                 JS_FreeValue(cx, val);
diff --git a/external/qjs_webcrypto_module.c b/external/qjs_webcrypto_module.c
index 9c4bb452..a28a8581 100644
--- a/external/qjs_webcrypto_module.c
+++ b/external/qjs_webcrypto_module.c
@@ -4556,7 +4556,7 @@ qjs_key_usage(JSContext *cx, JSValue value, unsigned 
*mask)
     njs_str_t              s;
     qjs_webcrypto_entry_t  *e;
 
-    if (!JS_IsArray(cx, value)) {
+    if (!qjs_is_array(cx, value)) {
         JS_ThrowTypeError(cx, "\"keyUsages\" argument must be an Array");
         return JS_EXCEPTION;
     }
diff --git a/external/qjs_xml_module.c b/external/qjs_xml_module.c
index 087b4a7b..8f90ee5c 100644
--- a/external/qjs_xml_module.c
+++ b/external/qjs_xml_module.c
@@ -795,7 +795,7 @@ qjs_xml_node_tags_modify(JSContext *cx, JSValue obj, 
njs_str_t *name,
         return -1;
     }
 
-    if (!JS_IsArray(cx, setval)) {
+    if (!qjs_is_array(cx, setval)) {
         JS_ThrowTypeError(cx, "setval is not an array");
         return -1;
     }
diff --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c
index 369ae50b..0c8215c5 100644
--- a/nginx/ngx_http_js_module.c
+++ b/nginx/ngx_http_js_module.c
@@ -4910,7 +4910,7 @@ ngx_http_qjs_ext_args(JSContext *cx, JSValueConst 
this_val)
                 goto exception;
             }
 
-        } else if (JS_IsArray(cx, prev)) {
+        } else if (qjs_is_array(cx, prev)) {
             length = JS_GetPropertyStr(cx, prev, "length");
 
             if (JS_ToUint32(cx, &len, length)) {
@@ -6729,7 +6729,7 @@ ngx_http_qjs_headers_out_handler(JSContext *cx, 
ngx_http_request_t *r,
         return 1;
     }
 
-    if (JS_IsArray(cx, *value)) {
+    if (qjs_is_array(cx, *value)) {
         v = JS_GetPropertyStr(cx, *value, "length");
         if (JS_IsException(v)) {
             return -1;
@@ -6750,7 +6750,7 @@ ngx_http_qjs_headers_out_handler(JSContext *cx, 
ngx_http_request_t *r,
     ph = &header;
 
     for (i = 0; i < (uint32_t) length; i++) {
-        if (JS_IsArray(cx, *value)) {
+        if (qjs_is_array(cx, *value)) {
             v = JS_GetPropertyUint32(cx, *value, i);
             if (JS_IsException(v)) {
                 return -1;
@@ -6759,7 +6759,7 @@ ngx_http_qjs_headers_out_handler(JSContext *cx, 
ngx_http_request_t *r,
 
         rc = ngx_qjs_string(cx, v, &s);
 
-        if (JS_IsArray(cx, *value)) {
+        if (qjs_is_array(cx, *value)) {
             JS_FreeValue(cx, v);
         }
 
@@ -6832,7 +6832,7 @@ ngx_http_qjs_headers_out_special_handler(JSContext *cx, 
ngx_http_request_t *r,
     }
 
     if (value != NULL) {
-        if (JS_IsArray(cx, *value)) {
+        if (qjs_is_array(cx, *value)) {
             len = JS_GetPropertyStr(cx, *value, "length");
             if (JS_IsException(len)) {
                 return -1;
@@ -6860,7 +6860,7 @@ ngx_http_qjs_headers_out_special_handler(JSContext *cx, 
ngx_http_request_t *r,
 
     rc = ngx_qjs_string(cx, setval, &s);
 
-    if (value != NULL && JS_IsArray(cx, *value)) {
+    if (value != NULL && qjs_is_array(cx, *value)) {
         JS_FreeValue(cx, setval);
     }
 
@@ -7071,7 +7071,7 @@ ngx_http_qjs_headers_out_content_type(JSContext *cx, 
ngx_http_request_t *r,
         return 1;
     }
 
-    if (JS_IsArray(cx, *value)) {
+    if (qjs_is_array(cx, *value)) {
         len = JS_GetPropertyStr(cx, *value, "length");
         if (JS_IsException(len)) {
             return -1;
@@ -7095,7 +7095,7 @@ ngx_http_qjs_headers_out_content_type(JSContext *cx, 
ngx_http_request_t *r,
 
     rc = ngx_qjs_string(cx, setval, &s);
 
-    if (JS_IsArray(cx, *value)) {
+    if (qjs_is_array(cx, *value)) {
         JS_FreeValue(cx, setval);
     }
 
diff --git a/src/qjs.h b/src/qjs.h
index 25d6cba3..d3bbc0e8 100644
--- a/src/qjs.h
+++ b/src/qjs.h
@@ -27,6 +27,10 @@
 
 #include <quickjs.h>
 
+#ifndef JS_BOOL
+#define JS_BOOL bool
+#endif
+
 #if defined(__GNUC__) && (__GNUC__ >= 8)
 #pragma GCC diagnostic pop
 #endif
@@ -144,13 +148,17 @@ static inline JS_BOOL JS_IsNullOrUndefined(JSValueConst v)
            || JS_VALUE_GET_TAG(v) == JS_TAG_UNDEFINED;
 }
 
-
 #ifdef NJS_HAVE_QUICKJS_IS_SAME_VALUE
 #define qjs_is_same_value(cx, a, b) JS_IsSameValue(cx, a, b)
 #else
 #define qjs_is_same_value(cx, a, b) JS_SameValue(cx, a, b)
 #endif
 
+#ifdef NJS_HAVE_QUICKJS_IS_ARRAY_SINGLE_ARG
+#define qjs_is_array(cx, a) JS_IsArray(a)
+#else
+#define qjs_is_array(cx, a) JS_IsArray(cx, a)
+#endif
 
 extern qjs_module_t              *qjs_modules[];
 
diff --git a/src/qjs_buffer.c b/src/qjs_buffer.c
index 48f609be..a45f57ce 100644
--- a/src/qjs_buffer.c
+++ b/src/qjs_buffer.c
@@ -440,7 +440,7 @@ qjs_buffer_concat(JSContext *ctx, JSValueConst this_val, 
int argc,
 
     list = argv[0];
 
-    if (!JS_IsArray(ctx, list)) {
+    if (!qjs_is_array(ctx, list)) {
         return JS_ThrowTypeError(ctx,
                             "\"list\" argument must be an instance of Array");
     }
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel

Reply via email to