aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/ZigGlobalObject.cpp
diff options
context:
space:
mode:
authorGravatar Zilin Zhu <zhuzilinallen@gmail.com> 2022-08-09 01:58:00 +0800
committerGravatar GitHub <noreply@github.com> 2022-08-08 10:58:00 -0700
commit02644ab65a65cdc30d8da68649885b06ca803cb2 (patch)
tree56679304b1d5b21287debe1f13b71e2602ee3b28 /src/bun.js/bindings/ZigGlobalObject.cpp
parent98c2d20ab0168218d66bde4ef0afb80700f9373b (diff)
downloadbun-02644ab65a65cdc30d8da68649885b06ca803cb2.tar.gz
bun-02644ab65a65cdc30d8da68649885b06ca803cb2.tar.zst
bun-02644ab65a65cdc30d8da68649885b06ca803cb2.zip
Raise error on unhandled rejected promises (#1010)
* deal with unhandled rejected promise * use Vector<Strong<JSPromise>> to store rejected promises
Diffstat (limited to 'src/bun.js/bindings/ZigGlobalObject.cpp')
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.cpp37
1 files changed, 33 insertions, 4 deletions
diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp
index 5b8e057f9..daf6d3f14 100644
--- a/src/bun.js/bindings/ZigGlobalObject.cpp
+++ b/src/bun.js/bindings/ZigGlobalObject.cpp
@@ -361,11 +361,24 @@ void GlobalObject::reportUncaughtExceptionAtEventLoop(JSGlobalObject* globalObje
Zig__GlobalObject__reportUncaughtException(globalObject, exception);
}
-void GlobalObject::promiseRejectionTracker(JSGlobalObject* obj, JSC::JSPromise* prom,
- JSC::JSPromiseRejectionOperation reject)
+void GlobalObject::promiseRejectionTracker(JSGlobalObject* obj, JSC::JSPromise* promise,
+ JSC::JSPromiseRejectionOperation operation)
{
- Zig__GlobalObject__promiseRejectionTracker(
- obj, prom, reject == JSC::JSPromiseRejectionOperation::Reject ? 0 : 1);
+ // Zig__GlobalObject__promiseRejectionTracker(
+ // obj, prom, reject == JSC::JSPromiseRejectionOperation::Reject ? 0 : 1);
+
+ // Do this in C++ for now
+ auto* globalObj = reinterpret_cast<GlobalObject*>(obj);
+ switch (operation) {
+ case JSPromiseRejectionOperation::Reject:
+ globalObj->m_aboutToBeNotifiedRejectedPromises.append(JSC::Strong<JSPromise>(obj->vm(), promise));
+ break;
+ case JSPromiseRejectionOperation::Handle:
+ globalObj->m_aboutToBeNotifiedRejectedPromises.removeFirstMatching([&] (Strong<JSPromise>& unhandledPromise) {
+ return unhandledPromise.get() == promise;
+ });
+ break;
+ }
}
static Zig::ConsoleClient* m_console;
@@ -2235,6 +2248,22 @@ void GlobalObject::queueTask(WebCore::EventLoopTask* task)
Bun__queueMicrotask(this, task);
}
+extern "C" void Bun__handleRejectedPromise(Zig::GlobalObject* JSGlobalObject, JSC::JSPromise* promise);
+
+void GlobalObject::handleRejectedPromises()
+{
+ JSC::VM& virtual_machine = vm();
+ do {
+ auto unhandledRejections = WTFMove(m_aboutToBeNotifiedRejectedPromises);
+ for (auto& promise : unhandledRejections) {
+ if (promise->isHandled(virtual_machine))
+ continue;
+
+ Bun__handleRejectedPromise(this, promise.get());
+ }
+ } while (!m_aboutToBeNotifiedRejectedPromises.isEmpty());
+}
+
DEFINE_VISIT_CHILDREN(GlobalObject);
// void GlobalObject::destroy(JSCell* cell)