details: https://github.com/nginx/njs/commit/87086636eda9a967a44f8aa6b695dbfe916574a4 branches: master commit: 87086636eda9a967a44f8aa6b695dbfe916574a4 user: Dmitry Volyntsev <xei...@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); _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel