Remove dead code from HTTPParsers, ncrypto, and webcore event bindings - #36426
Conversation
Deletes ~2800 lines of C++ and JS with zero callers anywhere in src/ or
generated code. Verified by rg across src/, build/debug/codegen/, and
src/codegen/, then a full bun bd build.
Whole files removed:
- webcore/ActiveDOMObject.{h,cpp}: every line was a // comment; the 38
#include sites pulled in an empty file (plus one in generate-jssink.ts).
- webcore/EventDispatcher.{h,cpp}: only reference was a FIXME comment.
- webcore/EventModifierInit.h, JSEventModifierInit.{h,cpp}, UIEventInit.h:
a closed dead cluster, only referenced each other.
- ncrpyto_engine.cpp: EnginePointer impl, never instantiated.
- JSVMClientDataClient.h: addClient() was never called so m_clients was
always empty and the willDestroyVM() dispatch ran over nothing.
HTTPParsers.{h,cpp}: Bun only calls isValidHTTPHeaderValue,
isValidHTTPToken, isHTTPSpace, and Bun__writeHTTPDate from this file.
Everything else (parseXSSProtectionHeader, parseXFrameOptionsHeader,
isForbiddenHeaderName, parseRange, extractMIMETypeFromMediaType,
parseHTTPHeader, isCrossOriginSafeRequestHeader, the USE(GLIB) block,
and ~20 more) was WebKit browser machinery with zero Bun callers.
ncrypto.{h,cpp}: removed SSLPointer, SSLCtxPointer, X509Name,
EnginePointer, StackOfX509, SSLSessionPointer classes and their
dependents (X509View::From, X509View::getSubjectName/getIssuerName,
X509Pointer::IssuerFrom/PeerFrom). Bun's TLS goes through usockets
directly; these ncrypto wrappers were never wired up. X509View and
X509Pointer themselves stay (JSX509Certificate uses them).
Smaller items:
- JSBufferEncodingType: validateBufferEncoding<bool>() template + two
specializations, never called.
- BunClientData: removed addClient/m_clients and the empty willDestroyVM
loop in the destructor.
- src/js/node/net.ts: kServerSocket and kpendingRead were write-only
local Symbols (assigned once, never read).
- src/js/node/dgram.ts: removed the commented-out _createSocketHandle
block; the live implementation is in src/js/internal/dgram.ts.
Adds test/internal/source-lints/dead-symbols-httpparsers-ncrypto.test.ts
which asserts none of these reappear via merge or copy-paste.
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughThe change removes obsolete WebCore, ncrypto, binding, buffer-encoding, and Node.js code; updates generated include dependencies; preserves selected translation-unit stubs; and adds source-lint tests preventing deleted symbols from returning. ChangesDead code and dependency pruning
Possibly related PRs
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
Comment |
|
Updated 11:55 PM PT - Jul 30th, 2026
@Jarred-Sumner, your commit 45475c6 is building: |
There was a problem hiding this comment.
No issues found — spot-checked that every removed symbol group (HTTPParsers functions, ncrypto SSL/Engine/X509Name wrappers, validateBufferEncoding, kServerSocket/kpendingRead, the deleted headers) has zero remaining references in src/, and no build-system entries name the deleted .cpp files. Deferring only because ~2.8k lines removed across 59 files (ncrypto, HTTPParsers, JSC bindings) is worth a maintainer glance to confirm none of the ncrypto wrappers were staged for upcoming work.
What was reviewed:
- Re-grepped
src/for each removed symbol class — zero callers; the oneparseRangehit inRangeRequest.rsis a doc comment citing WebKit/spec, not a call. ~JSVMClientDatachange is a no-op:addClient()had no callers som_clientswas always empty.WeakHashSet.hinclude removal fromBunClientData.his safe (no remaining uses).- New source-lint test matches the sibling pattern in
test/internal/source-lints/.
Extended reasoning...
Overview
Pure dead-code removal: +126/-2811 across 59 files. Ten whole files deleted (ActiveDOMObject.{h,cpp} — entirely commented out; EventDispatcher.{h,cpp}; the EventModifierInit/UIEventInit cluster; ncrpyto_engine.cpp; JSVMClientDataClient.h), ~1000 lines stripped from HTTPParsers.{h,cpp}, ~600 lines from ncrypto.{h,cpp}, plus 38 #include "ActiveDOMObject.h" removals, two write-only Symbol()s in net.ts, a commented block in dgram.ts, and the unused validateBufferEncoding template. One new source-lint test guards against reintroduction.
Security risks
None. All changes are subtractive removals of code with zero callers; nothing security-relevant is weakened. The removed HTTPParsers functions (isForbiddenHeaderName, isForbiddenMethod, etc.) were already stubbed to return false/return true and unreferenced — Bun's actual header validation (isValidHTTPHeaderValue, isValidHTTPToken) is untouched. The removed ncrypto SSL wrappers were never wired into Bun's TLS path (which goes through usockets/BoringSSL directly).
Level of scrutiny
Medium. Dead-code removal is low-risk in principle — a truly-used symbol would fail the build — and the PR documents bun bd passing plus targeted smoke tests. I independently re-grepped src/ for each removed symbol group and confirmed zero callers, and confirmed no CMake/build-script entries name the deleted .cpp files (the C++ build globs). The only non-deletion logic change is dropping the m_clients.forEach(willDestroyVM) loop from ~JSVMClientData, which is provably a no-op since addClient() had no callers.
Other factors
Deferring rather than approving because of scale: 59 files across JSC bindings, ncrypto, and HTTP parsing is enough surface that a maintainer should confirm (a) none of the ncrypto SSL/X509Name wrappers were being staged for upcoming Node-compat work, and (b) the new per-PR source-lint reintroduction-guard test is a pattern they want to keep accumulating. The changes themselves look correct.
The previous push crashed test/js/sql/sql-close-pending-connection.test.ts and test/js/sql/sql.test.ts on every CI lane with RELEASE_ASSERT(m_heap.m_mutatorState == MutatorState::Running) during LocalAllocator::allocateSlowCase (allocation during GC sweep). Could not reproduce locally on either debug+asan or release. To isolate, this commit: - Restores net.ts (kServerSocket / kpendingRead) and BunClientData (m_clients / addClient / JSVMClientDataClient.h). These are the only changes that touch runtime behavior; both are tiny. - Keeps ActiveDOMObject.cpp, EventDispatcher.cpp, JSEventModifierInit.cpp, and ncrpyto_engine.cpp as config.h-only stubs instead of deleting them, so the unified-source bundle composition (scripts/build/unified.ts, 32 files per TU in release) does not shift for the other ~300 .cpp files. The headers stay deleted and the HTTPParsers/ncrypto function bodies stay removed; net -2630 lines remains.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/jsc/bindings/ncrpyto_engine.cpp`:
- Around line 1-5: Update the retained empty translation unit in
ncrpyto_engine.cpp to include only config.h, replacing the root.h include.
Preserve the existing stub comments and empty translation-unit behavior without
adding other dependencies.
In `@test/internal/source-lints/dead-symbols-httpparsers-ncrypto.test.ts`:
- Around line 56-63: Update the nonStub filtering logic in the dead-symbol stub
test to allow only the exact permitted config.h include, while still ignoring
comments and blank lines. Ensure any other `#include` directive remains in the
stripped content so the assertion rejects stubs containing additional
dependencies.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 3f771068-391b-4fec-999f-df0517eb95eb
📒 Files selected for processing (5)
src/jsc/bindings/ncrpyto_engine.cppsrc/jsc/bindings/webcore/ActiveDOMObject.cppsrc/jsc/bindings/webcore/EventDispatcher.cppsrc/jsc/bindings/webcore/JSEventModifierInit.cpptest/internal/source-lints/dead-symbols-httpparsers-ncrypto.test.ts
The stub test now only allows exactly '#include "config.h"' plus comments, so an unrelated include cannot slip in unnoticed.
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
test/internal/source-lints/dead-symbols-httpparsers-ncrypto.test.ts (1)
96-108: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winCover alternate deleted-symbol declarations.
These checks only catch
class ...declarations and qualifiedType::...definitions. A deleted wrapper could return as astruct, alias, or self-contained declaration inncrpyto_engine.cppand still pass the lint. Match the relevant symbol declarations/usages so this guard enforces that the wrappers do not reappear.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/internal/source-lints/dead-symbols-httpparsers-ncrypto.test.ts` around lines 96 - 108, Expand the checks array in the dead-symbols test to detect deleted wrapper symbols regardless of declaration form. Cover struct declarations, aliases, standalone declarations, and relevant unqualified usages in ncrypto.h, ncrypto.cpp, and ncrpyto_engine.cpp, while preserving the existing class and qualified-definition checks.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@test/internal/source-lints/dead-symbols-httpparsers-ncrypto.test.ts`:
- Around line 96-108: Expand the checks array in the dead-symbols test to detect
deleted wrapper symbols regardless of declaration form. Cover struct
declarations, aliases, standalone declarations, and relevant unqualified usages
in ncrypto.h, ncrypto.cpp, and ncrpyto_engine.cpp, while preserving the existing
class and qualified-definition checks.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: b5e3589f-5e90-4a2e-854e-a10a337ab8d9
📒 Files selected for processing (2)
src/jsc/bindings/ncrpyto_engine.cpptest/internal/source-lints/dead-symbols-httpparsers-ncrypto.test.ts
There was a problem hiding this comment.
Additional findings (outside current diff — PR may have been updated during review):
-
🟡
src/jsc/bindings/webcore/EventDispatcher.cpp:1-5— GuttingdispatchEventInDOM()/callDefaultEventHandlersInBubblingOrder()removes the only callers ofEventContext::handleLocalEvents()(EventContext.h:62 / EventContext.cpp:43) andNode::defaultEventHandler()(Node.h:52), leaving both orphaned. Per REVIEW.md's "Delete dead code in the same PR that makes it dead — helpers whose last caller you rewired", either delete them here or add the EventContext/Node cascade to the Followups section alongside the ncrypto list.Extended reasoning...
What is orphaned
This PR empties
EventDispatcher.cpp, whosedispatchEventInDOM()was the only caller ofEventContext::handleLocalEvents(), and whosecallDefaultEventHandlersInBubblingOrder()was the only caller ofNode::defaultEventHandler(). After the removal:$ rg -wn 'handleLocalEvents|defaultEventHandler' src/ src/jsc/bindings/webcore/EventContext.h:62: void handleLocalEvents(Event&, EventInvokePhase) const; src/jsc/bindings/webcore/EventContext.cpp:43:void EventContext::handleLocalEvents(...) const src/jsc/bindings/webcore/Node.h:52: void defaultEventHandler(Event&)Only declarations/definitions remain — zero callers.
EventContext/EventPaththemselves stay live (EventTarget.cppconstructs anEventPath,Event.cppcallssetEventPath), so it's specifically these two methods that become dangling.Step-by-step
- Before this PR,
EventDispatcher.cppline ~95 and ~110 calledeventContext.handleLocalEvents(event, ...)(capturing and bubbling passes). Line ~64 and ~72 callednode->defaultEventHandler(event). These were the only call sites of either symbol in the tree. - This PR replaces
EventDispatcher.cppwith a config.h-only stub. rgnow finds no callers for either symbol; both survive only as an unreferenced definition + declaration.
Why this applies
REVIEW.md is explicit: "Delete dead code in the same PR that makes it dead (required scope — name the deletions in the description): … helpers whose last caller you rewired". The PR already applies this rule to itself — it has a Followups section listing deferred ncrypto cascades and calls out other event-related files intentionally left for open PRs (
EventSender.h→ #35775) — but the EventDispatcher → EventContext/Node cascade is neither deleted nor listed.One caveat:
EventDispatcher::dispatchEventitself had no callers before this PR (per the description's ownrg), sohandleLocalEventswas already transitively dead. But from the grep-for-callers methodology this PR uses to verify every other removal, this diff is what strips the last textual reference and leaves the symbol orphaned — the same standard that makes the Followups section worth having.Impact
None at runtime — this is purely a completeness-of-the-dead-code-sweep observation. Nothing breaks; the code just sits uncalled.
Fix
Either of:
- Delete
EventContext::handleLocalEvents(decl + def) andNode::defaultEventHandlerin this PR, or - Add a line to the Followups section noting the EventDispatcher removal orphans
EventContext::handleLocalEvents/Node::defaultEventHandlerfor a follow-up sweep, the way the ncrypto cascade is already recorded.
- Before this PR,
…eRange doc ref ncrypto.h: the OPENSSL_NO_ENGINE-guarded engine.h include was the only consumer of ENGINE* and became dead when EnginePointer was removed. BoringSSL defines OPENSSL_NO_ENGINE so this was already preprocessed away. RangeRequest.rs: the doc comment pointed at HTTPParsers.cpp's parseRange, which this PR removes. The fetch-spec URL on the same line is the durable reference.
The verification harness applies the PR's src/ diff as uncommitted changes and round-trips it with git stash push/pop; the pop does not re-delete files the diff removed. Keeping the headers as #pragma once stubs (the same pattern as MessagePortChannel*.h) makes the diff a modification instead of a delete/add pair, so both the before and after states are exact. Merges the 'deleted headers' and 'emptied .cpp' tests into one stub check that asserts each file contains only its allowed line plus comments.
There was a problem hiding this comment.
Additional findings (outside current diff — PR may have been updated during review):
-
🟡
src/jsc/bindings/ncrypto.h:1067-1074—patches/ncrypto.patch(919 lines) is the reference diff for re-deriving Bun'sncrypto.{h,cpp}from upstream Node ncrypto — it still contains ~40 hunks whose context/changed lines referenceSSLPointer,SSLCtxPointer,X509Name,EnginePointer,X509View::From,X509Pointer::IssuerFrom/PeerFrom(patch lines 206-271, 311, 376-390, 480, 509, 672-765). Applying it to upstream now produces the pre-PR state with the ~600 removed lines resurrected, and the newdead-symbols-httpparsers-ncrypto.test.tswould then fail on them with no obvious cause. The PR's "rg for each removed symbol across src/…: zero hits" sweep did not coverpatches/. Zero build/runtime impact (no build step applies the patch) — regenerate it or delete/mark it stale in this PR.Extended reasoning...
What
patches/ncrypto.patchis a 919-line diff transforming upstream Node.jsdeps/ncrypto/{include/ncrypto.h,ncrypto.cc}into Bun'ssrc/jsc/bindings/ncrypto.{h,cpp}(addingroot.h/WTF includes,WTF_MAKE_TZONE_ALLOCATED,std::string_view→WTF::StringView, etc.).rg 'ncrypto\.patch'across the repo finds nothing — no build step applies it — so it functions as the reference document for re-deriving Bun's copy on the next upstream ncrypto sync.This PR removes
SSLPointer,SSLCtxPointer,X509Name(+X509Name::Iterator),EnginePointer,StackOfX509,SSLSessionPointer,X509View::From,X509View::getSubjectName/getIssuerName, andX509Pointer::IssuerFrom/PeerFromfromncrypto.{h,cpp}, but does not touchpatches/ncrypto.patch. The patch still contains hunks that modify (rather than remove) those classes — e.g. line 216+ WTF_MAKE_TZONE_ALLOCATED(SSLPointer);, line 258+ WTF_MAKE_TZONE_ALLOCATED(X509Name);, lines 376-390EnginePointer::getEngineByNamestd::string_view→WTF::StringView, line 480@@ … X509View X509View::From(const SSLCtxPointer& ctx) {, line 509X509Pointer::PeerFrom(const SSLPointer& ssl), lines 672-765SSLPointer::method conversions.Why the patch was in sync before this PR
git log -- patches/ncrypto.patchandgit log -- src/jsc/bindings/ncrypto.hboth showcb2fd4deas the last commit touching each file before this PR's commits — i.e. the patch was regenerated the last timencrypto.hchanged. This PR is what desyncs it; it is not pre-existing staleness.Why the PR's own verification missed it
The PR description states: "rg for each removed symbol across
src/,build/debug/codegen/,src/codegen/: zero hits outside own definition." That sweep was scoped tosrc/and codegen directories;patches/was not covered.rg -wn 'SSLPointer|X509Name|EnginePointer' patches/returns 30+ hits.Step-by-step consequence
- Next contributor pulls a newer upstream Node ncrypto and follows the existing pattern: apply
patches/ncrypto.patchto it, resolve any rejects, drop the result intosrc/jsc/bindings/. - The patch applies (its context lines match upstream, which still has these classes) and produces a Bun-flavored ncrypto with
SSLPointer,SSLCtxPointer,X509Name,EnginePointer, etc. all present — the pre-PR state plus whatever upstream changed. bun bdbuilds fine (the code was compilable before this PR removed it).test/internal/source-lints/dead-symbols-httpparsers-ncrypto.test.tsfails on\bclass SSLPointer\b,\bclass X509Name\b,\bclass EnginePointer\b, etc. — with no in-tree hint that the patch itself is what resurrected them.
Why existing code doesn't prevent it
The new source-lint test guards
src/jsc/bindings/ncrypto.{h,cpp}but does not checkpatches/. Nothing else in the repo references or validates the patch file.REVIEW.md applicability
- "Delete dead code in the same PR that makes it dead (required scope — name the deletions in the description)": this PR's own removal is what makes those patch hunks dead.
- "One source of truth; update every consumer atomically": the patch is a consumer of
ncrypto.{h,cpp}'s shape.
This is the same finding class as the two existing nit comments on this PR (orphaned
#include <openssl/engine.h>block, orphanedparseRange (HTTPParsers.cpp)doc comment inRangeRequest.rs).Impact
Zero build or runtime impact — the patch is not applied by any build step. This is upgrade-path/reference-document staleness only. Hence nit.
Fix
Either regenerate
patches/ncrypto.patchfrom the post-PRncrypto.{h,cpp}against the upstream base it was originally diffed from, or — if the patch-based re-sync workflow is no longer used — delete the file (or add a header comment marking it stale and pointing at git history). - Next contributor pulls a newer upstream Node ncrypto and follows the existing pattern: apply
It is ~124 lines after this PR, no longer a heavy single-file TU. Keep it in noUnify so removing it from the list does not shift the webcore bundle composition, just move it out of the 'saturates a core' block.
There was a problem hiding this comment.
No new issues found in this pass — the earlier nits (engine.h include, parseRange doc ref, unified.ts categorization) are all addressed, and the deferred <openssl/ssl.h> cleanup is noted in Followups. Leaving this for a human given the scale (~2.8k lines across 57 files) and the un-root-caused CI-only GC assertion described in "Dropped from the original push" — the three reverted groups were bisected as a set rather than narrowed, so it's worth a maintainer confirming that scope is acceptable to defer.
What was reviewed:
- Verified the four surviving HTTPParsers symbols (
isValidHTTPHeaderValue,isValidHTTPToken,isHTTPSpace,Bun__writeHTTPDate) cover all in-tree callers. - Checked the ncrypto removals leave
X509View/X509Pointerintact for JSX509Certificate; no remaining references toSSLPointer/SSLCtxPointer/X509Name/EnginePointeroutside the patch file. - Confirmed the
.cppstubs keepunified.tsbundle composition stable and the.hstubs are#pragma once-only.
Extended reasoning...
Overview
This PR removes ~2,783 lines of dead C++ and TypeScript across 57 files: unused HTTPParsers functions (XSS/CORS/X-Frame-Options browser machinery Bun never calls), ncrypto SSL/Engine/X509Name wrapper classes (Bun's TLS goes through usockets directly), the fully-commented-out ActiveDOMObject.{h,cpp} plus its 38 no-op #include sites, the EventDispatcher/EventModifierInit/UIEventInit dead cluster, an unused validateBufferEncoding template, and a commented-out _createSocketHandle block in dgram.ts. Emptied .cpp files are kept as config.h-only stubs to preserve unified-source bundle composition; emptied .h files as #pragma once stubs. A source-lint test guards against reintroduction.
Security risks
None identified. The ncrypto deletions remove unused TLS wrapper classes; Bun's actual TLS path (usockets/boringssl) is untouched. No auth, permissions, or input-validation code paths are modified — the surviving HTTPParsers functions are unchanged.
Level of scrutiny
High, for two reasons. First, sheer breadth: 57 files across webcore bindings, ncrypto, codegen, and build config — even mechanical deletions at this scale benefit from a maintainer sanity-check that nothing load-bearing was misidentified as dead. Second, and more importantly, the PR description documents that the initial push crashed sql-close-pending-connection.test.ts and sql.test.ts on every CI lane with a RELEASE_ASSERT(m_heap.m_mutatorState == MutatorState::Running) (allocation during GC sweep), not reproducible locally, and was resolved by reverting three deletion groups (kServerSocket/kpendingRead in net.ts, m_clients/JSVMClientDataClient in BunClientData, and outright .cpp deletion) as a set without narrowing which one triggered it. Per REVIEW.md, "the crash goes away" is not a root cause — a maintainer should confirm they're comfortable deferring that bisection to a follow-up.
Other factors
All prior review feedback (mine and CodeRabbit's) has been addressed or explicitly deferred with rationale in the PR body. The build passes on both debug+ASAN and release, smoke tests pass, and the new source-lint test demonstrably fails on main. The comment-cop bot flagged several stub-file comments as too long; those were shortened in cc5ea0f. The one open item — the orphaned <openssl/ssl.h> include — is zero-impact (BoringSSL) and reasonably deferred to the next ncrypto sweep alongside the other ~300 lines of cascaded dead ncrypto listed in Followups.
There was a problem hiding this comment.
No bugs found this run; all four prior nits (engine.h include, parseRange doc-ref, unified.ts categorization, ssl.h include) are addressed or deferred to the Followups list. Deferring to a human on the merge itself given the scope (~2,800 lines removed across 56 files including ncrypto) and the "Dropped from the original push" section — the first push's RELEASE_ASSERT(m_heap.m_mutatorState == MutatorState::Running) crash was cleared by reverting three groups without narrowing which one was the trigger, which is worth a maintainer's eyes before landing.
What was reviewed
- Removed HTTPParsers/ncrypto symbols cross-checked against remaining callers (FetchHeaders, JSCookie, Cookie, ETag.rs, JSX509Certificate) — the four kept functions cover them.
ActiveDOMObject.hwas already 100% comments, so dropping its 38#includelines is definitionally inert.- The stub
.hcomments now reference a "verification harness" that commit 45475c6 deleted — raised by finders and ruled out as cosmetic-only.
Extended reasoning...
Overview
Pure dead-code removal: ~2,783 lines deleted, ~140 added across 56 files. Five dead headers stubbed to #pragma once, four dead .cpp bodies reduced to #include "config.h" (kept as files so unified-source bundle composition stays stable), ~1,000 lines of unused HTTP header parsers stripped from HTTPParsers.{h,cpp}, ~600 lines of unused SSL/Engine/X509Name wrappers stripped from ncrypto.{h,cpp}, 38 no-op #include "ActiveDOMObject.h" lines removed from webcore bindings, plus a commented-out _createSocketHandle block dropped from dgram.ts. Since my last inline comment, one new commit landed (45475c6) deleting the source-lint regression test.
Security risks
None identified. The ncrypto deletions (SSLPointer, SSLCtxPointer, EnginePointer, X509Name, StackOfX509) are RAII wrappers that were never wired into Bun's TLS path (which goes through usockets/boringssl directly). X509View/X509Pointer — the pieces JSX509Certificate actually uses — are untouched. The HTTPParsers deletions remove functions like isForbiddenHeaderName/isForbiddenMethod that were already stubbed to return false and uncalled, so no security check is being removed.
Level of scrutiny
Medium-high. Dead-code removal is normally low-risk, but two things push this above my auto-approve threshold: (1) the diff spans 56 files including crypto-adjacent ncrypto.h and the build system's unified-source config; (2) the PR body documents that the first push crashed test/js/sql/sql*.test.ts on every CI lane with an allocation-during-GC-sweep assert, cleared by reverting three change groups without identifying which one was responsible. Per REVIEW.md's "prove the mechanism, don't correlate — 'the crash goes away' is not a root cause," that's the kind of thing a maintainer should sign off on rather than a bot.
Other factors
All earlier review feedback (comment-cop, coderabbit, my four inline nits) is resolved — the ssl.h orphan was explicitly deferred to the Followups list to avoid another CI cancel, which is reasonable. The source-lint test that verified these symbols don't reappear was deleted in the final commit; the .h stub comments still say "kept for the verification harness," which finders flagged and verifiers ruled out as cosmetic. bun bd builds clean and the listed smoke tests (headers, crypto, x509, cookies, sql) pass on the PR head.
…JSDOMConvert*, rescle, wasi (#36474) Net: **-3673 LOC** (30 files, +177 / -3850). No behavior change. Nothing here overlaps with the other open dead-code PRs (#34965, #34759, #36426, #36178, #36237, #35775, #35559, #36318, #36115, #35437, #35880); every touched file was checked against their file lists. ### SerializedScriptValue.cpp / .h (7239 → 5090, 413 → 202) - All `#if ENABLE(OFFSCREEN_CANVAS_IN_WORKERS)`, `#if ENABLE(WEB_RTC)`, `#if ENABLE(WEB_CODECS)`, `#if ENABLE(PREDEFINED_COLOR_SPACE_DISPLAY_P3)` blocks. Bun's JSCOnly `cmakeconfig.h` sets all four to 0 on every target, and the referenced types (`OffscreenCanvas`, `RTCCertificate`, `DetachedRTCDataChannel`, `WebCodecsVideoFrame`, ...) have no headers anywhere under `src/`, so the guarded bodies could not compile if the macros flipped. - ~1200 lines of long-commented-out serialization paths for DOM geometry (`DOMPoint`/`DOMRect`/`DOMMatrix`/`DOMQuad`), `ImageBitmap`, `File`/`FileList`, `Blob`, `ImageData`, blob-URL/IDB helpers, and alternate ctors. All date to 2022. - Uncalled public methods (`rg` across `src/` and `build/debug/codegen/`): `create(StringView)`, `create(JSContextRef, JSValueRef, JSValueRef*)`, `deserialize(JSContextRef, JSValueRef*)`, `toString()`, `nullValue()`, `wireFormatVersion()`, and the never-instantiated `encode<Encoder>()` / `decode<Decoder>()` templates. Plus their private-only helpers `CloneSerializer::serialize(StringView, Vector<uint8_t>&)`, `CloneDeserializer::deserializeString()`, `blobFilePathForBlobURL()`, `wrapCryptoKey()`, `unwrapCryptoKey()`, `write/read(DestinationColorSpaceTag)`, the `PLATFORM(COCOA)` `CFDataRef` helpers, and the `fillTransferMap(const Vector<Ref<T>>&, ...)` overload. - Orphaned enums `PredefinedColorSpaceTag`, `DestinationColorSpaceTag`, `ImageDataPoolTag`, `m_transferredImageBitmaps`, and 18 `SerializationTag` values that are no longer written or read in live code (`FileTag`, `FileListTag`, `ImageDataTag`, `BlobTag`, `DOMPoint*/Rect*/Matrix*/QuadTag`, `ImageBitmap*Tag`, `OffscreenCanvasTransferTag`, `RTC*Tag`, `WebCodecs*Tag`). The grammar-comment documentation block is kept. Followup note: `m_blobURLs` / `m_blobFilePaths` are now write-only (their sole reader `blobFilePathForBlobURL` is gone), but removing them cascades through the live `CloneDeserializer` ctor params and the public `deserialize(..., blobURLs, blobFilePaths, ...)` overload. Left as-is. ### WebSocket.cpp / .h (-212) - Uncalled `create(ctx, url, protocols, headers, bool)` 5-arg overload and the three `connect(const String&[, ...])` overloads (all `JSWebSocket.cpp` paths use the 2/3/8/9-arg `create` and the 4-arg `connect`). - `didUpdateBufferedAmount(unsigned)`, the decl-only `didReceiveData(const char*, size_t)` and `WebSocket(ScriptExecutionContext&, const String&)`, and the uncalled `offerPerMessageDeflate()` getter. - 2022-era commented-out blocks: CSP/portAllowed, `ResourceLoadObserver`/`MixedContentChecker`, `ENABLE(INTELLIGENT_TRACKING_PREVENTION)`, `contextDestroyed`/`suspend`/`resume`/`stop`/`activeDOMObjectName`, four `ConnectedWebSocketKind::Server` case blocks, and the commented `#include`s. - `m_dispatchedErrorEvent` (only read by the removed `suspend`/`resume` block). ### JSDOMConvert{Sequences,Strings,Record,Union}.h / .cpp (-381) - `NumericSequenceConverter` and the five `SequenceConverter<IDL{Long,Float,UnrestrictedFloat,Double,UnrestrictedDouble}>` specializations. `IDLSequence<T>` is only instantiated with string / enum / interface / dictionary / object element types in Bun (`rg 'IDLSequence<IDL(Long|Float|Double|Unrestricted)' src/ build/debug/codegen/` = 0). - `Converter<IDLFrozenArray<T>>` (only the `JSConverter` side is used), `JSConverter<IDLRecord<K,V>>` (only the `Converter` side is used), and the `IDLAllowSharedAdaptor<IDLUnion<IDLArrayBufferView, IDLArrayBuffer>>` specs (webcrypto uses the un-wrapped union). - `propertyNameToString` / `propertyNameToAtomString`, the `IDLLegacyNullToEmpty{,Atom}StringAdaptor` and `IDLAtomStringAdaptor<IDL{USV,Byte}String>` converters, and `valueToByteAtomString` / `valueToUSVAtomString` (their only callers). ### windows/rescle.cpp / .h (-278) The only entry point `rescle__setWindowsMetadata` (from `src/sys/windows/mod.rs`) uses `Load`, `SetIcon`, `SetVersionString`, `SetFileVersion`, `SetProductVersion`, `Commit`. Removed `SetExecutionLevel`, `IsExecutionLevelSet`, `SetApplicationManifest`, `IsApplicationManifestSet`, `GetVersionString`×2, `ChangeString`×2, `ChangeRcData`, `GetString`×2, `OnEnumResourceManifest` + its `Load()` registration, the now-always-false execution-level and manifest branches in `Commit()`, `ReadFileToString`, the `executionLevel_`/`originalExecutionLevel_`/`applicationManifestPath_`/`manifestString_` members, and five unused `RU_VS_*` macros. Followup note: with `ChangeString`/`ChangeRcData` gone, `stringTableMap_` and `rcDataLngMap_` are now populated by `Load()` and written back unchanged by `Commit()`. That round-trip was already a semantic no-op on `main` (the removed mutators had zero callers there too), but removing it touches a live Windows `bun build --compile` path rather than an unreferenced helper, so it is deferred rather than folded into this sweep. ### Performance.cpp / .h + PerformanceObserver.h (-154) - `addResourceTiming(ResourceTiming&&)` (no callers; Bun's fetch produces `PerformanceResourceTiming` via `queueEntry` directly), `isResourceTimingBufferFull()`, `m_backupResourceTimingBuffer`, `m_waitingForBackupBufferToBeProcessed`. - `allowHighPrecisionTime()` + `highTimePrecision`, `timeResolution()`, `relativeTimeFromTimeOriginInReducedResolution(MonotonicTime)` (no callers). - 2024-era commented-out `navigation()`, `reportFirstContentfulPaint`/`addNavigationTiming`/`navigationFinished`, `resourceTimingBufferFullTimerFired()`. - `PerformanceObserver.h`: `hasNavigationTiming`/`addedNavigationTiming`/`m_hasNavigationTiming` (only referenced from the commented-out code above). ### EventTarget.cpp / .h + EventListenerMap (-51) - `isPaymentRequest()` virtual (no callers, no overriders). - `legacyType(const Event&)` static, which unconditionally returned `nullAtom()` since 2022, and the legacy-fallback block in `fireEventListeners` it made unreachable. - `hasCapturingEventListeners(const AtomString&)` (no callers) and its only callee `EventListenerMap::containsCapturing`. - Decl-only `invalidateJSEventListeners(JSC::JSObject*)`. ### src/js/node/wasi.ts (-280) - The four `exports.X = exports.Y = ... = void 0;` pre-declaration chains (186 LOC). These are tsc emit artifacts from the original `wasi-js` npm bundle; every property is re-assigned to its real value immediately after. - `WASIExitError` / `WASIKillError` classes (the `types` module is only consumed as `types_1.WASIError`). - `exports.SOCKET_DEFAULT_RIGHTS` (written once, never read). - `initWasiFdInfo()` (never called; contains five debug `console.log` calls). - `if (log.enabled) { ... }` blocks and bare `log(...)` / `logOpen(...)` calls (`log` is hard-coded to `() => {}` and never reassigned). ### src/js/thirdparty/ws.js (-19) - Long-commented-out `secWebSocketExtensions` / `PerMessageDeflate` block (May 2023). ### Rust (-22) - `bun_http`: `PRINT_EVERY` / `PRINT_EVERY_I` debug scaffolding and the `if PRINT_EVERY != 0 { ... }` block it made always-dead. - `bun_threading`: drop `GuardedBy`, `RawMutex`, `RwLockReadGuard`, `RwLockWriteGuard` from the crate re-export list (zero `bun_threading::X` references; the backing types stay for `Guarded`'s impl). - `bun_standalone_graph`: `Error::UnsupportedTarget` variant (never constructed; `download_to_path` returns other variants). - `bun_bunfig`: the unused `OfflineMode` re-export. ### Verification - `rg -w <symbol> src/ build/debug/codegen/ src/codegen/` returned only the definition for each deleted item. - `bun bd` builds clean. - `bun run rust:check-all` passes on all 10 targets (linux/macos/windows × x64/aarch64, plus musl). - Smoke tests pass: `structured-clone.test.ts` (231/231), `structuredClone-classes.test.ts`, `worker_threads.test.ts` (91/91), `websocket-client.test.ts`, `abort.test.ts`, `performance-entries.test.ts`, `wasi.test.js`, `deno/event/event-target.test.ts`. - New `test/internal/source-lints/dead-symbols-ssv-wasi-webcore.test.ts` guards against reintroduction: fails (7/7) with `src/` at `main`, passes (7/7) with this diff. <!-- robobun:evidence:begin --> --- **[review]** gate passed · iteration 1 · 30 files touched <details><summary>fails on main (without fix)</summary> ```console ASAN without fix: 7 FAILED $ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/internal/source-lints/dead-symbols-ssv-wasi-webcore.test.ts bun test v1.4.0 (e0122fc) test/internal/source-lints/dead-symbols-ssv-wasi-webcore.test.ts: 47 | ["src/jsc/bindings/webcore/SerializedScriptValue.h", /static Ref<SerializedScriptValue> nullValue\(\)/], 48 | ["src/jsc/bindings/webcore/SerializedScriptValue.h", /static uint32_t wireFormatVersion\(\)/], 49 | ["src/jsc/bindings/webcore/SerializedScriptValue.h", /void encode\(Encoder&\) const/], 50 | ["src/jsc/bindings/webcore/SerializedScriptValue.h", /static RefPtr<SerializedScriptValue> decode\(Decoder&/], 51 | ]; 52 | expect(resurrected(checks)).toEqual([]); ^ error: expect(received).toEqual(expected) - [] + [ + "src/jsc/bindings/webcore/SerializedScriptValue.cpp: ENABLE\(OFFSCREEN_CANVAS_IN_WORKERS\)", + "src/jsc/bindings/webcore/SerializedScriptValue.cpp: ENABLE\(WEB_RTC\)", + "src/jsc/bindings/webcore/SerializedScriptValue.cpp: ENABLE\(WEB_CODECS\)", + "src/jsc/bindings/webcore/SerializedScriptValue.cpp: ... (truncated) release without fix: 7 FAILED bun test v1.4.0-canary.1 (754b4fe) test/internal/source-lints/dead-symbols-ssv-wasi-webcore.test.ts: 47 | ["src/jsc/bindings/webcore/SerializedScriptValue.h", /static Ref<SerializedScriptValue> nullValue\(\)/], 48 | ["src/jsc/bindings/webcore/SerializedScriptValue.h", /static uint32_t wireFormatVersion\(\)/], 49 | ["src/jsc/bindings/webcore/SerializedScriptValue.h", /void encode\(Encoder&\) const/], 50 | ["src/jsc/bindings/webcore/SerializedScriptValue.h", /static RefPtr<SerializedScriptValue> decode\(Decoder&/], 51 | ]; 52 | expect(resurrected(checks)).toEqual([]); ^ error: expect(received).toEqual(expected) - [] + [ + "src/jsc/bindings/webcore/SerializedScriptValue.cpp: ENABLE\(OFFSCREEN_CANVAS_IN_WORKERS\)", + "src/jsc/bindings/webcore/SerializedScriptValue.cpp: ENABLE\(WEB_RTC\)", + "src/jsc/bindings/webcore/SerializedScriptValue.cpp: ENABLE\(WEB_CODECS\)", + "src/jsc/bindings/webcore/SerializedScriptValue.cpp: readRTCCertificate", + "src/jsc/bindings/webcore/SerializedScriptValue.cpp: readOffscreenCanvas", + "src/jsc/bindings/webcore/SerializedScriptValue.cpp: readWebCodecsVideoFrame", + " ... (truncated) ``` </details> <details><summary>passes on PR (with fix)</summary> ```console ASAN with fix: all passed $ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/internal/source-lints/dead-symbols-ssv-wasi-webcore.test.ts bun test v1.4.0 (e0122fc) test/internal/source-lints/dead-symbols-ssv-wasi-webcore.test.ts: (pass) dead SerializedScriptValue ENABLE() blocks and unused public methods do not reappear [71.54ms] (pass) dead WebSocket create/connect overloads and commented-out WebKit blocks do not reappear [23.13ms] (pass) dead Performance/PerformanceObserver/EventTarget members do not reappear [22.29ms] (pass) dead JSDOMConvert* template specializations do not reappear [16.77ms] (pass) dead windows/rescle.cpp resource-editing methods do not reappear [19.33ms] (pass) dead wasi.ts bundle artifacts and debug scaffolding do not reappear [14.77ms] (pass) dead Rust http/threading/standalone_graph/bunfig items do not reappear [8.79ms] 7 pass 0 fail 7 expect() calls Ran 7 tests across 1 file. [2.27s] __F:0:S:0 release with fix: all passed $ bun scripts/build.ts --profile=release [configured] bun-profile → bun (stripped) in 718ms (unchanged) ninja: Entering directory `/workspace/bun/build/release' [1/138] gen ErrorCode+*.h [2/138] gen bake.{client,server,error}.js -> bake.client.js, bake.server.js, bake.error.js [3/138] gen JSEvent.lut.h Generating /workspace/bun/build/release/codegen/JSEvent.lut.h from /workspace/bun/src/jsc/bindings/webcore/JSEvent.cpp [4/138] gen JSBuffer.lut.h Generating /workspace/bun/build/release/codegen/JSBuffer.lut.h from /workspace/bun/src/jsc/bindings/JSBuffer.cpp [5/138] gen cpp.rs (cppbind) [6/138] gen JSSink.{cpp,h,lut.h,rs} generated_jssink.rs: 6 sinks, 72 exported symbols Generating /workspace/bun/build/release/codegen/JSSink.lut.h from /workspace/bun/build/release/codegen/JSSink.lut.txt [7/138] gen generated_host_exports.rs generated_host_exports.rs: 94 exports (host=3, lazy=10, generic=81, rust=0); 239 extern-C blocks audited [8/138] gen JS modules (bundle-modules) Preprocess modules (9054ms) Bundle modules (45ms) Postprocesss modules (217ms) Bundle Functions (732ms) Generate Code (35ms) [10.10s] Bundled "src/js" for production 2561 kb 193 internal modules 1 ... (truncated) ``` </details> <details><summary>diff hotspot</summary> ``` src/bunfig/bunfig.rs | 2 - src/http/lib.rs | 12 - src/js/node/wasi.ts | 282 +-- src/js/thirdparty/ws.js | 19 - src/jsc/bindings/IDLTypes.h | 8 - src/jsc/bindings/webcore/Event.h | 1 - src/jsc/bindings/webcore/EventListenerMap.cpp | 13 - src/jsc/bindings/webcore/EventListenerMap.h | 1 - src/jsc/bindings/webcore/EventTarget.cpp | 29 +- src/jsc/bindings/webcore/EventTarget.h | 9 - src/jsc/bindings/webcore/JSDOMConvertNumbers.h | 30 - src/jsc/bindings/webcore/JSDOMConvertRecord.h | 31 - src/jsc/bindings/webcore/JSDOMConvertSequences.h | 209 -- src/jsc/bindings/webcore/JSDOMConvertStrings.cpp | 25 - src/jsc/bindings/webcore/JSDOMConvertStrings.h | 95 - src/jsc/bindings/webcore/JSDOMConvertUnion.h | 21 - src/jsc/bindings/webcore/Performance.cpp | 165 +- src/jsc/bindings/webcore/Performance.h | 27 +- src/jsc/bindings/webcore/PerformanceObserver.cpp | 2 +- src/jsc/bindings/webcore/PerformanceObserver.h | 4 - src/jsc/bindings/webcore/SerializedScriptValue.cpp | 2163 +------------------- src/jsc/bindings/webcore/SerializedScriptValue.h | 213 +- src/jsc/bindings/webcore/WebSocket.cpp | 197 -- src/jsc/bindings/webcore/WebSocket.h | 15 - src/jsc/bindings/windows/rescle.cpp | 261 --- src/jsc/bindings/windows/rescle.h | 21 - src/standalone_graph/StandaloneModuleGraph.rs | 4 - src/standalone_graph/error.rs | 3 - src/threading/lib.rs | 5 +- .../dead-symbols-ssv-wasi-webcore.test.ts | 160 ++ 30 files changed, 177 insertions(+), 3850 deletions(-) ``` </details> **gate history** · 7 passed · 0 rejected · iteration 1 <details><summary>evidence per changed file</summary> ``` file reads edits tests src/bunfig/bunfig.rs 0 0 0 src/http/lib.rs 0 0 0 src/js/node/wasi.ts 0 0 0 src/js/thirdparty/ws.js 0 0 0 src/jsc/bindings/IDLTypes.h 1 1 0 src/jsc/bindings/webcore/Event.h 1 1 0 src/jsc/bindings/webcore/EventListenerMap.cpp 1 1 0 src/jsc/bindings/webcore/EventListenerMap.h 1 1 0 src/jsc/bindings/webcore/EventTarget.cpp 0 0 0 src/jsc/bindings/webcore/EventTarget.h 0 0 0 src/jsc/bindings/webcore/JSDOMConvertNumbers.h 2 1 0 src/jsc/bindings/webcore/JSDOMConvertRecord.h 0 0 0 src/jsc/bindings/webcore/JSDOMConvertSequences.h 0 0 0 src/jsc/bindings/webcore/JSDOMConvertStrings.cpp 0 0 0 src/jsc/bindings/webcore/JSDOMConvertStrings.h 0 0 0 src/jsc/bindings/webcore/JSDOMConvertUnion.h 0 0 0 (+ 14 more files) ``` </details> <!-- robobun:evidence:end --> --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Net: +140 / -2783 lines across 55 files.
What changed
Dead headers removed (5 files)
src/jsc/bindings/webcore/ActiveDOMObject.h(170 lines): every line was a//comment; the 38#include "ActiveDOMObject.h"sites (plus one insrc/codegen/generate-jssink.ts) pulled in nothing. All include lines removed.src/jsc/bindings/webcore/EventDispatcher.h(41 lines):rg -wn EventDispatcher src/ build/debug/codegen/finds only a code comment in EventTarget.cpp and an unrelated WebKitRemoteLayerTreeEventDispatchermention.src/jsc/bindings/webcore/{EventModifierInit.h,JSEventModifierInit.h,UIEventInit.h}(125 lines): a closed dead cluster;convertDictionary<EventModifierInit>is never called and the files only reference each other.Dead .cpp bodies emptied (4 files, ~700 lines removed)
ActiveDOMObject.cpp,EventDispatcher.cpp,JSEventModifierInit.cpp,ncrpyto_engine.cppreduced to#include "config.h"only. Kept as files soscripts/build/unified.tsbundle composition (32 .cpp per TU in release) stays stable for the other ~300 files in those directories.HTTPParsers.{h,cpp}(~1012 lines removed)Bun only calls
isValidHTTPHeaderValue,isValidHTTPToken,isHTTPSpace, andBun__writeHTTPDatefrom this file (callers: FetchHeaders.cpp, JSCookie.cpp, Cookie.cpp, andsrc/http_types/ETag.rs). Removed:isValidReasonPhrase,isValidAcceptHeaderValue,isValidLanguageHeaderValue,isValidUserAgentHeaderValue(+ the entire#if USE(GLIB)block;USE(GLIB)is never defined in Bun),parseHTTPDate,filenameFromHTTPContentDisposition,extractMIMETypeFromMediaType,extractCharsetFromMediaType,parseXSSProtectionHeader,extractReasonPhraseFromHTTPStatusLine,parseXFrameOptionsHeader,parseStructuredFieldValue,parseRange(both overloads),parseContentTypeOptionsHeader,parseHTTPHeader,parseHTTPRequestBody,isForbiddenHeaderName,isForbiddenHeader,isNoCORSSafelistedRequestHeaderName,isPriviledgedNoCORSRequestHeaderName,isForbiddenResponseHeaderName,isForbiddenMethod,isSimpleHeader,isCrossOriginSafeRequestHeader,normalizeHTTPMethod,isSafeMethod,parseCrossOriginResourcePolicyHeader, their 7 static helpers (skipWhile,skipWhiteSpace,skipToken,skipEquals,skipValue,trimInputSample,isValidHeaderNameCharacter), and the 6 enum types that only those functions use (XSSProtectionDisposition,ContentTypeOptionsDisposition,XFrameOptionsDisposition,CrossOriginResourcePolicy,RangeAllowWhitespace,HTTPHeaderSet).ncrypto.{h,cpp}(~609 lines removed)Removed
SSLPointer,SSLCtxPointer,X509Name(+X509Name::Iterator),EnginePointer,StackOfX509/StackOfX509Deleter,SSLSessionPointer, and their dependents (X509View::From(SSLPointer/SSLCtxPointer),X509View::getSubjectName/getIssuerName,X509Pointer::IssuerFromboth overloads,X509Pointer::PeerFrom).rg -wn 'SSLPointer|SSLCtxPointer|EnginePointer|X509Name\b|StackOfX509' src/ build/debug/codegen/outside ncrypto itself finds nothing. Bun's TLS goes through usockets/boringssl directly; these ncrypto wrappers were never wired up.X509ViewandX509Pointerthemselves stay (JSX509Certificate uses them).Smaller items
JSBufferEncodingType.{h,cpp}:validateBufferEncoding<bool>()template + two explicit specializations, never called (rg -wn validateBufferEncoding src/ build/debug/codegen/finds only the definitions).src/js/node/dgram.ts: removed the commented-out_createSocketHandleblock; the live implementation is insrc/js/internal/dgram.tsand is whatinternal/cluster/SharedHandle.tsimports.Verification
rgfor each removed symbol acrosssrc/,build/debug/codegen/,src/codegen/: zero hits outside own definition.bun bd: builds clean.test/js/web/fetch/headers.test.ts,test/js/node/crypto/crypto.test.ts,test/js/node/crypto/x509.test.ts,test/js/bun/http/bun-serve-cookies.test.ts,test/js/sql/sql-close-pending-connection.test.ts.test/internal/source-lints/dead-symbols-httpparsers-ncrypto.test.tsasserts the removed symbols/files do not reappear.Dropped from the original push after CI bisection
The first push also removed
kServerSocket/kpendingReadfromsrc/js/node/net.ts, removedm_clients/addClient/JSVMClientDataClientfromBunClientData, and deleted the four .cpp files outright. That build crashedtest/js/sql/sql-close-pending-connection.test.tsandtest/js/sql/sql.test.tson every CI lane withRELEASE_ASSERT(m_heap.m_mutatorState == MutatorState::Running)(allocation during GC sweep), not reproducible locally on debug+asan or release. Reverting those three groups clears it; narrowing which one is the trigger is left for a follow-up since each is ~10 lines.Followups (not in this diff)
patches/ncrypto.patch(the reference diff for re-deriving ncrypto.{h,cpp} from upstream Node ncrypto) still contains hunks for SSLPointer/SSLCtxPointer/X509Name/EnginePointer; it is not applied by any build step, so it needs regenerating on the next upstream sync.Emptying
EventDispatcher.cpporphansEventContext::handleLocalEvents()(EventContext.h:62 / .cpp:43) andNode::defaultEventHandler()(Node.h:52); left for a follow-up sweep alongside the rest of the Event*/EventPath cascade rather than widening this diff mid-CI-bisection.More dead ncrypto found but left for a focused PR:
#include <openssl/ssl.h>at ncrypto.h:23 (orphaned by the SSLPointer/SSLCtxPointer removal, same class as the engine.h include dropped here),setFipsEnabled/testFipsEnabled,hashDigest,checkScryptParams/scrypt/pbkdf2,Cipher::ForEach,Rsa::encrypt/decrypt, the unusedCipher::AES_*_CTR/GCM/KWgetters,DataPointer::TryInitSecureHeap/SecureAlloc/GetSecureHeapUsed,EVPKeyCtxPointer::setRsaImplicitRejection/publicCheck/privateCheck,X509View::enumUsages/ifRsa/ifEc,X509Pointer::ErrorReason,BIOPointer::NewSecMem/NewFile/NewFp,BignumPointer::NewSub/NewLShift(~300 lines).Also found but overlap with open dead-code PRs so left alone:
headers-cpp.h/sizegen.cpp(tangled with #36115),objects.h/TextCodecASCIIFastPath.h/ZigLazyStaticFunctions*.h(#35437),JSCInlines.h(#36237),EventSender.h(#35775).[review] gate passed · iteration 2 · 57 files touched
fails on main (without fix)
passes on PR (with fix)
diff hotspot
gate history · 1 passed · 2 rejected · iteration 2
evidence per changed file