summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2025-05-16 18:02:14 +0200
committerFabrice Bellard <fabrice@bellard.org>2025-05-16 18:02:14 +0200
commit9c973a8923145c5682afb904621cfbc59a7ec7f9 (patch)
tree12eaadaa16122ebd3565b5ff2e5b077781d7e336
parent3c39307c22e69e34b85ee766b14b81e4000d71f8 (diff)
downloadquickjs-9c973a8923145c5682afb904621cfbc59a7ec7f9.tar.gz
quickjs-9c973a8923145c5682afb904621cfbc59a7ec7f9.zip
added Promise.try (saghul)
-rw-r--r--quickjs.c29
-rw-r--r--test262.conf2
2 files changed, 30 insertions, 1 deletions
diff --git a/quickjs.c b/quickjs.c
index 49a8f79..7907af5 100644
--- a/quickjs.c
+++ b/quickjs.c
@@ -49216,6 +49216,34 @@ static JSValue js_promise_withResolvers(JSContext *ctx,
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,
JSValueConst resolve_element_env,
int addend)
@@ -49703,6 +49731,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 5692112..e99e9da 100644
--- a/test262.conf
+++ b/test262.conf
@@ -162,7 +162,7 @@ Object.is
optional-catch-binding
optional-chaining
Promise
-promise-try=skip
+promise-try
promise-with-resolvers
Promise.allSettled
Promise.any