[njs] QuickJS: introduced qjs_promise_result().

noreply at nginx.com noreply at nginx.com
Tue Mar 25 01:36:02 UTC 2025


details:   https://github.com/nginx/njs/commit/87086636eda9a967a44f8aa6b695dbfe916574a4
branches:  master
commit:    87086636eda9a967a44f8aa6b695dbfe916574a4
user:      Dmitry Volyntsev <xeioex at nginx.com>
date:      Tue, 25 Mar 2025 08:39:06 +0800
description:
QuickJS: introduced qjs_promise_result().


---
 external/qjs_fs_module.c        | 35 ++++------------------
 external/qjs_webcrypto_module.c | 64 ++++++++---------------------------------
 src/qjs.c                       | 39 +++++++++++++++++++++++++
 src/qjs.h                       |  2 ++
 4 files changed, 58 insertions(+), 82 deletions(-)

diff --git a/external/qjs_fs_module.c b/external/qjs_fs_module.c
index b09d1dcd..48ae9833 100644
--- a/external/qjs_fs_module.c
+++ b/external/qjs_fs_module.c
@@ -2689,18 +2689,10 @@ qjs_fs_filehandle_finalizer(JSRuntime *rt, JSValue val)
 }
 
 
-static JSValue
-qjs_fs_promise_trampoline(JSContext *cx, int argc, JSValueConst *argv)
-{
-    return JS_Call(cx, argv[0], JS_UNDEFINED, 1, &argv[1]);
-}
-
-
 static JSValue
 qjs_fs_result(JSContext *cx, JSValue result, int calltype, JSValue callback)
 {
-    JS_BOOL  is_error;
-    JSValue  promise, callbacks[2], arguments[2];
+    JSValue  promise, arguments[2];
 
     switch (calltype) {
     case QJS_FS_DIRECT:
@@ -2712,29 +2704,12 @@ qjs_fs_result(JSContext *cx, JSValue result, int calltype, JSValue callback)
         return result;
 
     case QJS_FS_PROMISE:
-        promise = JS_NewPromiseCapability(cx, callbacks);
-        if (JS_IsException(promise)) {
-            JS_FreeValue(cx, result);
-            return JS_EXCEPTION;
-        }
-
-        is_error = !!JS_IsError(cx, result);
-
-        arguments[0] = callbacks[is_error];
-        arguments[1] = result;
-        JS_FreeValue(cx, callbacks[!is_error]);
-
-        if (JS_EnqueueJob(cx, qjs_fs_promise_trampoline, 2, arguments) < 0) {
-            JS_FreeValue(cx, promise);
-            JS_FreeValue(cx, callbacks[is_error]);
-            JS_FreeValue(cx, result);
-            return JS_EXCEPTION;
+        if (JS_IsError(cx, result)) {
+            JS_Throw(cx, result);
+            return qjs_promise_result(cx, JS_EXCEPTION);
         }
 
-        JS_FreeValue(cx, arguments[0]);
-        JS_FreeValue(cx, arguments[1]);
-
-        return promise;
+        return qjs_promise_result(cx, result);
 
     case QJS_FS_CALLBACK:
         if (JS_IsError(cx, result)) {
diff --git a/external/qjs_webcrypto_module.c b/external/qjs_webcrypto_module.c
index 9552ca12..9c4bb452 100644
--- a/external/qjs_webcrypto_module.c
+++ b/external/qjs_webcrypto_module.c
@@ -156,7 +156,6 @@ static const char *qjs_algorithm_string(qjs_webcrypto_algorithm_t *algorithm);
 static const char *qjs_algorithm_hash_name(qjs_webcrypto_hash_t hash);
 static JSValue qjs_key_usage(JSContext *cx, JSValue value, unsigned *mask);
 static JSValue qjs_key_ops(JSContext *cx, unsigned mask);
-static JSValue qjs_webcrypto_result(JSContext *cx, JSValue result, int rc);
 static void qjs_webcrypto_error(JSContext *cx, const char *fmt, ...);
 
 static JSModuleDef *qjs_webcrypto_init(JSContext *cx, const char *name);
@@ -547,11 +546,11 @@ qjs_webcrypto_cipher(JSContext *cx, JSValueConst this_val,
         }
     }
 
-    return qjs_webcrypto_result(cx, ret, 0);
+    return qjs_promise_result(cx, ret);
 
 fail:
 
-    return qjs_webcrypto_result(cx, JS_UNDEFINED, -1);
+    return qjs_promise_result(cx, JS_EXCEPTION);
 }
 
 
@@ -1956,7 +1955,7 @@ free:
         ret = qjs_new_array_buffer(cx, k, length);
     }
 
-    return qjs_webcrypto_result(cx, ret, 0);
+    return qjs_promise_result(cx, ret);
 
 fail:
 
@@ -1964,7 +1963,7 @@ fail:
 
     js_free(cx, k);
 
-    return qjs_webcrypto_result(cx, JS_UNDEFINED, -1);
+    return qjs_promise_result(cx, JS_EXCEPTION);
 }
 
 
@@ -2170,11 +2169,11 @@ qjs_webcrypto_export_key(JSContext *cx, JSValueConst this_val, int argc,
 
     }
 
-    return qjs_webcrypto_result(cx, ret, 0);
+    return qjs_promise_result(cx, ret);
 
 fail:
 
-    return qjs_webcrypto_result(cx, JS_UNDEFINED, -1);
+    return qjs_promise_result(cx, JS_EXCEPTION);
 }
 
 
@@ -2437,7 +2436,7 @@ qjs_webcrypto_generate_key(JSContext *cx, JSValueConst this_val,
         goto fail;
     }
 
-    return qjs_webcrypto_result(cx, obj, 0);
+    return qjs_promise_result(cx, obj);
 
 fail:
 
@@ -2448,7 +2447,7 @@ fail:
     JS_FreeValue(cx, key);
     JS_FreeValue(cx, keypub);
 
-    return qjs_webcrypto_result(cx, JS_UNDEFINED, -1);
+    return qjs_promise_result(cx, JS_EXCEPTION);
 }
 
 
@@ -3489,7 +3488,7 @@ qjs_webcrypto_import_key(JSContext *cx, JSValueConst this_val, int argc,
         break;
     }
 
-    return qjs_webcrypto_result(cx, key, 0);
+    return qjs_promise_result(cx, key);
 
 fail:
 
@@ -3499,7 +3498,7 @@ fail:
 
     JS_FreeValue(cx, key);
 
-    return qjs_webcrypto_result(cx, JS_UNDEFINED, -1);
+    return qjs_promise_result(cx, JS_EXCEPTION);
 }
 
 
@@ -3955,7 +3954,7 @@ qjs_webcrypto_sign(JSContext *cx, JSValueConst this_val, int argc,
         ret = JS_NewBool(cx, rc != 0);
     }
 
-    return qjs_webcrypto_result(cx, ret, 0);
+    return qjs_promise_result(cx, ret);
 
 fail:
 
@@ -3971,7 +3970,7 @@ fail:
         js_free(cx, dst);
     }
 
-    return qjs_webcrypto_result(cx, JS_UNDEFINED, -1);
+    return qjs_promise_result(cx, JS_EXCEPTION);
 }
 
 
@@ -4669,45 +4668,6 @@ qjs_cpystrn(u_char *dst, u_char *src, size_t n)
 }
 
 
-static JSValue
-qjs_webcrypto_promise_trampoline(JSContext *cx, int argc, JSValueConst *argv)
-{
-    return JS_Call(cx, argv[0], JS_UNDEFINED, 1, &argv[1]);
-}
-
-
-static JSValue
-qjs_webcrypto_result(JSContext *cx, JSValue result, int rc)
-{
-    JS_BOOL  is_error;
-    JSValue  promise, callbacks[2], arguments[2];
-
-    promise = JS_NewPromiseCapability(cx, callbacks);
-    if (JS_IsException(promise)) {
-        JS_FreeValue(cx, result);
-        return JS_EXCEPTION;
-    }
-
-    is_error = !!(rc != 0);
-
-    JS_FreeValue(cx, callbacks[!is_error]);
-    arguments[0] = callbacks[is_error];
-    arguments[1] = is_error ? JS_GetException(cx) : result;
-
-    if (JS_EnqueueJob(cx, qjs_webcrypto_promise_trampoline, 2, arguments) < 0) {
-        JS_FreeValue(cx, promise);
-        JS_FreeValue(cx, callbacks[is_error]);
-        JS_FreeValue(cx, arguments[1]);
-        return JS_EXCEPTION;
-    }
-
-    JS_FreeValue(cx, arguments[0]);
-    JS_FreeValue(cx, arguments[1]);
-
-    return promise;
-}
-
-
 static void
 qjs_webcrypto_error(JSContext *cx, const char *fmt, ...)
 {
diff --git a/src/qjs.c b/src/qjs.c
index 7763c165..a941ba71 100644
--- a/src/qjs.c
+++ b/src/qjs.c
@@ -1145,3 +1145,42 @@ qjs_string_base64url(JSContext *cx, const njs_str_t *src)
 
     return ret;
 }
+
+
+static JSValue
+qjs_promise_fill_trampoline(JSContext *cx, int argc, JSValueConst *argv)
+{
+    return JS_Call(cx, argv[0], JS_UNDEFINED, 1, &argv[1]);
+}
+
+
+JSValue
+qjs_promise_result(JSContext *cx, JSValue result)
+{
+    JS_BOOL  is_error;
+    JSValue  promise, callbacks[2], arguments[2];
+
+    promise = JS_NewPromiseCapability(cx, callbacks);
+    if (JS_IsException(promise)) {
+        JS_FreeValue(cx, result);
+        return JS_EXCEPTION;
+    }
+
+    is_error = JS_IsException(result);
+
+    JS_FreeValue(cx, callbacks[!is_error]);
+    arguments[0] = callbacks[is_error];
+    arguments[1] = is_error ? JS_GetException(cx) : result;
+
+    if (JS_EnqueueJob(cx, qjs_promise_fill_trampoline, 2, arguments) < 0) {
+        JS_FreeValue(cx, promise);
+        JS_FreeValue(cx, callbacks[is_error]);
+        JS_FreeValue(cx, result);
+        return JS_EXCEPTION;
+    }
+
+    JS_FreeValue(cx, arguments[0]);
+    JS_FreeValue(cx, arguments[1]);
+
+    return promise;
+}
diff --git a/src/qjs.h b/src/qjs.h
index 7c13f039..c7ef4de0 100644
--- a/src/qjs.h
+++ b/src/qjs.h
@@ -129,6 +129,8 @@ JSValue qjs_string_create_chb(JSContext *cx, njs_chb_t *chain);
 
 void qjs_free_prop_enum(JSContext *ctx, JSPropertyEnum *tab, uint32_t len);
 
+JSValue qjs_promise_result(JSContext *cx, JSValue result);
+
 JSValue qjs_string_hex(JSContext *cx, const njs_str_t *src);
 JSValue qjs_string_base64(JSContext *cx, const njs_str_t *src);
 JSValue qjs_string_base64url(JSContext *cx, const njs_str_t *src);


More information about the nginx-devel mailing list