From d9d6939b20ae6e74399ed88433b3a121afdd642d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Tue, 15 Oct 2024 11:46:45 +0200 Subject: [PATCH] Implement Promise.try --- quickjs.c | 29 +++++++++++++++++++++++++++++ test262.conf | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/quickjs.c b/quickjs.c index 110e09d..7d80009 100644 --- a/quickjs.c +++ b/quickjs.c @@ -48018,6 +48018,34 @@ static JSValue js_promise_withResolvers(JSContext *ctx, JSValue this_val, return obj; } +static JSValue js_promise_try(JSContext *ctx, JSValue this_val, + int argc, JSValue *argv) +{ + JSValue result_promise, resolving_funcs[2], ret, ret2; + BOOL is_reject = 0; + + if (!JS_IsObject(this_val)) + return JS_ThrowTypeErrorNotAnObject(ctx); + result_promise = js_new_promise_capability(ctx, resolving_funcs, this_val); + if (JS_IsException(result_promise)) + return result_promise; + ret = JS_Call(ctx, argv[0], JS_UNDEFINED, argc - 1, argv + 1); + if (JS_IsException(ret)) { + is_reject = 1; + ret = JS_GetException(ctx); + } + ret2 = JS_Call(ctx, resolving_funcs[is_reject], JS_UNDEFINED, 1, &ret); + JS_FreeValue(ctx, resolving_funcs[0]); + JS_FreeValue(ctx, resolving_funcs[1]); + JS_FreeValue(ctx, ret); + if (JS_IsException(ret2)) { + JS_FreeValue(ctx, result_promise); + return ret2; + } + JS_FreeValue(ctx, ret2); + return result_promise; +} + static __exception int remainingElementsCount_add(JSContext *ctx, JSValue resolve_element_env, int addend) @@ -48505,6 +48533,7 @@ static const JSCFunctionListEntry js_promise_funcs[] = { JS_CFUNC_MAGIC_DEF("all", 1, js_promise_all, PROMISE_MAGIC_all ), JS_CFUNC_MAGIC_DEF("allSettled", 1, js_promise_all, PROMISE_MAGIC_allSettled ), JS_CFUNC_MAGIC_DEF("any", 1, js_promise_all, PROMISE_MAGIC_any ), + JS_CFUNC_DEF("try", 1, js_promise_try ), JS_CFUNC_DEF("race", 1, js_promise_race ), JS_CFUNC_DEF("withResolvers", 0, js_promise_withResolvers ), JS_CGETSET_DEF("[Symbol.species]", js_get_this, NULL), diff --git a/test262.conf b/test262.conf index 0ed1f59..5384a0b 100644 --- a/test262.conf +++ b/test262.conf @@ -153,7 +153,7 @@ Object.is optional-catch-binding optional-chaining Promise -promise-try=skip +promise-try promise-with-resolvers Promise.allSettled Promise.any