Skip to content

Remove dead code from simdutf, ncrypto, uws shims, and JSC/WebCore bindings - #38439

Closed
robobun wants to merge 1 commit into
mainfrom
claude/farm/44da3edf/dead-code-simdutf-idl-ncrypto-misc
Closed

robobun wants to merge 1 commit into
mainfrom
claude/farm/44da3edf/dead-code-simdutf-idl-ncrypto-misc

Conversation

@robobun

@robobun robobun commented Aug 14, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

  • src/: 69 files, +21 / -1252 (net -1231, after rebasing past Remove dead code from libuv_sys, cares_sys, simdutf FFI, test_runner, and C++ bindings #37332 and the other sweeps that landed), plus a new source lint under test/. Everything removed is unreferenced: the workspace already denies dead_code, so what is left is pub Rust items no crate uses, C++ functions declared in headers that nothing calls, and C ABI shims whose only Rust callers were themselves uncalled wrappers.
  • How the candidates were found: the debug build was relinked with --gc-sections --print-gc-sections, which lists every function the linker could drop as unreachable. Each candidate was then checked textually (rg across src/, scripts/, test/ and the regenerated build/debug/codegen/), checked for platform-gated callers (#[cfg(windows)], #if OS(DARWIN), macOS-only callers of Bun__noOrphans_*, lldb-rooted dumpBtjsTrace, etc. were all kept), and checked at the object level (no other .o in the build mentions the mangled name). Items removed by any of the currently open dead-code PRs were skipped.

Fix

Removed, grouped by area:

simdutf (src/simdutf_sys, ~370 lines)

  • 16 big-endian / UTF-32 conversion shims in bun-simdutf.cpp (simdutf__convert_utf8_to_utf16be, ..._utf16be_to_utf8_with_errors, ..._valid_utf32_to_utf16be, simdutf__utf32_length_from_utf8, ...), their extern "C" declarations, and the convert::utf8::to::utf16::{le,be}, convert::utf8::to::utf32, convert::utf16::to::utf32, convert::utf32, length::utf32 wrapper modules. Only the little-endian with_errors wrappers and the length::utf8/length::utf16 helpers have callers. The matching stub in src/parsers/benches/support/simdutf_shim.cpp goes too.

ncrypto (src/jsc/bindings/ncrypto.{cpp,h})

  • BignumPointer::isZero, ClearErrorOnReturn::peekError (every peekError() call is on MarkPopErrorOnReturn), EVPKeyCtxPointer::sign (callers use EVPMDCtxPointer::sign), the move assignments of BIOPointer, CipherCtxPointer, ECDSASigPointer, ECGroupPointer, ECPointPointer, the 3-argument AsymmetricKeyEncodingConfig / PrivateKeyEncodingConfig constructors and PrivateKeyEncodingConfig::operator=. Dropping the user-declared assignments leaves the types non-assignable, so any future use is a compile error rather than silent.

uws shims (src/uws_sys)

  • uws_loop_defer + PosixLoop/WindowsLoop::next_tick, uws_res_clear_corked_socket + Loop::uncork (uWS::Loop::preCb in packages/bun-uws/src/Loop.h already drains leftover corks every iteration), uws_ws_iterate_topics and its extern, uws_h3_req_get_parameter + h3::Request::parameter.

JSC / Bun bindings

  • BunString__toInt32, URL__fromJS + URL::from_js, BunString::utf8ByteLength, the Ref<StringImpl> overload of toCrossThreadShareable (all callers pass a String).
  • JSC__VM__hasTerminationRequest + VM::has_termination_request, JSC__VM__isTerminationException, JSC__VM__notifyNeedDebuggerBreak.
  • Bun__allocUint8ArrayForCopy and the Uint8Array arm of ArrayBuffer::alloc (every instantiation uses ArrayBuffer).
  • jsFunctionNotImplemented / jsFunctionCreateFunctionThatMasqueradesAsUndefined (declared in ZigGlobalObject.h, never registered anywhere).
  • JSCStackTrace::getStackTraceForThrownValue, V::validateOneOf(span<ASCIILiteral>), V::validateString(JSValue name), ERR::CRYPTO_INVALID_KEY_OBJECT_TYPE(JSValue) (callers pass CryptoKeyType), createBuffer(const char*, size_t), constructFromEncoding(span), the 1-argument Process::queueNextTick, the empty non-Windows signalHandler (the Windows body moves into the existing #if OS(WINDOWS) block), BakeAdditionsToGlobalObject::wrapComponent and its m_wrapComponent barrier, TextEncoding(const String&).
  • JSX509Certificate::infoAccess() was the only reader of the m_infoAccess lazy property, so the property, its initializer and visit go too; that initializer was the only user of the legacy=false mode of computeInfoAccess, so the parameter is dropped. The infoAccess getter on the prototype and toLegacyObject() are unaffected (they never went through the lazy property).

WebCore bindings

  • JSWorkerOptions.{cpp,h}: convertDictionary<WorkerOptions> had no callers (JSWorker.cpp builds WorkerOptions by hand and now includes WorkerOptions.h directly).
  • convertDictionary<URLPatternResult> / <URLPatternComponentResult> throwing stubs; the convertDictionaryToJS direction stays.
  • EventEmitter::eventTypes() / eventListeners() (the inspector uses the EventTarget versions), the DoNotRegisterWithGlobalObjectTag DOMGuardedObject / DOMGuarded constructors (last user removed with the streams rewrite), TransferredMessagePort::operator=(&&), the free normalWorld(VM&) (callers use JSVMClientData::normalWorld()), expectedEnumerationValues<CryptoKeyUsage> (the generic enumeration converter never calls it; only bindgen enums use this hook, with their own generated definitions).

Rust

  • jsc::JSPromise::Strong::{settle_task, resolve_task}.
  • JsSinkType::done and its six overrides (nothing dispatches it; the backing done fields are still read directly), ArrayBufferSink::to_js, ReadableStream::to_js (callers read .value), BlobExt::get_mime_type, BlobExt::on_structured_clone_transfer (no class sets structuredClone.transferable, so codegen never emits the call), FileCloser::update (the macro and read_file.rs call the inherent update(), which shadows the trait method), node_fs::Null::to_js (return values go through FsReturn), the EndTag replace content op (not exposed in html_rewriter.classes.ts or the types), the valkey close_subscription_ctx / subscription_ctx_is_deletable pair (never called; it was uncalled in the Zig original too).
  • zlib_sys: the remaining gz* declarations plus the now-unused gzFile types and voidp/voidpc aliases; bun_core: SplitIterator::rest, the OutOfRangeValue impls for i32 and bun_alloc::String.

Verification:

  • cargo check via bun run rust:check-all: 10/10 target triples pass.
  • bun bd builds; bun bd test on x509, key-objects, ecdh, urlpattern, message-port-pipe, text-encoder/decoder, arraybuffersink, filesink, toUTF16Alloc, html-rewriter, process-nexttick, worker, buffer, event-emitter, valkey basic-operations, fs-mkdir and bun-server passes except for tests that fail identically with an unmodified release binary in this container (localhost fixtures that cannot connect, and three worker startup-timing tests that do not hold under a debug ASAN build).
  • test/internal/source-lints/dead-symbols-simdutf-ncrypto-idl-misc.test.ts pins the removals; the rest of test/internal/source-lints/ still passes.

Looked at and deliberately left alone:

  • The 14 unused convertToInteger* specializations in JSDOMConvertNumbers.cpp: src/codegen/bindgen.ts maps i8/i16/i64 and .clamp()/.enforceRange() onto exactly these, so a new .bind.ts would need them. Not dead.
  • JsSinkType::flush and the per-sink flush() bodies are unreachable at runtime because every sink sets HAS_FLUSH_FROM_JS = true, but removing them means changing the trait's defaults; left for a separate change.
  • PosixStreamingWriterParent::{HAS_ON_READY, on_ready} in src/io/PipeWriter.rs are never read on POSIX (only the Windows parent calls on_ready); possibly a dropped behaviour rather than dead code, so untouched.

Background

  • --gc-sections makes the linker drop every function section nothing reachable refers to; --print-gc-sections prints the list. Bun's C++ is compiled with -ffunction-sections and hidden visibility, so a dropped C++ function is one with no caller in any translation unit, and a dropped Rust function is one no crate calls. Because this is a linux-x64 link, anything used only behind another platform's cfg/#if also shows up; those were filtered out by reading the callers, which is why the noOrphans, sysconf, coregraphics/WIC and posix_spawnattr_reset_signals shims stay.
  • [[ZIG_EXPORT]] functions (BunString__toInt32, the JSC__VM__* exports) get their Rust declarations generated into cpp.rs at build time, so deleting the C++ definition is enough; the build regenerates the declarations.
  • The dead-symbols-*.test.ts files in test/internal/source-lints/ are the convention the previous dead-code sweeps use: a grep-based lint over the tree that fails if a removed symbol is reintroduced, run on a bare checkout without building.

[review] gate passed · iteration 0 · 70 files touched

fails on main (without fix)
ASAN without fix: 2 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-simdutf-ncrypto-idl-misc.test.ts
bun test v1.4.0 (1c4189288)

test/internal/source-lints/dead-symbols-simdutf-ncrypto-idl-misc.test.ts:
66 |     ["src/simdutf_sys/simdutf.rs", /\bsimdutf__utf8_length_from_utf16be\b/],
67 |     // The whole `convert::utf32` and `length::utf32` module trees went with them.
68 |     ["src/simdutf_sys/simdutf.rs", /pub mod utf32\b/],
69 |     ["src/parsers/benches/support/simdutf_shim.cpp", /\bsimdutf__convert_utf8_to_utf16le\b/],
70 |   ];
71 |   expect(resurrected(checks, src)).toEqual([]);
                                        ^
error: expect(received).toEqual(expected)

- []
+ [
+   "src/simdutf_sys/bun-simdutf.cpp: \bsimdutf__convert_utf8_to_utf16be\b",
+   "src/simdutf_sys/bun-simdutf.cpp: \bsimdutf__convert_utf8_to_utf16le\b",
+   "src/simdutf_sys/bun-simdutf.cpp: \bsimdutf__convert_valid_utf32_to_utf16be\b",
+   "src/simdutf_sys/bun-simdutf.cpp: \bsimdutf__utf32_length_from_utf8\b",
+   "src/simdutf_sys/simdutf.rs: \bsimdutf__convert_utf16be_to_utf32_with_e
... (truncated)

release without fix: 2 FAILED
bun test v1.4.0-canary.1 (b7a043103)

test/internal/source-lints/dead-symbols-simdutf-ncrypto-idl-misc.test.ts:
66 |     ["src/simdutf_sys/simdutf.rs", /\bsimdutf__utf8_length_from_utf16be\b/],
67 |     // The whole `convert::utf32` and `length::utf32` module trees went with them.
68 |     ["src/simdutf_sys/simdutf.rs", /pub mod utf32\b/],
69 |     ["src/parsers/benches/support/simdutf_shim.cpp", /\bsimdutf__convert_utf8_to_utf16le\b/],
70 |   ];
71 |   expect(resurrected(checks, src)).toEqual([]);
                                        ^
error: expect(received).toEqual(expected)

- []
+ [
+   "src/simdutf_sys/bun-simdutf.cpp: \bsimdutf__convert_utf8_to_utf16be\b",
+   "src/simdutf_sys/bun-simdutf.cpp: \bsimdutf__convert_utf8_to_utf16le\b",
+   "src/simdutf_sys/bun-simdutf.cpp: \bsimdutf__convert_valid_utf32_to_utf16be\b",
+   "src/simdutf_sys/bun-simdutf.cpp: \bsimdutf__utf32_length_from_utf8\b",
+   "src/simdutf_sys/simdutf.rs: \bsimdutf__convert_utf16be_to_utf32_with_errors\b",
+   "src/simdutf_sys/simdutf.rs: \bsimdutf__utf8_length_from_utf16be\b",
+   "src/simdutf_sys/simdutf.rs: pub mod utf32\b",
+   "src/parsers/benches/support/simdutf_shim.cpp: \bsimdutf__c
... (truncated)
passes on PR (with fix)
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-simdutf-ncrypto-idl-misc.test.ts
bun test v1.4.0 (1c4189288)

test/internal/source-lints/dead-symbols-simdutf-ncrypto-idl-misc.test.ts:
(pass) dead simdutf shims and their Rust wrappers do not reappear [25.76ms]
(pass) dead Rust FFI wrappers and trait methods do not reappear [43.96ms]
(pass) dead C++ binding helpers do not reappear [131.72ms]
(pass) orphaned files stay deleted [502.81ms]

 4 pass
 0 fail
 4 expect() calls
Ran 4 tests across 1 file. [2.98s]
__F:0:S:0

release with fix: all passed
$ bun scripts/build.ts --profile=release
[configured] bun-profile → bun (stripped) in 671ms (unchanged)
ninja: Entering directory `/workspace/bun/build/release'
[1/131] gen ErrorCode+*.h
[2/131] gen JSBuffer.lut.h
Generating /workspace/bun/build/release/codegen/JSBuffer.lut.h from /workspace/bun/src/jsc/bindings/JSBuffer.cpp
[3/131] gen generated_host_exports.rs
generated_host_exports.rs: 93 exports (host=3, lazy=10, generic=80, rust=0); 239 extern-C blocks audited
[4/131] gen cpp.rs (cppbind)
[5/131] gen BunProcess.lut.h
Generating /workspace/bun/build/release/codegen/BunProcess.lut.h from /workspace/bun/src/jsc/bindings/BunProcess.cpp
[6/131] gen JS modules (bundle-modules)
Preprocess modules (7964ms)
Bundle modules (37ms)
Postprocesss modules (182ms)
Bundle Functions (815ms)
Generate Code (31ms)

[9.05s] Bundled "src/js" for production
  2626 kb
  197 internal modules
  13 native modules
  91 internal functions across 17 files
[6/130] cargo bun_bin → libbun_rust.a (--target x86_64-unknown-linux-gnu)

  nightly-2026-07-20-x86_64-unknown-linux-gnu unchanged - rustc 1.99.0-nightly (9f36de775 2026-07-19)

^[[1m^[[92m   Compiling^[[0m bun_jsc_macros v0.0.0 (/workspac
... (truncated)
diff hotspot
src/bun_core/fmt.rs                                |  17 --
 src/bun_core/string/immutable.rs                   |   7 -
 src/jsc/JSPromise.rs                               |  22 --
 src/jsc/URL.rs                                     |   8 +-
 src/jsc/VM.rs                                      |   6 -
 src/jsc/array_buffer.rs                            |   8 -
 src/jsc/bindings/BakeAdditionsToGlobalObject.cpp   |  12 -
 src/jsc/bindings/BakeAdditionsToGlobalObject.h     |   5 -
 src/jsc/bindings/BunProcess.cpp                    |  19 +-
 src/jsc/bindings/BunProcess.h                      |   1 -
 src/jsc/bindings/BunString.cpp                     |  66 ------
 src/jsc/bindings/BunString.h                       |   1 -
 src/jsc/bindings/DOMWrapperWorld.cpp               |   8 -
 src/jsc/bindings/DOMWrapperWorld.h                 |   2 -
 src/jsc/bindings/ErrorCode.cpp                     |  14 --
 src/jsc/bindings/ErrorCode.h                       |   1 -
 src/jsc/bindings/ErrorStackTrace.cpp               |  21 --
 src/jsc/bindings/ErrorStackTrace.h                 |  18 --
 src/jsc/bindings/JSBuffer.cpp                      |  11 -
 src/jsc/bindings/JSBuffer.h                        |   2 -
 src/jsc/bindings/JSX509Certificate.cpp             |  22 +-
 src/jsc/bindings/JSX509Certificate.h               |   4 +-
 src/jsc/bindings/NodeValidator.cpp                 |  29 ---
 src/jsc/bindings/NodeValidator.h                   |   2 -
 src/jsc/bindings/TextEncoding.cpp                  |   5 -
 src/jsc/bindings/TextEncoding.h                    |   1 -
 src/jsc/bindings/ZigGlobalObject.cpp               |  31 ---
 src/jsc/bindings/ZigGlobalObject.h                 |   3 -
 src/jsc/bindings/bindings.cpp                      |  16 --
 src/jsc/bindings/headers-handwritten.h             |   2 -
 src/jsc/bindings/headers.h                         |   1 -
 src/jsc/bindings/ncrypto.cpp                       |  83 -------
 src/jsc/bindings/ncrypto.h             
... (truncated)

gate history · 1 passed · 0 rejected · iteration 0

evidence per changed file
file                                              reads  edits  tests
src/bun_core/fmt.rs                                   0      0      0
src/bun_core/string/immutable.rs                      0      0      0
src/jsc/JSPromise.rs                                  0      0      0
src/jsc/URL.rs                                        1      4      0
src/jsc/VM.rs                                         0      0      0
src/jsc/array_buffer.rs                               1      2      0
src/jsc/bindings/BakeAdditionsToGlobalObject.cpp      0      0      0
src/jsc/bindings/BakeAdditionsToGlobalObject.h        0      0      0
src/jsc/bindings/BunProcess.cpp                       0      0      0
src/jsc/bindings/BunProcess.h                         0      0      0
src/jsc/bindings/BunString.cpp                        0      0      0
src/jsc/bindings/BunString.h                          0      0      0
src/jsc/bindings/DOMWrapperWorld.cpp                  0      0      0
src/jsc/bindings/DOMWrapperWorld.h                    0      0      0
src/jsc/bindings/ErrorCode.cpp                        0      0      0
src/jsc/bindings/ErrorCode.h                          0      0      0
(+ 54 more files)

…ndings

Every removed function was reported unreachable by a --gc-sections relink
of the debug build and has no textual reference in src/, scripts/, test/
or the regenerated codegen output.

- simdutf_sys: the big-endian UTF-16/UTF-32 conversion shims, their Rust
  extern declarations and the wrapper modules that nothing called
- ncrypto: unused move assignments, BignumPointer::isZero,
  ClearErrorOnReturn::peekError, EVPKeyCtxPointer::sign and the 3-arg
  key encoding config constructors
- uws_sys: uws_loop_defer, uws_res_clear_corked_socket (uWS::Loop::preCb
  already drains corks), uws_ws_iterate_topics, uws_h3_req_get_parameter
  and their Rust callers
- bindings: BunString__toInt32, URL__fromJS, BunString::utf8ByteLength,
  the Ref<StringImpl> toCrossThreadShareable overload, three JSC__VM__
  exports, Bun__allocUint8ArrayForCopy, the masquerading-function host
  functions, unused validator/error/buffer overloads, the never-read
  JSX509Certificate infoAccess lazy property, and a handful of WebCore
  leftovers (JSWorkerOptions, URLPatternResult convertDictionary,
  EventEmitter::eventTypes/eventListeners, DOMGuardedObject tag ctor,
  TransferredMessagePort move assignment, normalWorld(VM&))
- Rust: JSPromise task helpers, JsSinkType::done and its overrides,
  BlobExt::get_mime_type/on_structured_clone_transfer, FileCloser::update,
  ArrayBufferSink::to_js, ReadableStream::to_js, the valkey
  SubscriptionCtx close path, zlib gz* declarations, and small bun_core
  helpers

Adds a source lint so the removed symbols do not come back.
@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@robobun, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 15 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: b397275f-6d37-4866-8337-7e22bf14e279

📥 Commits

Reviewing files that changed from the base of the PR and between 60f6e18 and 1c41892.

📒 Files selected for processing (70)
  • src/bun_core/fmt.rs
  • src/bun_core/string/immutable.rs
  • src/jsc/JSPromise.rs
  • src/jsc/URL.rs
  • src/jsc/VM.rs
  • src/jsc/array_buffer.rs
  • src/jsc/bindings/BakeAdditionsToGlobalObject.cpp
  • src/jsc/bindings/BakeAdditionsToGlobalObject.h
  • src/jsc/bindings/BunProcess.cpp
  • src/jsc/bindings/BunProcess.h
  • src/jsc/bindings/BunString.cpp
  • src/jsc/bindings/BunString.h
  • src/jsc/bindings/DOMWrapperWorld.cpp
  • src/jsc/bindings/DOMWrapperWorld.h
  • src/jsc/bindings/ErrorCode.cpp
  • src/jsc/bindings/ErrorCode.h
  • src/jsc/bindings/ErrorStackTrace.cpp
  • src/jsc/bindings/ErrorStackTrace.h
  • src/jsc/bindings/JSBuffer.cpp
  • src/jsc/bindings/JSBuffer.h
  • src/jsc/bindings/JSX509Certificate.cpp
  • src/jsc/bindings/JSX509Certificate.h
  • src/jsc/bindings/NodeValidator.cpp
  • src/jsc/bindings/NodeValidator.h
  • src/jsc/bindings/TextEncoding.cpp
  • src/jsc/bindings/TextEncoding.h
  • src/jsc/bindings/ZigGlobalObject.cpp
  • src/jsc/bindings/ZigGlobalObject.h
  • src/jsc/bindings/bindings.cpp
  • src/jsc/bindings/headers-handwritten.h
  • src/jsc/bindings/headers.h
  • src/jsc/bindings/ncrypto.cpp
  • src/jsc/bindings/ncrypto.h
  • src/jsc/bindings/webcore/EventEmitter.cpp
  • src/jsc/bindings/webcore/EventEmitter.h
  • src/jsc/bindings/webcore/JSDOMGuardedObject.cpp
  • src/jsc/bindings/webcore/JSDOMGuardedObject.h
  • src/jsc/bindings/webcore/JSURLPatternResult.cpp
  • src/jsc/bindings/webcore/JSURLPatternResult.h
  • src/jsc/bindings/webcore/JSWorker.cpp
  • src/jsc/bindings/webcore/JSWorkerOptions.cpp
  • src/jsc/bindings/webcore/JSWorkerOptions.h
  • src/jsc/bindings/webcore/MessagePortPipe.cpp
  • src/jsc/bindings/webcore/TransferredMessagePort.h
  • src/jsc/bindings/webcore/streams/BunStreamConsumers.cpp
  • src/jsc/bindings/webcrypto/JSCryptoKeyUsage.cpp
  • src/jsc/bindings/webcrypto/JSCryptoKeyUsage.h
  • src/parsers/benches/support/simdutf_shim.cpp
  • src/runtime/api/html_rewriter.rs
  • src/runtime/node/node_fs.rs
  • src/runtime/valkey_jsc/js_valkey.rs
  • src/runtime/webcore/ArrayBufferSink.rs
  • src/runtime/webcore/Blob.rs
  • src/runtime/webcore/FileSink.rs
  • src/runtime/webcore/ReadableStream.rs
  • src/runtime/webcore/Sink.rs
  • src/runtime/webcore/blob/read_file.rs
  • src/runtime/webcore/fetch/FetchRequestBodySink.rs
  • src/runtime/webcore/streams.rs
  • src/simdutf_sys/bun-simdutf.cpp
  • src/simdutf_sys/simdutf.rs
  • src/url/lib.rs
  • src/uws_sys/Loop.rs
  • src/uws_sys/WebSocket.rs
  • src/uws_sys/h3.rs
  • src/uws_sys/libuwsockets.cpp
  • src/uws_sys/libuwsockets_h3.cpp
  • src/zlib_sys/shared.rs
  • src/zlib_sys/win32.rs
  • test/internal/source-lints/dead-symbols-simdutf-ncrypto-idl-misc.test.ts

Comment @coderabbitai help to get the list of available commands.

@robobun

robobun commented Aug 14, 2026 •

Copy link
Copy Markdown
Collaborator Author
Updated 7:05 AM PT - Aug 14th, 2026

❌ @robobun, your commit 1c41892 has some failures in Build #95760 (All Failures)


🧪   To try this PR locally:

bunx bun-pr 38439

That installs a local version of the PR into your bun-38439 executable, so you can run:

bun-38439 --bun

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed this PR and didn't find any bugs. The methodology (--gc-sections --print-gc-sections + textual + object-level verification + all-target cargo check) is sound and my spot-checks confirmed the removals are unreferenced. Given the breadth — 70 files across ncrypto/X509, JSC GC visitors, uws event-loop shims, and class move-semantics — a human sign-off would still be worthwhile.

What was reviewed:

  • signalHandler refactor: the only remaining reference (BunProcess.cpp:1647) is inside #if OS(WINDOWS), so folding the body into the Windows block is correct.
  • JSX509Certificate::m_infoAccess removal: the prototype getter reads view().getInfoAccess() directly, and both toLegacyObject() call sites now use the parameterless computeInfoAccess — behavior preserved.
  • expectedEnumerationValues<CryptoKeyUsage>: Converter<IDLEnumeration<T>> never references it, so IDLSequence<IDLEnumeration<CryptoKeyUsage>> callers in JSSubtleCrypto/JSJsonWebKey still link.
  • ArrayBuffer::alloc Uint8Array arm: all three callers instantiate with JSType::ArrayBuffer; JSWorkerOptions.h and gzFile have no remaining references.
Extended reasoning...

Overview

This PR removes ~1,260 lines of confirmed-dead code across 69 source files plus adds one source-lint test. The removals span simdutf FFI shims and their Rust wrappers, ncrypto helper methods and move-assignment operators, uws C ABI shims (uws_loop_defer, uws_res_clear_corked_socket, uws_ws_iterate_topics, uws_h3_req_get_parameter), assorted JSC/WebCore binding overloads, several Rust trait methods (JsSinkType::done, FileCloser::update, BlobExt::on_structured_clone_transfer), and the JSWorkerOptions.{cpp,h} file pair. One non-trivial refactor: JSX509Certificate::computeInfoAccess drops its legacy parameter after its only legacy=false caller (the m_infoAccess LazyProperty initializer) is removed.

Security risks

Several removals are in crypto-adjacent code: ncrypto move-assignment operators (BIOPointer, CipherCtxPointer, ECDSASigPointer, ECGroupPointer, ECPointPointer), EVPKeyCtxPointer::sign, BignumPointer::isZero, ClearErrorOnReturn::peekError, the AsymmetricKeyEncodingConfig/PrivateKeyEncodingConfig 3-arg constructors, and the X509 m_infoAccess lazy property. None of these change live code paths — the linker confirmed they were unreachable, and the ncrypto pointer types remain move-constructible (they become non-assignable, so any future misuse is a compile error). The computeInfoAccess signature change is behavior-preserving for both remaining callers, which already passed legacy=true. Still, crypto/TLS code deserves a maintainer glance to confirm no upstream ncrypto sync will silently expect these members.

Level of scrutiny

High. While each individual removal is mechanical and the verification methodology is rigorous, the PR touches:

  • GC-visited members (m_wrapComponent WriteBarrier, m_infoAccess LazyProperty) with matching visitChildrenImpl edits
  • Move-semantics of RAII crypto pointer types
  • The uws event-loop shim layer
  • Platform-gated #if OS(WINDOWS) reorganization in signal handling
  • Template specializations whose absence would only surface at link time

A single missed platform-gated caller or a codegen path that names one of these symbols would break a non-linux-x64 build. The PR description says all 10 target triples pass cargo check and the C++ side was verified via full bun bd, which is reassuring, but 70 files is above the threshold where I'd auto-approve.

Other factors

The PR description is unusually thorough — it names every removed symbol, explains the discovery method, lists what was deliberately left alone with reasons, and documents test coverage. The new dead-symbols-simdutf-ncrypto-idl-misc.test.ts follows the existing test/internal/source-lints/ convention and pins the removals against reintroduction. My spot-checks (signalHandler platform gating, X509 infoAccess getter path, CryptoKeyUsage enumeration converter, ArrayBuffer::alloc callers, JSWorkerOptions/gzFile references) all confirmed the PR's claims. No prior human reviews on the timeline; CI is still building.

@robobun

robobun commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator Author

On the ncrypto question: src/jsc/bindings/ncrypto.{cpp,h} is already maintained by hand rather than synced from Node. #36426 removed unused members from it earlier this month and #37454 / #37149 (both open) remove more, including BignumPointer::isOne right next to the isZero removed here. A future sync would be a manual merge either way, and a caller that wants one of these members back gets a compile error at that point, not a silent change. The move assignments in particular leave the types non-assignable, so any new assignment site fails to compile.

The one part of this diff that only the Windows build exercises is the signalHandler fold in BunProcess.cpp; the remaining changes are covered by the linux build plus cargo check on all 10 target triples. Waiting on the Windows and remaining test lanes.

@robobun

robobun commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator Author

CI status for 1c41892 (build 95760): 177 of 179 jobs passed with zero test failures; the eight annotations are all retry-passed flakes on tests this PR does not touch (child_process IPC handle timing, inspect-error-leak under ASAN, the ConPTY terminal test, two napi batch runs, malformed-integrity-base64, cluster-shared-leak and an S3 upload timeout on Windows).

The two red entries are the darwin 14 aarch64 - test-bun jobs, which expired without ever starting: all four scheduling attempts timed out waiting for an agent. That pool (release-tier=previous, six agents) currently has about 230 of these jobs queued across the pipeline, so the same thing is happening to every build today and a fresh push would expire the same way. Coverage-wise the diff built on darwin and passed the darwin 26 aarch64 and darwin x64 test lanes; nothing in it is macOS-version specific. Once the pool drains, retrying those two jobs from the Buildkite build page is enough, no rebuild needed.

Ready for review as is.

@Jarred-Sumner

Copy link
Copy Markdown
Collaborator

conflicts

@robobun

robobun commented Aug 16, 2026

Copy link
Copy Markdown
Collaborator Author

Rebased onto main (837617f). The conflicts were the neighbouring sweeps landing (#37332 took the adjacent simdutf shims, plus the termination-exception rework in bindings.cpp/VM.rs and the valkey impl_field_parent! refactor, which renamed the dead pair to close_subscription_ctx / subscription_ctx_is_deletable). Resolved by re-applying the same removals on top of the new code; every symbol in this PR was re-checked against current main and is still unreferenced, and nothing that landed in between added a caller.

Re-verified after the rebase: bun bd builds, cargo check passes on all 12 target triples, the source lints pass, and the x509 / urlpattern / encoding / valkey / nextTick / worker smoke tests pass. Diff is now +21 / -1252 in src/ (a few lines fewer since #37332 already took them); the PR body is updated.

Jarred-Sumner added a commit that referenced this pull request Aug 17, 2026
…ll_jsc, node-fallbacks, and misc crates (#39420)

Net -4,402 lines (172 files, +509 / -4,911). Everything removed has zero
references across `src/`, `scripts/`, `test/`, `packages/` and the
regenerated `build/debug/codegen/` output, and the removal builds:
removing a Rust or C++ definition that still had a caller fails to
compile or link, so a green build is the reference check for those; JS,
codegen and manifest removals were additionally grepped by name
(including `bun:internal-for-testing` consumers under `test/`).

Most of these were first identified by the sweeps that were closed
yesterday for merge conflicts (#37272, #37062, #38439, #37089, #38703).
This PR re-applies the subset that still applies on current main, minus
anything an open PR already deletes and minus small hunks in files that
change daily (see "Left out" below), plus a few new finds.

### react_compiler (-1,166)

- `validate_no_derived_computations_in_effects_exp` and its ~22
exclusive helpers/types (~1.1k lines in
`validation/validate_no_derived_computations_in_effects.rs`). The
pipeline only ever calls the non-`_exp` validation; the `_exp`
env-config flag was parsed from fixture pragmas and read by nothing.
`react-compiler-fixtures.test.ts` now lists the two pragmas as ignored
instead of handled; the fixture suite still passes.
- `SymbolHost` (back-compat alias of `Host`; `DESIGN.md` updated),
`HirBox`, `is_use_state_type`, `default_true`.

### C++ bindings (-1,350 across 64 files)

- `JSDOMConvertBufferSource.h`: the IDL typed-array specializations and
`toPossiblyShared*Array` helpers for every element type no binding
converts (only the Uint8Array/ArrayBuffer views are used).
- `JSDOMPromiseDeferred.h/.cpp`: `resolveWithJSValue`,
`resolveWithNewlyCreated`, `resolveCallbackValueWithNewlyCreated` and
friends.
- `IDLTypes.h`: the `IDLUnsupportedType` family, the IDB / WebGL /
`ScheduledAction` wrappers and stale forward declarations;
`JSDOMConvertDate.h/.cpp` (the only `IDLDate` converter) deleted along
with its two includes. The 8-line `IDLDate` struct itself stays for now
(see "Left out"). `JSDOMConvertScheduledAction.h`, orphaned in the same
way, is already deleted by #35775, so it is not touched here.
- `NetworkLoadMetrics.h`: WebKit networking-stack fields/accessors bun
never reads.
- Deleted files: `JSWorkerOptions.h/.cpp` (`JSWorker.cpp` builds
`WorkerOptions` by hand), `JSMIMEBindings.h/.cpp` (`createMIMEBinding`
had no callers; include dropped from `ZigGlobalObject.cpp`),
`JSDOMIterator.cpp` (`addValueIterableMethods`).
- `ncrypto.h/.cpp`: `peekError`, `BignumPointer::isZero`,
`EVPKeyCtxPointer::sign`, unused copy/move `operator=` overloads and an
`AsymmetricKeyEncodingConfig` constructor.
- Smaller: `JSDOMOperationReturningPromise.h`
(`call*ReturningOwnPromise`), `JSDOMAttribute.h`
(`setPassingPropertyName`, `setStatic`), `JSDOMGuardedObject`
(`DoNotRegisterWithGlobalObjectTag`), `Event`/`EventTarget`
(`resetBeforeDispatch`, default-handled flags, `isNode()`),
`EventEmitter::{eventTypes,eventListeners}`,
`HTTPHeaderIdentifiers::identifierFor`, `JSURLPatternResult`
`convertDictionary` stubs,
`PerformanceTiming::monotonicTimeToIntegerMilliseconds`,
`ContextDestructionObserver::protectedScriptExecutionContext`,
`expectedEnumerationValues<CryptoKeyUsage>`,
`BufferSource::mutableData`/`toBufferSource`, `BunString__toInt32`,
`BunString::utf8ByteLength`, the `Ref<StringImpl>` overload of
`toCrossThreadShareable`, `normalWorld()`, `TextEncoding(const
String&)`, `JSBuffer` `createBuffer`/`constructFromEncoding` overloads,
the `JSX509Certificate` `m_infoAccess` lazy property and the non-legacy
branch of `computeInfoAccess` (the prototype getter reads the view
directly; x509 tests pass),
`BakeAdditionsToGlobalObject::wrapComponent`,
`jsFunction_lsanDoLeakCheck`, and the dead `BunObject+exports.h` macro
entries (together with the Rust `BunObject_callback_nanoseconds` export
the `nanoseconds` entry declared; `Bun.nanoseconds` is
`functionBunNanoseconds` in `BunObject.cpp`).

### install_jsc / install_types / bun:internal-for-testing (-344)

- `install_jsc/dependency_jsc.rs` and `update_request_jsc.rs` deleted:
their only consumers were the `npa` / `npmTag` exports of
`bun:internal-for-testing`, which no test imports. The
`dispatch_js2native.rs` re-exports, the `generate-js2native.ts` file-map
entry and the `lsanDoLeakCheck` export (tests use `isASANEnabled`) go
with them.
- `install_types/lib.rs`: the `ExternalString` / `SlicedString` /
`SemverString` re-export modules; nothing names those paths (everything
imports the types from `bun_semver`). New in this PR.

### node-fallbacks (-400) and codegen (-392)

- `util.js`: a ~270 line commented-out `util.types` block.
- `package.json` / `bun.lock` / `tsconfig.json`: dependencies and path
mappings nothing imports (`esbuild`, `buffer`, `events`, `util`, `url`,
`process`, `path-browserify`, `os-browserify`, `timers-browserify`,
`tty-browserify`, `vm-browserify`, ...). `build-fallbacks.ts` marks
every builtin name external, and the remaining sources only import the
packages still listed; `bun install --frozen-lockfile` in the directory
is a no-op and `bundler_browser.test.ts` passes.
- `src/codegen/generate-unified-source-bundles.rb`: WebKit's Ruby
generator, superseded by `scripts/build/unified.ts`; nothing invokes it.

### Rust crates (-1,200 across bun_jsc, bun_runtime, css, uws_sys and
leaf crates)

- bun_jsc: `BuiltinName::get` + `BUILTIN_NAME_MAP`,
`MarkedArrayBuffer::to_js` (the `ArrayBuffer::alloc` Uint8Array arm and
its `Bun__allocUint8ArrayForCopy` binding are kept, so `alloc` keeps
mirroring `create`), the `__dangerouslySetPtr` wrapper
`js_class_module!` emitted into every class, `ErrorBuilder::new`,
`TopExceptionScope::new`, `Task::new`, `JSCell::to_js`,
`JSGlobalObject::{to_js,ref_,ctx}`, `job::{on_js_thread,off_thread}`,
`AbortReason` impl, `JSPromise` settle helpers, `UUID::ZERO`,
`TagPayload::get`.
- bun_runtime: the `target_os = "wasi"` directory-iterator backend in
`dir_iterator.rs` (no shipped target is wasi and the `bun_sys::wasi`
module it imports does not exist), the `Display` impls in
`assert/myers_diff.rs`, the non-unix stub and not-macos escapes in
`fs_events.rs` (the file is only compiled on macOS),
`ArrayBufferSink::to_js`, unused re-exports in `node.rs` /
`api/bun/spawn.rs` / `ffi/mod.rs` (with `abi_type` formatters narrowed
to `pub(crate)`), `Error::UnableToDecode`,
`MyersDiff::Error::OutOfMemory`. The first three are new in this PR.
- css: the inherent `eql` / `to_css` / `parse` forwarders whose callers
all go through the `CssEql` / `ToCss` / `Parse` trait impls
(`values/calc.rs` and friends), `generics::{implement_eql,parse}`,
`TokenList::parse_with_options`, `CssString::parse`.
- uws_sys: the `uws_loop_defer`, `uws_res_clear_corked_socket`,
`uws_ws_iterate_topics` and `uws_h3_req_get_parameter` C shims plus
their Rust declarations and wrappers
(`Loop::{uncork,wake,next_tick,run}`), `AnyResponse::init`,
`SocketGroup::is_empty`, `socket.rs` `group()` accessors and the
`SocketTcp`/`SocketTls` aliases, `Opcode::Close`, `WindowsLoop`.
- leaf crates: `windows_sys` constants and their `bun_sys::windows`
re-exports, `zlib`/`zlib_sys` declarations (`deflateInit_`,
`inflateInit_`, the `gz*` file API, legacy type aliases), `sha_hmac`
deprecated-API hashers (`SHA512` raw, `RIPEMD160`, `MD5_SHA1`, `Blake2`
evp), `wyhash` `HashInt` impls for u16/u64, `libarchive` commented-out
Zig-era callbacks, `bun_alloc` (`AllocError::name`, `usable_size`,
`BSSList::init`), `clap::Error::WriteFailed`, `csrf` error variants,
`pe::Error::{InputIsSigned,InsufficientSpace}`, `md` `Setextheader`,
`opaque_mut_nn`, `cares_sys` `AddrInfo_hints::is_empty`, `boringssl_sys`
constants, `errno` `Mode` re-exports, `bounded_array::get`,
`string::write::Result`, `SplitIterator::rest`, `OutOfRangeValue` impls,
`symbol::Map::init`, `sql_jsc` re-exports.

### src/js (-32)

- Unused REPL primordials entries in
`internal/repl/node-primordials.js`; with that gone `SafeWeakSet` had no
importer, so `internal/primordials.js` stops exporting it (new in this
PR). Unused export-object entries in `internal/fs/watch.ts` and
`internal/readline/interface.js`.

### scripts (-9)

- `glob-sources.ts` `src/*.c` pattern (matched nothing since
`asan-config.c` was deleted), the write-only `BUN_DEP_*` defines in
`depVersionsHeader.ts`, the unread `kqueue` config field.

### Verification

- `bun bd` (full debug build) passes.
- `bun run rust:check-all`: all 11 target triples ok (covers the
windows/darwin-only removals in `windows_sys`, `sys/windows`,
`zlib_sys/win32.rs`, `fs_events.rs`, `windows-shim`).
- `cargo fmt --check`, `cargo clippy --workspace`, clang-format on every
touched C++ file, prettier, and `bun run lint` are clean.
- All of `test/internal/source-lints/` (including the new
`dead-symbols-react-compiler-webcore-idl-misc.test.ts` that guards these
symbols, and `dead-code-escapes` against the updated
`dead-code-escape-limits.json`), `react-compiler-fixtures.test.ts`,
`bundler_browser.test.ts`, css, cryptohasher/hash, node:assert, zlib,
url, events, websocket, inspect and x509 tests pass. `serve.test.ts` has
the same 4 failures as the unmodified release build in this container
(IPv6 / root port range), nothing else.

### Left out on purpose (follow-up candidates)

- The pre-engine inbound path in `h2_frame_parser.rs` (~2.2k lines,
still dead, #37272's diff still applies cleanly): the file has had 15
commits in the last two weeks, so it is better landed on its own.
- Deletions already owned by open PRs: simdutf wrappers (#38958),
`getStackTraceForThrownValue` (#37450), `validateOneOf` (#38401), the
redis error variants (#34829), `URL::from_js` (#33889 / #34577),
`schema::api` re-exports (#37095), `FsPath` (#39327), `NodeJSFS` `Null`
impl (#38065), the deprecated selector `to_css` (#33332).
- Small hunks in high-churn files (`bindings.cpp`,
`ZigGlobalObject.cpp`, `Blob.rs`, `streams.rs`, `BunProcess.cpp`, the
`ManifestLoad::LoadFromMemory` parameter across `src/install`, the
watcher `loader` parameter), and the `#[no_mangle]` statics
(`Zig_ErrorCode*`, `Bun__versions_*`) nothing on the C++ side reads.
- `VM::has_termination_request` and its `JSC__VM__hasTerminationRequest`
shim in `bindings.cpp`: a dead pair, kept intact here because
`bindings.cpp` is the most actively edited file in the tree; both halves
go together in a follow-up.
- `IDLDate` in `IDLTypes.h`: its only converter is deleted here, but the
struct itself is left in place so this PR's file deletions stay
independent of the header edits; removing the struct is a one-hunk
follow-up once the converter files are gone.
- Found but not removed here: the windows shim's `ReadWithoutLaunch`
mode (~110 lines, overlaps #36200), `node_quic_binding.rs` constants JS
never destructures (~35 lines), the native `NodeJSFS.unwatchFile` /
`FSWatcher.hasRef` / `QuicSession.silentClose` / `QuicEndpoint.ref`
bindings JS never calls, never-constructed `bun_install::Error`
variants, and ~160 lines of `$`-declarations in `src/js/builtins.d.ts`
with no users.

<!-- robobun:evidence:begin -->

---

**[review]** gate passed · iteration 1 · 172 files touched

<details><summary>fails on main (without fix)</summary>

```console
ASAN without fix: 10 failed, 320 skipped
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/bundler/transpiler/react-compiler-fixtures.test.ts test/internal/source-lints/dead-symbols-react-compiler-webcore-idl-misc.test.ts
bun test v1.4.0 (8326d1b)

test/internal/source-lints/dead-symbols-react-compiler-webcore-idl-misc.test.ts:
88 |     // Arena box alias with zero uses (HirVec is the one HIR actually uses).
89 |     ["src/react_compiler/hir/mod.rs", /\bHirBox\b/],
90 |     // Type predicate whose only callers were in the removed _exp validation.
91 |     ["src/react_compiler/hir/mod.rs", /\bis_use_state_type\b/],
92 |   ];
93 |   expect(resurrected(checks)).toEqual([]);
                                   ^
error: expect(received).toEqual(expected)

- []
+ [
+   "src/react_compiler/validation/validate_no_derived_computations_in_effects.rs: validate_no_derived_computations_in_effects_exp",
+   "src/react_compiler/hir/environment_config.rs: validate_no_derived_computations_in_effects_exp",
+   "src/react_compiler/program.rs: validate_no_derived_computations_in_effects_exp",
+   "src/react_compiler/program.rs: \bSymbolHo
... (truncated)

release without fix: 10 failed, 1146 skipped
bun test v1.4.0-canary.1 (21a4206)

test/internal/source-lints/dead-symbols-react-compiler-webcore-idl-misc.test.ts:
88 |     // Arena box alias with zero uses (HirVec is the one HIR actually uses).
89 |     ["src/react_compiler/hir/mod.rs", /\bHirBox\b/],
90 |     // Type predicate whose only callers were in the removed _exp validation.
91 |     ["src/react_compiler/hir/mod.rs", /\bis_use_state_type\b/],
92 |   ];
93 |   expect(resurrected(checks)).toEqual([]);
                                   ^
error: expect(received).toEqual(expected)

- []
+ [
+   "src/react_compiler/validation/validate_no_derived_computations_in_effects.rs: validate_no_derived_computations_in_effects_exp",
+   "src/react_compiler/hir/environment_config.rs: validate_no_derived_computations_in_effects_exp",
+   "src/react_compiler/program.rs: validate_no_derived_computations_in_effects_exp",
+   "src/react_compiler/program.rs: \bSymbolHost\b",
+   "src/react_compiler/lib.rs: \bSymbolHost\b",
+   "src/react_compiler/hir/mod.rs: \bHirBox\b",
+   "src/react_compiler/hir/mod.rs: \bis_use_state_type\b",
+ ]

- Expected  - 1
+ Received  + 9

      at <anonymous> (/workspace/bun/test/internal/source
... (truncated)
```

</details>

<details><summary>passes on PR (with fix)</summary>

```console
ASAN with fix: 320 skipped
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/bundler/transpiler/react-compiler-fixtures.test.ts test/internal/source-lints/dead-symbols-react-compiler-webcore-idl-misc.test.ts
bun test v1.4.0 (8326d1b)

test/internal/source-lints/dead-symbols-react-compiler-webcore-idl-misc.test.ts:
(pass) dead react_compiler symbols do not reappear [21.23ms]
(pass) dead exe_format symbols do not reappear [2.63ms]
(pass) dead bun_core / bun_alloc / bun_ast / bun_ptr items do not reappear [18.66ms]
(pass) dead bun_css items do not reappear [21.91ms]
(pass) dead bun_jsc items do not reappear [20.67ms]
(pass) dead FFI-crate items do not reappear [30.81ms]
(pass) dead Rust symbols (install, webcore, jsc, leaf crates) do not reappear [18.03ms]
(pass) unused re-export names do not reappear [12.35ms]
(pass) stale build-script entries do not reappear [6.80ms]
(pass) dead Rust FFI wrappers and trait methods do not reappear [22.18ms]
(pass) dead C++ binding helpers do not reappear [99.82ms]
(pass) dead WebCore / IDL binding code does not reappear [114.33ms]
(pass) dead code in install_jsc, install_t
... (truncated)

release with fix: 1146 skipped
$ bun scripts/build.ts --profile=release
[configured] bun-profile → bun (stripped) in 641ms (unchanged)
ninja: Entering directory `/workspace/bun/build/release'
[1/130] install /workspace/bun/src/node-fallbacks
bun install v1.4.0-canary.1 (21a4206)

Checked 111 installs across 104 packages (no changes) [3.00ms]
[2/130] gen node-fallbacks/react-refresh.js
Bundled 1 module in 5ms

  react-refresh.js  4.81 KB  (entry point)

[3/130] gen JSBuffer.lut.h
Generating /workspace/bun/build/release/codegen/JSBuffer.lut.h from /workspace/bun/src/jsc/bindings/JSBuffer.cpp
[4/130] gen generated_host_exports.rs
generated_host_exports.rs: 92 exports (host=3, lazy=10, generic=79, rust=0); 241 extern-C blocks audited
[5/130] gen node-fallbacks/*.js
[6/130] gen cpp.rs (cppbind)
[7/130] gen JS modules (bundle-modules)
Preprocess modules (7887ms)
Bundle modules (42ms)
Postprocesss modules (259ms)
Bundle Functions (695ms)
Generate Code (32ms)

[8.94s] Bundled "src/js" for production
  2630 kb
  197 internal modules
  13 native modules
  91 internal functions across 17 files
[7/129] cargo bun_bin → libbun_rust.a (--target x86_64-unknown-linux-gnu)

  nightly-2026-07-20-x86_64-unknow
... (truncated)
```

</details>

<details><summary>diff hotspot</summary>

```
scripts/build/config.ts                            |    4 -
 scripts/build/depVersionsHeader.ts                 |    3 -
 scripts/build/source.ts                            |    2 +-
 scripts/glob-sources.ts                            |    1 -
 src/ast/symbol.rs                                  |    8 -
 src/boringssl_sys/boringssl.rs                     |    8 -
 src/bun_alloc/lib.rs                               |   29 +-
 src/bun_core/bounded_array.rs                      |    8 -
 src/bun_core/fmt.rs                                |   17 -
 src/bun_core/string/immutable.rs                   |    7 -
 src/bun_core/string/mod.rs                         |   11 -
 src/bun_core/string/write.rs                       |    3 -
 src/bun_core/windows_sys.rs                        |    2 +-
 src/cares_sys/c_ares.rs                            |    6 -
 src/clap/error.rs                                  |    9 -
 src/clap/lib.rs                                    |    5 -
 src/codegen/generate-js2native.ts                  |    1 -
 src/codegen/generate-unified-source-bundles.rb     |  392 -------
 src/csrf/lib.rs                                    |    3 -
 src/css/css_parser.rs                              |   19 +-
 src/css/generics.rs                                |   10 -
 src/css/lib.rs                                     |    2 +-
 src/css/properties/custom.rs                       |    8 +-
 src/css/rules/mod.rs                               |    7 +-
 src/css/values/angle.rs                            |    4 -
 src/css/values/calc.rs                             |  132 +--
 src/css/values/css_string.rs                       |    6 -
 src/css/values/time.rs                             |    7 -
 src/css_derive/lib.rs                              |    4 +-
 src/css_jsc/css_internals.rs                       |   11 -
 src/errno/darwin_errno.rs                          |    1 -
 src/errno/freebsd_errno.rs                         |    1 -
 src/errno/linux_
... (truncated)
```

</details>

**gate history** · 4 passed · 1 rejected · iteration 1

<details><summary>evidence per changed file</summary>

```
file                                reads  edits  tests
scripts/build/config.ts                 0      0      0
scripts/build/depVersionsHeader.ts      0      0      0
scripts/build/source.ts                 0      0      0
scripts/glob-sources.ts                 0      0      0
src/ast/symbol.rs                       0      0      0
src/boringssl_sys/boringssl.rs          0      0      0
src/bun_alloc/lib.rs                    0      0      0
src/bun_core/bounded_array.rs           0      0      0
src/bun_core/fmt.rs                     0      0      0
src/bun_core/string/immutable.rs        0      0      0
src/bun_core/string/mod.rs              0      0      0
src/bun_core/string/write.rs            0      0      0
src/bun_core/windows_sys.rs             0      0      0
src/cares_sys/c_ares.rs                 0      0      0
src/clap/error.rs                       0      0      0
src/clap/lib.rs                         0      0      0
(+ 156 more files)
```

</details>

<!-- robobun:evidence:end -->

---------

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Jarred-Sumner added a commit that referenced this pull request Aug 18, 2026
…ockets, and the builtin-name tables (#38900)

Removes 775 lines that nothing references (8 lines of signature, import
and comment adjustments added), across node:http2, the HTTP/2 frame
parser, the JSC/WebCore bindings, uSockets, four Rust crates, the
builtin-name tables and scripts/. No behavior change. A 153-line source
lint pins every removed symbol.

### Problem
- `src/js/node/http2.ts` binds every entry of `constants` as a local
(`const { ... } = constants;`); 178 of the 240 bindings have been unused
since the block was added in #14286 (every call site reads
`constants.X`). `const Socket = net.Socket` and the `#url` / `#isServer`
fields of `ServerHttp2Session` are never read either (`tsc
--noUnusedLocals`, re-checked by grep).
- `_nativeAssertSettings` (`$newRustFunction("h2_frame_parser.rs",
"jsAssertSettings")`) has been unused since #28074 gave http2.ts its own
`assertSettings()`. That made `js_assert_settings` in
`src/runtime/api/bun/h2_frame_parser.rs` (139 lines) and its facade
re-export in `src/runtime/api.rs` unreachable: the js2native codegen was
the only thing that named it. The three
`BUN_DECLARE_HOST_FUNCTION(BUN__HTTP2_*)` lines in `ZigGlobalObject.cpp`
are declarations of the Zig-era exports for the same helpers and have no
definition anywhere.
- `InspectorHTTPServerAgent::{startListening, stopListening,
getRequestBody, getResponseBody}` are TODO stubs that nothing can
dispatch to: the generated `HTTPServerBackendDispatcherHandler` in the
pinned WebKit only declares `enable()` / `disable()`, so these `virtual
... final` methods override nothing and have no callers.
- Declaration-only leftovers with no definition anywhere:
`Bun__DNSResolver__new` / `Bun__DNSResolver__cancel` (`BunObject.cpp`),
`jsBufferConstructorFunction_isBuffer` (`JSBuffer.cpp`,
`Buffer.isBuffer` is a JS builtin), `getStringOption` (`CryptoUtil.h`).
Plus the `IsIDLEnumeration` helper template (`IDLTypes.h`) and the
`globalBuiltinFunction` macro (`ZigGlobalObject.cpp`), each with zero
uses.
- uSockets: `us_internal_ssl_sni_userdata` and
`us_internal_ssl_handshake_abort` were added in #29932 and never called
(`us_socket_server_name_userdata`, which the first one wrapped, stays).
`us_cleanup_security_framework` (darwin) had no caller; the loader's
failure paths are the only thing that ever frees a `SecurityFramework`,
and they still do. The `SecTrustSettingsResult` typedef next to it was
unused too.
- Rust items no crate reaches (hawk `dead_public`, intersected over
linux-gnu, linux-musl, android, freebsd, darwin and windows-msvc, then
re-checked by hand): `ExprData::is_e_string`,
`ArrayHashMap::get_adapted`, the debug-only `Behavior::eq`, and
`js_parser::FunctionKind`, whose `Stmt` variant was never constructed.
`validate_function_name` only ever ran for function expressions, so the
parameter is gone and the one call site passes nothing; the error text
already said "function expression".
- Builtin-name tables: `Loader`, `byobRequest`, `controller`, `post`,
`resume`, `started`, `state`, `textDecoder` and `view` in
`BunBuiltinNames.h` have no `$name` / `@name` use in any builtin and no
`namePublicName()` / `namePrivateName()` use in C++ (each entry costs
two identifiers at VM startup). Their `builtins.d.ts` declarations go
with them, as do the six `$stream*` `--define`s in `replacements.ts` (no
builtin reads them; their only trace was the `.d.ts`), the `"Loader"`
entry of `globalsToPrefix` (the only bare `Loader` in src/js is inside a
block comment), and a duplicated `"Buffer"` entry.
- `scripts/find-dead-exports.ts` (303 lines, #31254) was a textual
approximation of the analysis `tools/hawk/` + `hawk.toml` now do
(#36184); nothing references it.

### Fix
- Deletes the items above; the only additions are the shorter
`validate_function_name` signature, one comment in `semver/lib.rs` that
named `get_adapted` (now names the surviving `get_index_adapted`), and
the re-export line in `api.rs`.
- Removing the `$newRustFunction` call is what makes the Rust function
removable: `generate-js2native.ts` emits the
`crate::api::bun::h2_frame_parser::js_assert_settings` thunk only for
calls it finds in src/js, so after this change nothing generated names
it either. `bundle-functions.ts` regenerates `BunBuiltinNames+extras.h`
from the names builtins actually use, so a builtin-name entry that were
still needed would be re-added by the build rather than break it; none
was.
- Verified: `bun bd` builds; `bun run rust:check-all` passes on all ten
target triples; `cargo fmt --check` and prettier are clean. `bun bd
test` passes on `test/js/node/http2/node-http2.test.js` (357),
`test/js/node/http2/node-http2-continuation.test.ts`,
`test/js/node/buffer.test.js`,
`test/js/node/crypto/node-crypto.test.js`,
`test/js/node/tls/node-tls-connect.test.ts`,
`test/js/web/streams/streams.test.js` and
`test/bundler/bundler_minify.test.ts`;
`test/js/node/tls/node-tls-server.test.ts` passes 69/70, the remaining
one (`SNICallback runs even when the requested servername matches the
bind hostname`) fails identically with the released binary in this
container (it binds `localhost` and connects to 127.0.0.1). The four
function-name diagnostics `validate_function_name` emits are unchanged
between the released binary and this build for both statement and
expression positions. `bun test test/internal/source-lints/` passes (158
tests); the new `dead-symbols-http2-settings-inspector-stubs.test.ts`
fails on main and passes here.
- Cross-checked against the 22 open dead-code PRs at the symbol level
(their diffs, not just file lists): nothing here is removed by any of
them. Two hunks are adjacent to open ones and will need a trivial rebase
on whichever side lands second: the `BUN__HTTP2_*` lines sit right under
the `Bun__NodeUtil__jsParseArgs` line #37788 removes, and the
`InspectorHTTPServerAgent` hunks are a few lines above the event
dispatchers #37454 removes. One item found dead here,
`JSValkeyClient::close_subscription_ctx`, is the renamed form of the
`SubscriptionCtx::close` that #38439 already removes, so it was left to
that PR.

### Background
- js2native: `$rust("file.rs", "name")` / `$newRustFunction(...)` calls
in src/js are collected at build time by
`src/codegen/generate-js2native.ts`, which emits one thunk per call into
`generated_js2native.rs` / `GeneratedJS2Native.h`. A Rust host function
is therefore reachable only while some builtin names it; the `api.rs`
facade module exists so the generated thunks have a stable path to call.
- `BunBuiltinNames.h` is the list of private identifiers (`@name` in
builtin JS, `builtinNames.namePrivateName()` in C++) that
`BunBuiltinNames` interns when a VM starts. `bundle-functions.ts` diffs
the names builtins use against this list and writes the difference to
`BunBuiltinNames+extras.h`, which is why removing an entry can only ever
remove startup work, never break a builtin.
- Inspector agents: the WebKit inspector protocol generator turns each
domain's JSON into a `*BackendDispatcherHandler` interface; a command
reaches an agent only through that interface. The HTTPServer domain bun
ships in its WebKit defines `enable` and `disable`, so methods an agent
declares beyond those are unreachable by construction.
- hawk (`tools/hawk/README.md`) is the workspace-wide reachability
analysis the repo uses for `pub` items, since rustc's `dead_code` treats
every `pub` item of a library crate as a root. Its per-target reports
were intersected so that anything live under some `cfg` on any shipped
platform was kept; the repr(C) FFI struct fields and flag/errno table
entries it also reports were left alone on purpose, as in #38703.

<details>
<summary>Found dead but left alone (follow-ups, not in this
diff)</summary>

- `bun_sys::ErrorCase::LeakFdOnFail` is never constructed (every
`make_lib_uv_owned_for_syscall` caller passes `CloseOnFail`), but
removing it means dropping the parameter at 13 call sites, several of
them in files open PRs are editing.
- `libusockets.h` still declares `us_udp_socket_receive`,
`us_udp_buffer_set_packet_payload`, `us_create_udp_packet_buffer` and
`us_udp_socket_bind` with no definitions, and `udp.c` carries a
commented-out `us_udp_packet_buffer_ecn`; both spots are adjacent to
hunks in #37454.
- `NapiEnv::currentFinalizer()` became unused in #37075 a week ago; left
for that work to settle, as #37454 did with its siblings.
- `replacements.ts` also emits a `$ImportKindLabelToId` define nothing
reads, but it comes out of the same loop as three live tables.
- `ws.js` `WebSocket.prototype.setSocket` (a throwing stub) and
`async_hooks` `AsyncResource.emitBefore/emitAfter` have no in-tree users
but are on exported classes.
- `scripts/packer/build-image.pkr.hcl` and `scripts/trace.sh` have no
invoker, but they are CI infrastructure rather than code; flagged for
whoever owns those.
- Everything else this pass turned up (about 270 C++ symbols and about
100 Rust items) is already deleted by one of the open dead-code PRs, and
the roughly 400 never-read Rust fields hawk reports are all repr(C)
mirrors of C structs.
</details>

---------

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Jarred-Sumner pushed a commit that referenced this pull request Aug 21, 2026
…uilt-in JS, bindgen, uSockets, and 66 Cargo manifests (#39732)

### Problem
- The tree carries code that nothing references: FFI shims with no
caller on either side, enum variants that are never constructed,
write-only fields, exports that no module imports, and Cargo dependency
edges that no source file uses.
- 16 dead-code PRs that removed much of this were closed as stale after
merge conflicts. Their deletions were never re-applied (list in the
notes).

### Fix
- Re-apply the deletions that still apply to current main and add new
ones in the same areas: `simdutf_sys`, `ncrypto` and the WebCore
bindings, `js_parser`, `bundler`, `js_printer`, `bun_install`, built-in
JS, bindgen, uSockets, and 66 Cargo manifests. 176 files, +95 / -3129
(`Cargo.lock` is -436 of that).
- Every deletion was checked again with `rg` over `src/`, `packages/`,
`src/codegen/` and the generated code. Items that became live again
since the old PRs stay (examples in the notes).
- No deletion duplicates an open dead-code PR. Deletions that need
#39618 or #39697 to land first are listed as follow-ups in the notes.
- Verified: `bun bd`, `bun run rust:check-all` (12 targets pass),
byte-identical bindgen output, `test/internal/source-lints`, and the
test files of the touched areas (list in the notes). New tests in
`transpiler.test.js` and `bundler_edgecase.test.ts` pin the two
diagnostics that `mark_strict_mode_feature` still emits and the class
body printing that `visit_class` still does.

### Background
- A Rust `extern "C"` declaration with no call site creates no link
reference, so a dead FFI chain is removed on both sides at once. Three
C++ definitions whose Rust side #39618 removes stay until that PR lands.
- `cargo check` covers the host target only. `rust:check-all` repeats it
for every shipped target, which proves the `#[cfg]`-gated deletions and
the Windows-only dependency removal (`bun_sys` -> `bun_output`).
- The dependency removals are manifest-only. `Cargo.lock` loses the
matching entries and nothing else: no version changes.

<details><summary>Notes</summary>

**Closed PRs re-applied**: #35437, #35559, #35775, #35880, #36115,
#36237, #37012, #37062, #37089, #37208, #37272, #37454, #37788, #38005,
#38439, #38703.

**Kept because they are live again on main**:
`GenericIndexOptional::{get, is_some, is_none}`, the WebSocket deflate
`OutOfMemory` variants, `V8Local::reinterpret`, `SystemErrno::MAX`,
`MarkPopErrorOnReturn::peekError`,
`ResourceTiming::populateServerTiming`, `UvHandle` in
`test/parallel/Channel.rs`, the `h2::FrameType` entries that `hawk.toml`
marks as a code table.

**Tests run**: node-http, node-http2, fetch headers, streams,
readable-stream-blob-consumed, filesink, transpiler, buffer, url,
FormData, TextEncoder, MessageChannel, serve-direct-readable-stream,
serve-body-leak, crypto key objects, crypto-rsa, scrypt, pbkdf2,
sqlite-sql, local-sql, postgres-simple-query-pipeline,
sql-helpers-validation, bun-outdated, websocket-server, test/internal
(bindgen, codegen outputs, source lints). The `localhost` proxy test in
node-http and the concurrent WebSocket send tests fail the same way on
unmodified main in this environment (the first is a `localhost`
resolution issue, the second is the 300k-message benchmark starving its
concurrent neighbours in a debug build).

**By kind**: C/C++ -1327, Rust -702 (+75, mostly signature updates at
call sites), built-in JS/TS -130, codegen TS -75 (+13), Cargo manifests
-459, `Cargo.lock` -436.

**simdutf_sys** (`simdutf.rs`, `bun-simdutf.cpp`,
`parsers/benches/support/simdutf_shim.cpp`): 16 shim chains with no
caller, each removed as Rust wrapper + `extern` declaration + C++
definition: `simdutf__convert_utf8_to_utf16le`, `_utf16be`,
`_utf16be_with_errors`, `convert_utf8_to_utf32_with_errors`,
`convert_valid_utf8_to_utf32`, `convert_utf16be_to_utf8_with_errors`,
`convert_valid_utf16be_to_utf8`, `convert_utf32_to_utf8_with_errors`,
`convert_valid_utf32_to_utf8`, `convert_utf32_to_utf16be_with_errors`,
`convert_valid_utf32_to_utf16be`,
`convert_utf16be_to_utf32_with_errors`,
`convert_valid_utf16be_to_utf32`, `utf8_length_from_utf16be`,
`utf32_length_from_utf16be`, `utf32_length_from_utf8`, plus the now
empty `utf32` modules and the `be` wrappers.

**ncrypto** (`ncrypto.h/.cpp`): `BignumPointer::isOne`,
`X509View::ifRsa`, `X509View::ifEc`, `BIOPointer::NewFp`,
`checkScryptParams`, `scrypt`, `pbkdf2`,
`EVPKeyCtxPointer::setRsaMgf1Md`, `Rsa::encrypt`, `Rsa::decrypt` and the
`RSA_Cipher` template, `Cipher::ForEach` with
`CipherCallbackContext`/`array_push_back`, `NCRYPTO_REQUIRE`,
`NCRYPTO_VERSION` and the version enum.

**JSC / WebCore bindings**: `ZigGlobalObject`:
`functionFulfillModuleSync` (and the `fulfillModuleSync` builtin name
plus `$fulfillModuleSync` stub), `JSDOMFileConstructor_getter/_setter`,
`navigatorObject`, `functionLazyNavigatorGetter`,
`GlobalObject_getPerformanceObject`, `hasNapiFinalizers`,
`jsFunctionNotImplemented`,
`jsFunctionCreateFunctionThatMasqueradesAsUndefined`,
`Zig__GlobalObject__getModuleRegistryMap`/`resetModuleRegistryMap`,
`NodeVM*ModulePrototype()` accessors, `ZIG_GLOBAL_OBJECT_DEFINED`.
`BunString.cpp`: `Bun__WTFStringImpl__ref`/`deref` definitions (Rust
inlines these; #39618 removes the declarations). `JSBuffer.cpp`: the
`JSValue`-name `validateOffset` overload and the three unused
`jsBufferConstructorAlloc*WithoutTypeChecks` JIT operations.
`NodeValidator`: `validateString(JSValue name)` and
`validateOneOf(span<ASCIILiteral>)`. `ScriptExecutionContext`:
`ensureOnMainThread`, `executionContext`. `napi.h`: `hasFinalizers`,
`currentFinalizer`, `isVMTerminating`. `IDLTypes.h`: `IDLDate`, the
`NullableTypeWithLessPadding` helpers and two includes.
`BunProcess.cpp`: three unused `*CodeGenerator` aliases.
`c-bindings.cpp`: `HNS_PER_SEC`, `NS_PER_HNS`, `HNS_PER_US`.
`BunCommonStrings.h`: `ConnectionWasClosed`, `ec`, `ed25519`, `rsa`,
`rsaPss`, `jwkDsa`, `jwkG`, `systemError`, `x25519`.
`BakeAdditionsToGlobalObject.h`: the never-read
`m_bakeGetAsyncLocalStorage` lazy property (the function is still
installed directly) and the `LazyPropertyOfGlobalObject` alias.
`JSBundlerPlugin.cpp`: the `JSBundlerPlugin__onVirtualModulePlugin`
declaration, which has no definition. WebCore:
`DeferredPromise::whenSettled` and the
`PromiseFunction`/`BindingPromiseFunction` adapters,
`JSEventListener::sourceURL/sourcePosition`, `Event::receivedTarget`,
`toJS(PerformanceObserverCallback)` and `callbackData()`,
`jsFetchHeaders_getRawKeys` (its only caller in `internal/http.ts` is
removed too), stale forward declarations in
`Performance.h`/`ResourceTiming.h`, and the commented-out
`BINDING_INTEGRITY` blocks in 8 generated-style files. `node/crypto`:
`JSPrivateKeyObjectConstructor` and `JSPublicKeyObjectConstructor` (4
files, superseded by `JSKeyObjectConstructor`). Bake:
`BakeRegisterProductionChunk`, `BakeProdSourceMap`, `BakeProduction.h`,
the `IncrementalGraph` log scope.

**uSockets**: `us_poll_ext`, `us_loop_iteration_number`,
`us_socket_is_tls`, `us_connecting_socket_get_loop`,
`us_udp_packet_buffer_local_ip` / `bsd_udp_packet_buffer_local_ip`.

**Rust**: `js_parser`: the six `StrictModeFeature` variants that are
never constructed (and the `can_be_transformed` branch),
`FnOnlyDataVisit::{class_name_ref,
should_replace_this_with_class_name_ref, is_inside_async_arrow_fn}` with
the `this` substitution path that was gated on the always-false flag
(the `shadow_ref` arena cell becomes a plain `Ref`). `bundler`:
`Linker::{resolver, hashed_filenames}`, `IS_CACHE_ENABLED`,
`InputFileFlags::IS_PLUGIN_FILE`, `parse_task::Step::ReadFile`.
`js_printer`: the write-only `Options::transform_only`. `bun_install`:
`CacheBehavior`/`ManifestLoad` (every caller passed
`LoadFromMemoryFallbackToDisk`, so the parameter and the memory-only
branch are gone from `by_name`, `by_name_hash` and
`by_name_hash_allow_expired`), `pub use patch_install as patch`.
`webcore`: `ReadableStream::detach_if_possible` (empty) and the `global`
parameter of `done()`, `BlobExt::{on_structured_clone_transfer,
get_mime_type}`, six `StartTag` variants that no sink uses. `server`:
`AnyRoute::ref_`, the write-only `OPENED_BIT`. `bun_core`: `concat`,
`ExternalShared::as_ptr`, `QuoteEscapeFormatFlags::ascii_only`.
`bun_io`: stale `Waker`/`Closer` re-exports. `bun_sys`: `UTIME_OMIT`.
`cli`: the never-read `IS_MAIN_THREAD` thread local. `css`:
`DeclarationContext::Keyframes`, the empty `generated_color_conversions`
module. `html_rewriter`: the `EndTag.replace` host function that
`html_rewriter.classes.ts` does not expose.

**Built-in JS/TS**: `internal/http.ts`: 29 unused symbol constants,
`filterEnvForProxies`, `getRawKeys`, `emitCloseNTAndComplete`,
`ClientRequestEmitState`. `node/http2.ts`: `kSettingNames`, three unused
primordials. `internal/sql/query.ts` and `internal/repl/node-shims.js`:
export entries nothing imports, and the `BuiltinModule` shim methods
nothing calls. `builtins.d.ts`: 8 stubs for builtin names that no longer
exist.

**bindgen** (`src/codegen/bindgen*.ts`): `allFunctions`,
`ArgStrategyChildItem`, `Variant.argStruct`,
`Struct.namespace`/`toString`, `FuncMetadata`/`exposedOn`/`ExposedOn`,
`FuncWithoutOverloads`, the dead `debug` binding, two shadowed duplicate
`case` labels and an unreachable `return`. Generated output is
byte-identical.

**Cargo**: 459 dependency lines across 66 manifests (mostly the
`strum`/`bstr`/`scopeguard`/`const_format`/`enum-map`/`enumset`/`libc`/`bitflags`
boilerplate block, plus 94 `bun_*` edges such as `bun_jsc ->
bun_simdutf_sys` and `bun_bundler_jsc -> 8 crates`). One dev-dependency
(`bun_router -> bun_js_parser`, checked with `cargo check -p bun_router
--tests`). The manifests that #39618 and #39697 already edit
(`collections`, `io`, `paths`, `css`, `shell_parser`, `sql`, `sql_jsc`)
were left alone.

**Rebase note**: main restructured the private builtin function
registration in `ZigGlobalObject::addBuiltinGlobals` into a table
(#39770). The conflict was resolved by dropping the
`k_fulfillModuleSync` row from the new table, which is the same
registration the first version of this PR removed. #39770 also touched
the two `JS*KeyObjectConstructor.h` files before this PR deletes them;
they are still unreferenced on main, so the deletion stands. Re-verified
after the rebase: `bun bd`, `rust:check-all` 12/12, and the test files
listed above.

**Follow-ups once open PRs land** (not done here to avoid duplicating
them): after #39618: the C++ definitions of `URL__fromJS`
(BunString.cpp) and `Bun__allocUint8ArrayForCopy` (ZigGlobalObject.cpp),
the seven `<Sink>()` constructor accessors in `ZigGlobalObject.h` that
only the generated `__getter` functions use, the Rust `extern`
declarations of `Bun__WTFStringImpl__ref/deref`, and
`BufferWriter::append_null_byte` (no writer ever sets it to true). After
#39697: the root `[workspace.dependencies] typed-arena` entry.
Independently of those: the `DeferredPromise::{promise, resolve(),
reject(...)}` overloads and `DOMPromise::whenPromiseIsSettled` have no
callers but sit next to code #39618 edits.
</details>

<!-- robobun:evidence:begin -->

---

**no test proof** · iteration 1 · Platform-specific test(s) that do not
run on this machine. Deferring to CI, which covers all platforms:
test/bundler/bundler_edgecase.test.ts

<!-- robobun:evidence:end -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants