Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

await bypasses catch when PromiseResolve throws

Abierto
#563 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 3 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
76/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
c, javascript
Área
compilers

Línea de trabajo

Start in quickjs.c at js_async_function_resume() and trace how PromiseResolve exceptions are handled when resuming an async function. Run the supplied qjs command at commit d73189d; done means the reproducer prints “caught: boom” instead of an unhandled rejection, while preserving normal async-function behavior.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Reproducer with the standalone qjs CLI (reproduced at d73189d, no embedding code):

./qjs -e 'const p = Promise.resolve(1);
Object.defineProperty(p, "constructor", { get() { throw Error("boom"); } });
(async () => {
    try { await p; } catch (e) { print("caught: " + e.message); }
})();'

Instead of entering catch, qjs reports Possibly unhandled promise rejection: Error: boom.

Expected behavior

Output: caught: boom. PromiseResolve propagates an exception thrown by the promise's constructor getter; Await propagates that abrupt completion at the await expression, where the surrounding try/catch handles it. QuickJS already resumes an async generator with throw_flag when preparing its await fails (js_async_generator_resume_next()); Node.js 25 also prints caught: boom for the equivalent example.

Possible patch

In js_async_function_resume(), throw the PromiseResolve exception into the suspended async function instead of rejecting its outer promise before its catch can run:

diff --git a/quickjs.c b/quickjs.c
--- a/quickjs.c
+++ b/quickjs.c
@@ -21056,1 +21056,2 @@ static void js_async_function_resume(JSContext *ctx, JSAsyncFunctionState *s)
+ resume:
     func_ret = async_func_resume(ctx, s);
@@ -21082,8 +21083,10 @@ static void js_async_function_resume(JSContext *ctx, JSAsyncFunctionState *s)
         promise = js_promise_resolve(ctx, ctx->promise_ctor,
                                      1, (JSValueConst *)&value, 0);
         JS_FreeValue(ctx, value);
-        if (JS_IsException(promise))
-            goto fail;
+        if (JS_IsException(promise)) {
+            s->throw_flag = TRUE;
+            goto resume;
+        }
Lenguaje dominante
C
Estrellas
11.1k
Forks
1.2k
Merge medio
11 h 20 min
PR fusionados (30 d)
1

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de bellard/quickjs

Todos los issues de bellard/quickjs

Issues similares

Más issues de C

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.