await bypasses catch when PromiseResolve throws
I maintainer di solito rispondono entro 3 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 76/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- c, javascript
- Ambito
- compilers
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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;
+ }
- Lingua principale
- C
- Stelle
- 11.1k
- Fork
- 1.2k
- Merge medio
- 11h 20m
- PR unite (30g)
- 1
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di bellard/quickjs
-
Collecting WeakMap keys requires multiple GC passesForse già presa @jluxenberg l’ha presa 4 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
bellard/quickjs#581 · 2 commenti ·
I maintainer di solito rispondono entro 3 giorni
-
Difficoltà 4/5 1-2 giorni Idoneità per principianti 48/100
I maintainer di solito rispondono entro 3 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 58/100
bellard/quickjs#575 · 1 commento ·
I maintainer di solito rispondono entro 3 giorni
-
Update to Unicode 18.0.0Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 50/100
bellard/quickjs#559 · 2 commenti ·
I maintainer di solito rispondono entro 3 giorni
-
Security findings: BigInt interrupt-bypass CPU DoS (verified) and 5 other issues — commit 04be246Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 28/100
I maintainer di solito rispondono entro 3 giorni
Tutte le issue di bellard/quickjs
Issue simili
-
BUG: `tandg` and `cotdg` lose precision near their poles, `fresnel` is NaN for `|x| >= 2^512`Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 79/100
I maintainer di solito rispondono entro 2 giorni
-
BUG: linalg.bandwidth: misses the upper band in a wide matrix's last rowForse già presa @ilayn l’ha presa 205 giorni fa. Apertadefect scipy.linalg
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
scipy/scipy#26579 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
I maintainer di solito rispondono entro 1 giorno
-
[libcamera] update to 0.7.2Apertacategory:port-update
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
microsoft/vcpkg#54804 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni