about summary refs log tree commit diff stats
path: root/lib/quickjs/quickjs.c
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2023-12-13 19:01:10 +0100
committerbptato <nincsnevem662@gmail.com>2023-12-14 11:24:33 +0100
commit24565a7a34dcaf4efd960640369095587e786ad5 (patch)
treed8b27adcb70e5eb83767c2cd94ac958fef61ad68 /lib/quickjs/quickjs.c
parentc842af1bd5e80b40ea83edb040c864aba8c299c6 (diff)
downloadchawan-24565a7a34dcaf4efd960640369095587e786ad5.tar.gz
Fix AsyncGenerator.prototype.return error handling (bnoordhuis)
Diffstat (limited to 'lib/quickjs/quickjs.c')
-rw-r--r--lib/quickjs/quickjs.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/quickjs/quickjs.c b/lib/quickjs/quickjs.c
index c68a8ab3..ccc8cf2f 100644
--- a/lib/quickjs/quickjs.c
+++ b/lib/quickjs/quickjs.c
@@ -19310,10 +19310,19 @@ static int js_async_generator_completed_return(JSContext *ctx,
     JSValue promise, resolving_funcs[2], resolving_funcs1[2];
     int res;
 
-    promise = js_promise_resolve(ctx, ctx->promise_ctor,
-                                 1, (JSValueConst *)&value, 0);
-    if (JS_IsException(promise))
-        return -1;
+    // Can fail looking up JS_ATOM_constructor when is_reject==0.
+    promise = js_promise_resolve(ctx, ctx->promise_ctor, 1, &value,
+                                 /*is_reject*/0);
+    // A poisoned .constructor property is observable and the resulting
+    // exception should be delivered to the catch handler.
+    if (JS_IsException(promise)) {
+        JSValue err = JS_GetException(ctx);
+        promise = js_promise_resolve(ctx, ctx->promise_ctor, 1, &err,
+                                     /*is_reject*/1);
+        JS_FreeValue(ctx, err);
+        if (JS_IsException(promise))
+            return -1;
+    }
     if (js_async_generator_resolve_function_create(ctx,
                                                    JS_MKPTR(JS_TAG_OBJECT, s->generator),
                                                    resolving_funcs1,