From db0de2373773997f85cd4d27dfb97024940f7655 Mon Sep 17 00:00:00 2001 From: Alistair Smith Date: Tue, 3 Jun 2025 13:41:44 -0700 Subject: [PATCH] addressing some pr feedback --- src/bun.js/bindings/ScriptExecutionContext.cpp | 12 ++++++------ src/bun.js/bindings/webcore/MessagePort.cpp | 2 +- src/bun.js/event_loop.zig | 10 ++++++++++ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/bun.js/bindings/ScriptExecutionContext.cpp b/src/bun.js/bindings/ScriptExecutionContext.cpp index 169555b711..cefd07af6a 100644 --- a/src/bun.js/bindings/ScriptExecutionContext.cpp +++ b/src/bun.js/bindings/ScriptExecutionContext.cpp @@ -369,34 +369,34 @@ ScriptExecutionContext* executionContext(JSC::JSGlobalObject* globalObject) void ScriptExecutionContext::postTaskConcurrently(Function&& lambda) { auto* task = new EventLoopTask(WTFMove(lambda)); - reinterpret_cast(m_globalObject)->queueTaskConcurrently(task); + static_cast(m_globalObject)->queueTaskConcurrently(task); } // Executes the task on context's thread asynchronously. void ScriptExecutionContext::postTask(Function&& lambda) { auto* task = new EventLoopTask(WTFMove(lambda)); - reinterpret_cast(m_globalObject)->queueTask(task); + static_cast(m_globalObject)->queueTask(task); } // Executes the task on context's thread asynchronously. void ScriptExecutionContext::postTask(EventLoopTask* task) { - reinterpret_cast(m_globalObject)->queueTask(task); + static_cast(m_globalObject)->queueTask(task); } // Executes the task on context's thread immediately. void ScriptExecutionContext::postImmediateCppTask(Function&& lambda) { auto* task = new EventLoopTask(WTFMove(lambda)); - reinterpret_cast(m_globalObject)->queueImmediateCppTask(task); + static_cast(m_globalObject)->queueImmediateCppTask(task); } // Executes the task on context's thread immediately. void ScriptExecutionContext::postImmediateCppTask(EventLoopTask* task) { - reinterpret_cast(m_globalObject)->queueImmediateCppTask(task); + static_cast(m_globalObject)->queueImmediateCppTask(task); } // Executes the task on context's thread asynchronously. void ScriptExecutionContext::postTaskOnTimeout(EventLoopTask* task, Seconds timeout) { - reinterpret_cast(m_globalObject)->queueTaskOnTimeout(task, static_cast(timeout.milliseconds())); + static_cast(m_globalObject)->queueTaskOnTimeout(task, static_cast(timeout.milliseconds())); } // Executes the task on context's thread asynchronously. void ScriptExecutionContext::postTaskOnTimeout(Function&& lambda, Seconds timeout) diff --git a/src/bun.js/bindings/webcore/MessagePort.cpp b/src/bun.js/bindings/webcore/MessagePort.cpp index b5031b8a1a..dc8eafe70f 100644 --- a/src/bun.js/bindings/webcore/MessagePort.cpp +++ b/src/bun.js/bindings/webcore/MessagePort.cpp @@ -313,7 +313,7 @@ void MessagePort::dispatchMessages() auto messagesTakenHandler = [this, protectedThis = Ref { *this }](Vector&& messages, CompletionHandler&& completionCallback) mutable { RefPtr context = scriptExecutionContext(); if (!context || !context->globalObject()) { - WTFMove(completionCallback)(); + completionCallback(); return; } diff --git a/src/bun.js/event_loop.zig b/src/bun.js/event_loop.zig index 55da2d2517..ac04495f15 100644 --- a/src/bun.js/event_loop.zig +++ b/src/bun.js/event_loop.zig @@ -119,6 +119,16 @@ const DrainMicrotasksResult = enum(u8) { extern fn JSC__JSGlobalObject__drainMicrotasks(*jsc.JSGlobalObject) DrainMicrotasksResult; pub fn drainMicrotasksWithGlobal(this: *EventLoop, globalObject: *jsc.JSGlobalObject, jsc_vm: *jsc.VM) bun.JSExecutionTerminated!void { jsc.markBinding(@src()); + + // this exists because while we're inside a spawnSync call, some tasks can actually + // still complete which leads to a case where module resolution can partially complete and + // some modules are only partially evaluated which causes reference errors. + // TODO: A better fix here could be a second event loop so we can come off the main one + // while processing spawnSync, then resume back to here afterwards + if (this.is_inside_spawn_sync) { + return; + } + jsc_vm.releaseWeakRefs(); switch (JSC__JSGlobalObject__drainMicrotasks(globalObject)) {