From f15059facef066a618eff07b8e2d55f8c7e34cea Mon Sep 17 00:00:00 2001 From: Kai Tamkun Date: Fri, 1 Nov 2024 16:36:01 -0700 Subject: [PATCH] Handle exceptions in NAPI finalizers as uncaught exceptions --- src/bun.js/bindings/napi_finalizer.cpp | 2 +- src/napi/napi.zig | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/bun.js/bindings/napi_finalizer.cpp b/src/bun.js/bindings/napi_finalizer.cpp index bc5b0bfcbd..1e80200a91 100644 --- a/src/bun.js/bindings/napi_finalizer.cpp +++ b/src/bun.js/bindings/napi_finalizer.cpp @@ -11,7 +11,7 @@ void NapiFinalizer::call(napi_env env, void* data) { if (m_callback) { NAPI_LOG_CURRENT_FUNCTION; - napi_enqueue_finalizer(env, this->m_callback, data, this->m_hint); + napi_enqueue_finalizer(env, m_callback, data, m_hint); } } diff --git a/src/napi/napi.zig b/src/napi/napi.zig index 135b2714b3..41de82b410 100644 --- a/src/napi/napi.zig +++ b/src/napi/napi.zig @@ -1434,11 +1434,14 @@ pub const Finalizer = struct { pub const Queue = std.fifo.LinearFifo(Finalizer, .Dynamic); pub fn drain(this: *Finalizer.Queue) void { - while (this.readItem()) |*finalizer| { + while (this.readItem()) |finalizer| { const env = finalizer.env.?; const handle_scope = NapiHandleScope.open(env, false); defer if (handle_scope) |scope| scope.close(env); finalizer.fun.?(env, finalizer.data, finalizer.hint); + if (env.toJS().tryTakeException()) |exception| { + _ = env.toJS().bunVM().uncaughtException(env.toJS(), exception, false); + } } }