[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