summaryrefslogtreecommitdiff
path: root/runtime/js
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/js')
-rw-r--r--runtime/js/99_main.js16
1 files changed, 14 insertions, 2 deletions
diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js
index 3421528d2..115de4d4d 100644
--- a/runtime/js/99_main.js
+++ b/runtime/js/99_main.js
@@ -602,7 +602,7 @@ delete Intl.v8BreakIterator;
WeakMapPrototypeDelete(pendingRejectionsReasons, promise);
if (!hasPendingException) {
- return;
+ continue;
}
const event = new PromiseRejectionEvent("unhandledrejection", {
@@ -610,9 +610,21 @@ delete Intl.v8BreakIterator;
promise,
reason,
});
+
+ const errorEventCb = (event) => {
+ if (event.error === reason) {
+ core.opSync("op_remove_pending_promise_exception", promise);
+ }
+ };
+ // Add a callback for "error" event - it will be dispatched
+ // if error is thrown during dispatch of "unhandledrejection"
+ // event.
+ globalThis.addEventListener("error", errorEventCb);
globalThis.dispatchEvent(event);
+ globalThis.removeEventListener("error", errorEventCb);
- // If event was not prevented we will let Rust side handle it.
+ // If event was not prevented (or "unhandledrejection" listeners didn't
+ // throw) we will let Rust side handle it.
if (event.defaultPrevented) {
core.opSync("op_remove_pending_promise_exception", promise);
}