From 654c569498a5e895ec09b7ec3926bd5f64515550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Fri, 22 May 2026 12:05:36 +0200 Subject: [PATCH 1/2] Walk the cause chain when dumping uncaught errors --- quickjs-libc.c | 51 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/quickjs-libc.c b/quickjs-libc.c index 56c38453b..8ba8a6dbf 100644 --- a/quickjs-libc.c +++ b/quickjs-libc.c @@ -4720,22 +4720,49 @@ static void js_dump_obj(JSContext *ctx, FILE *f, JSValueConst val) } } +#define JS_DUMP_ERROR_MAX_CAUSE_DEPTH 10 + static void js_std_dump_error1(JSContext *ctx, JSValueConst exception_val) { - JSValue val; + JSValue val, current; bool is_error; - - is_error = JS_IsError(exception_val); - js_dump_obj(ctx, stderr, exception_val); - if (is_error) { - val = JS_GetPropertyStr(ctx, exception_val, "stack"); - } else { - js_std_cmd(/*ErrorBackTrace*/2, ctx, &val); - } - if (!JS_IsUndefined(val)) { - js_dump_obj(ctx, stderr, val); - JS_FreeValue(ctx, val); + int depth; + + current = JS_DupValue(ctx, exception_val); + for (depth = 0; ; depth++) { + is_error = JS_IsError(current); + js_dump_obj(ctx, stderr, current); + if (is_error) { + val = JS_GetPropertyStr(ctx, current, "stack"); + if (JS_IsException(val)) { + JS_FreeValue(ctx, JS_GetException(ctx)); + val = JS_UNDEFINED; + } + } else if (depth == 0) { + js_std_cmd(/*ErrorBackTrace*/2, ctx, &val); + } else { + val = JS_UNDEFINED; + } + if (!JS_IsUndefined(val)) { + js_dump_obj(ctx, stderr, val); + JS_FreeValue(ctx, val); + } + if (!is_error || depth >= JS_DUMP_ERROR_MAX_CAUSE_DEPTH) + break; + val = JS_GetPropertyStr(ctx, current, "cause"); + if (JS_IsException(val)) { + JS_FreeValue(ctx, JS_GetException(ctx)); + break; + } + if (JS_IsUndefined(val)) { + JS_FreeValue(ctx, val); + break; + } + fputs("Caused by: ", stderr); + JS_FreeValue(ctx, current); + current = val; } + JS_FreeValue(ctx, current); } void js_std_dump_error(JSContext *ctx) From fc3e1ea6738e674f30c07a91db9280cbc26c178f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Sun, 24 May 2026 22:58:23 +0200 Subject: [PATCH 2/2] fixup! --- quickjs-libc.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/quickjs-libc.c b/quickjs-libc.c index 8ba8a6dbf..6926733e0 100644 --- a/quickjs-libc.c +++ b/quickjs-libc.c @@ -4734,10 +4734,6 @@ static void js_std_dump_error1(JSContext *ctx, JSValueConst exception_val) js_dump_obj(ctx, stderr, current); if (is_error) { val = JS_GetPropertyStr(ctx, current, "stack"); - if (JS_IsException(val)) { - JS_FreeValue(ctx, JS_GetException(ctx)); - val = JS_UNDEFINED; - } } else if (depth == 0) { js_std_cmd(/*ErrorBackTrace*/2, ctx, &val); } else { @@ -4750,10 +4746,6 @@ static void js_std_dump_error1(JSContext *ctx, JSValueConst exception_val) if (!is_error || depth >= JS_DUMP_ERROR_MAX_CAUSE_DEPTH) break; val = JS_GetPropertyStr(ctx, current, "cause"); - if (JS_IsException(val)) { - JS_FreeValue(ctx, JS_GetException(ctx)); - break; - } if (JS_IsUndefined(val)) { JS_FreeValue(ctx, val); break;