From 64b7e4374ab06c337feb8771bfac2f5d27e3d699 Mon Sep 17 00:00:00 2001 From: robobun <117481402+robobun@users.noreply.github.com> Date: Sat, 25 Jul 2026 14:28:50 +0000 Subject: [PATCH] Treat SourceProviderSourceType::BunTranspiledModule as Module in debugger/inspector/cache/completion switches oven-sh/WebKit#73 added SourceProviderSourceType::BunTranspiledModule so Bun can attach a pre-computed module record to a SourceProvider and skip JSC's analyze-phase re-parse. Four sites that branch on the provider's sourceType() were left matching only ::Module, so a BunTranspiledModule provider falls through: - debugger/DebuggerParseData.cpp gatherDebuggerParseDataForSource: falls to the default:false arm, Debugger::resolveBreakpoint gets empty pause positions, and Debugger.setBreakpoint replies "Could not resolve breakpoint" for every line in the script. - inspector/agents/InspectorDebuggerAgent.cpp didParseSource: Debugger.scriptParsed reports module:false instead of true. - runtime/CachedTypes.cpp CachedSourceProvider encode/decode: would RELEASE_ASSERT_NOT_REACHED() if JSC bytecode caching encoded one of these providers. - runtime/Completion.cpp getSourceType: returns ScriptFetchParameters::Type::None instead of JavaScript. Currently reachable in Bun via `bun test --isolate` and `--compile` standalone executables; oven-sh/bun#35605 would route every runtime ESM provider through this type and is blocked on this. Each site adds a BUN_JSC_ADDITIONS-gated case that falls through to the Module arm. --- Source/JavaScriptCore/debugger/DebuggerParseData.cpp | 3 +++ .../inspector/agents/InspectorDebuggerAgent.cpp | 8 +++++++- Source/JavaScriptCore/runtime/CachedTypes.cpp | 6 ++++++ Source/JavaScriptCore/runtime/Completion.cpp | 3 +++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Source/JavaScriptCore/debugger/DebuggerParseData.cpp b/Source/JavaScriptCore/debugger/DebuggerParseData.cpp index 1a8ac9b9d4a40..6f4d06dfcae21 100644 --- a/Source/JavaScriptCore/debugger/DebuggerParseData.cpp +++ b/Source/JavaScriptCore/debugger/DebuggerParseData.cpp @@ -201,6 +201,9 @@ bool gatherDebuggerParseDataForSource(VM& vm, SourceProvider* provider, Debugger case SourceProviderSourceType::Program: return gatherDebuggerParseData(vm, completeSource, debuggerParseData); case SourceProviderSourceType::Module: +#if USE(BUN_JSC_ADDITIONS) + case SourceProviderSourceType::BunTranspiledModule: +#endif return gatherDebuggerParseData(vm, completeSource, debuggerParseData); default: return false; diff --git a/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp b/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp index fc9b326884b6d..c0463450b8672 100644 --- a/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp +++ b/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp @@ -1822,7 +1822,13 @@ void InspectorDebuggerAgent::didParseSource(JSC::SourceID sourceID, const JSC::D String sourceURL = script.sourceURL; String sourceMappingURL = sourceMapURLForScript(script); - m_frontendDispatcher->scriptParsed(scriptIDStr, script.url, script.startLine, script.startColumn, script.endLine, script.endColumn, script.isContentScript, sourceURL, sourceMappingURL, script.sourceProvider->sourceType() == JSC::SourceProviderSourceType::Module); + const auto providerSourceType = script.sourceProvider->sourceType(); + const bool isModule = providerSourceType == JSC::SourceProviderSourceType::Module +#if USE(BUN_JSC_ADDITIONS) + || providerSourceType == JSC::SourceProviderSourceType::BunTranspiledModule +#endif + ; + m_frontendDispatcher->scriptParsed(scriptIDStr, script.url, script.startLine, script.startColumn, script.endLine, script.endColumn, script.isContentScript, sourceURL, sourceMappingURL, isModule); m_scripts.set(sourceID, script); diff --git a/Source/JavaScriptCore/runtime/CachedTypes.cpp b/Source/JavaScriptCore/runtime/CachedTypes.cpp index a9afda484de10..c241f07cd645a 100644 --- a/Source/JavaScriptCore/runtime/CachedTypes.cpp +++ b/Source/JavaScriptCore/runtime/CachedTypes.cpp @@ -1744,6 +1744,9 @@ class CachedSourceProvider : public VariableLengthObject { switch (m_sourceType) { case SourceProviderSourceType::Program: case SourceProviderSourceType::Module: +#if USE(BUN_JSC_ADDITIONS) + case SourceProviderSourceType::BunTranspiledModule: +#endif this->allocate(encoder)->encode(encoder, reinterpret_cast(sourceProvider)); break; #if ENABLE(WEBASSEMBLY) @@ -1761,6 +1764,9 @@ class CachedSourceProvider : public VariableLengthObject { switch (m_sourceType) { case SourceProviderSourceType::Program: case SourceProviderSourceType::Module: +#if USE(BUN_JSC_ADDITIONS) + case SourceProviderSourceType::BunTranspiledModule: +#endif return this->buffer()->decode(decoder, m_sourceType); #if ENABLE(WEBASSEMBLY) case SourceProviderSourceType::WebAssembly: diff --git a/Source/JavaScriptCore/runtime/Completion.cpp b/Source/JavaScriptCore/runtime/Completion.cpp index 3791b827dc115..fd8ce8fb6b8b6 100644 --- a/Source/JavaScriptCore/runtime/Completion.cpp +++ b/Source/JavaScriptCore/runtime/Completion.cpp @@ -206,6 +206,9 @@ static ScriptFetchParameters::Type getSourceType(const SourceCode& source) case SourceProviderSourceType::WebAssembly: return ScriptFetchParameters::Type::WebAssembly; case SourceProviderSourceType::Module: +#if USE(BUN_JSC_ADDITIONS) + case SourceProviderSourceType::BunTranspiledModule: +#endif return ScriptFetchParameters::Type::JavaScript; default: return ScriptFetchParameters::Type::None;