From 4e464a4a4e2b9ec111ae7a6e8439be7c853a71cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Isager=20Dalsgar=C3=B0?= Date: Tue, 19 Mar 2024 12:07:42 +0100 Subject: [PATCH] Re-throw any outer error on module promise rejection --- binding.c | 18 +++++++++--------- index.js | 2 +- test.js | 2 ++ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/binding.c b/binding.c index 2919d98..7ea9a69 100644 --- a/binding.c +++ b/binding.c @@ -461,22 +461,22 @@ bare_module_run_module (js_env_t *env, js_callback_info_t *info) { err = js_instantiate_module(env, module, on_static_import, (void *) context); if (err < 0) return NULL; - js_value_t *result; - err = js_run_module(env, module, &result); + js_value_t *promise; + err = js_run_module(env, module, &promise); if (err < 0) return NULL; bool is_promise; - err = js_is_promise(env, result, &is_promise); + err = js_is_promise(env, promise, &is_promise); assert(err == 0); if (is_promise) { js_promise_state_t state; - err = js_get_promise_state(env, result, &state); + err = js_get_promise_state(env, promise, &state); assert(err == 0); if (state == js_promise_rejected) { - js_value_t *error; - err = js_get_promise_result(env, result, &error); + js_value_t *reason; + err = js_get_promise_result(env, promise, &reason); if (err < 0) return NULL; js_value_t *exception; @@ -487,15 +487,15 @@ bare_module_run_module (js_env_t *env, js_callback_info_t *info) { err = js_get_reference_value(env, context->ctx, &ctx); assert(err == 0); - js_value_t *args[2] = {result, error}; + js_value_t *args[3] = {reason, promise, exception}; - js_call_function(env, ctx, argv[2], 2, args, NULL); + js_call_function(env, ctx, argv[2], 3, args, NULL); return NULL; } } - return result; + return promise; } static js_value_t * diff --git a/index.js b/index.js index 786da0e..b9cd7ff 100644 --- a/index.js +++ b/index.js @@ -343,7 +343,7 @@ const Module = module.exports = exports = class Module { } } - static _onrejection (promise, err) { + static _onrejection (reason, promise, err = reason) { promise.catch(() => {}) // Don't leak the rejection throw err diff --git a/test.js b/test.js index e0ccc1d..46a57ec 100644 --- a/test.js +++ b/test.js @@ -2065,6 +2065,7 @@ test('type error in .cjs imported from .mjs with type error', (t) => { t.fail() } catch (err) { t.comment(err.message) + t.ok(/reading 'bar'/i.test(err.message)) } }) @@ -2172,6 +2173,7 @@ test('type error in .mjs imported from .mjs with type error', (t) => { t.fail() } catch (err) { t.comment(err.message) + t.ok(/reading 'bar'/i.test(err.message)) } })