diff options
Diffstat (limited to 'src/bun.js/bindings/ZigGlobalObject.cpp')
-rw-r--r-- | src/bun.js/bindings/ZigGlobalObject.cpp | 37 |
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) |