Skip to content

node errors: make .code an own property on ERR_* errors - #35926

Closed
robobun wants to merge 5 commits into
mainfrom
farm/4e1ec47f/err-code-own-property
Closed

robobun wants to merge 5 commits into
mainfrom
farm/4e1ec47f/err-code-own-property

Conversation

@robobun

@robobun robobun commented Jul 26, 2026 •

Copy link
Copy Markdown
Collaborator

Repro

import fs from "node:fs";
import { Buffer } from "node:buffer";
import { EventEmitter } from "node:events";
const probe = (label, fn) => { try { fn(); } catch (e) {
  console.log(label.padEnd(30), JSON.stringify({ code: e.code, own: Object.prototype.hasOwnProperty.call(e, "code"), keys: Object.keys(e), json: JSON.stringify(e) })); } };
probe("fs option ERR_INVALID_ARG_TYPE", () => fs.rmSync("/x", { recursive: "yes" }));
probe("Buffer ERR_OUT_OF_RANGE", () => Buffer.alloc(-1));
probe("URL ERR_INVALID_URL", () => new URL("nope"));
probe("events ERR_INVALID_ARG_TYPE", () => new EventEmitter().setMaxListeners("x"));

Node v26.3.0:

fs option ERR_INVALID_ARG_TYPE {"code":"ERR_INVALID_ARG_TYPE","own":true,"keys":["code"],"json":"{\"code\":\"ERR_INVALID_ARG_TYPE\"}"}
Buffer ERR_OUT_OF_RANGE        {"code":"ERR_OUT_OF_RANGE","own":true,"keys":["code"],"json":"{\"code\":\"ERR_OUT_OF_RANGE\"}"}
URL ERR_INVALID_URL            {"code":"ERR_INVALID_URL","own":true,"keys":["code","input"],"json":"{\"code\":\"ERR_INVALID_URL\",\"input\":\"nope\"}"}
events ERR_INVALID_ARG_TYPE    {"code":"ERR_INVALID_ARG_TYPE","own":true,"keys":["code"],"json":"{\"code\":\"ERR_INVALID_ARG_TYPE\"}"}

Bun before:

fs option ERR_INVALID_ARG_TYPE {"code":"ERR_INVALID_ARG_TYPE","own":false,"keys":[],"json":"{}"}
Buffer ERR_OUT_OF_RANGE        {"code":"ERR_OUT_OF_RANGE","own":false,"keys":[],"json":"{}"}
URL ERR_INVALID_URL            {"code":"ERR_INVALID_URL","own":false,"keys":[],"json":"{}"}
events ERR_INVALID_ARG_TYPE    {"code":"ERR_INVALID_ARG_TYPE","own":false,"keys":[],"json":"{}"}

for (k in err) on the same errors yielded ["name","code","toString"] (leaked from the prototype) in Bun and ["code"] in Node.

Cause

createErrorPrototype in src/jsc/bindings/ErrorCode.cpp wrote code (along with name and toString) as enumerable data properties on a per-ErrorCode prototype object. The error instance itself never received an own code, so Object.keys, JSON.stringify, spread and hasOwnProperty all missed it, and for...in picked up the three enumerable prototype properties instead. In Node.js, makeNodeErrorWithCode assigns error.code = key directly on the instance.

Fix

  • Drop code from the per-code prototype and putDirect it on the instance at the three ErrorInstance::create sites (ErrorCodeCache::createError, the non-Zig-global fallback, and INVALID_ARG_VALUE_RangeError) with attributes 0 (writable, enumerable, configurable).
  • Mark the remaining prototype name and toString as DontEnum so they no longer appear in for...in.
  • In SystemError__toErrorInstance (errno errors: ENOENT, EACCES, ...), drop DontDelete from code/errno/syscall/path/dest/fd/hostname so they are configurable:true like Node's uvException.
  • In SystemError__toErrorInstanceWithInfoObject (ERR_SYSTEM_ERROR from node:os), drop DontEnum from code so Object.keys/spread/JSON.stringify see it, and drop DontDelete from the remaining properties.

All ERR_* creation paths (C++ Bun::throwError/Bun::ERR::*, Rust ErrorCode::throw, and JS-side $ERR_* macros via jsFunctionMakeErrorWithCode) funnel through these sites, so one change covers fs, buffer, url, net, events, child_process, etc.

As a side effect, util.inspect(err) now shows the trailing { code: 'ERR_...' } block like Node, since code is now own and enumerable.

Verification

New test/js/node/errors/error-code-own-property.test.ts asserts, for errors from node:fs, node:buffer, URL, node:events and node:os, that code has the Node descriptor {value, writable:true, enumerable:true, configurable:true}, shows up in Object.keys/spread/JSON.stringify, that for...in does not yield name/toString, that toString() still includes the bracketed code, and that errno-family error properties are configurable:true.

USE_SYSTEM_BUN=1 bun test test/js/node/errors/error-code-own-property.test.ts   9 fail / 1 pass
bun bd test test/js/node/errors/error-code-own-property.test.ts                 10 pass
bun bd test test/js/node/buffer.test.js                                         617 pass
bun bd test test/js/node/os/os.test.js                                          52 pass (1 pre-existing env fail)
bun bd test test/js/node/v8/capture-stack-trace.test.js                         43 pass

[review] gate passed · iteration 2 · 3 files touched

fails on main (without fix)
ASAN without fix: 9 FAILED
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/js/node/errors/error-code-own-property.test.ts
bun test v1.4.0 (1a59c335f)

test/js/node/errors/error-code-own-property.test.ts:
31 |     const err = capture(fn);
32 | 
33 |     expect(err.code).toBe(expectedCode);
34 | 
35 |     const desc = Object.getOwnPropertyDescriptor(err, "code");
36 |     expect(desc).toEqual({
                      ^
error: expect(received).toEqual(expected)

- {
-   "configurable": true,
-   "enumerable": true,
-   "value": "ERR_INVALID_ARG_TYPE",
-   "writable": true,
- }
+ undefined

- Expected  - 6
+ Received  + 1

      at <anonymous> (/workspace/bun/test/js/node/errors/error-code-own-property.test.ts:36:18)
(fail) Node.js ERR_* error .code is an own property > fs options ERR_INVALID_ARG_TYPE [14.08ms]
31 |     const err = capture(fn);
32 | 
33 |     expect(err.code).toBe(expectedCode);
34 | 
35 |     const desc = Object.getOwnPropertyDescriptor(err, "code");
36 |     expect(desc).toEqual({
                      ^
error: expect(received).toEqual(expected)

- {
-   "configurable": true,
-   "enumerabl
... (truncated)

release without fix: all passed
bun test v1.4.0-canary.1 (702932229)

test/js/node/errors/error-code-own-property.test.ts:
(pass) Node.js ERR_* error .code is an own property > fs options ERR_INVALID_ARG_TYPE [0.33ms]
(pass) Node.js ERR_* error .code is an own property > fs ERR_OUT_OF_RANGE [0.07ms]
(pass) Node.js ERR_* error .code is an own property > Buffer ERR_OUT_OF_RANGE [0.04ms]
(pass) Node.js ERR_* error .code is an own property > URL ERR_INVALID_URL [0.05ms]
(pass) Node.js ERR_* error .code is an own property > events ERR_INVALID_ARG_TYPE [0.11ms]
(pass) Node.js ERR_* error .code is an own property > for...in only enumerates own 'code', not prototype name/toString [0.07ms]
(pass) Node.js ERR_* error .code is an own property > prototype does not carry 'code' [0.03ms]
(pass) Node.js ERR_* error .code is an own property > toString() still includes the code [0.04ms]
(pass) Node.js ERR_* error .code is an own property > errno errors have own 'code' with Node's descriptor [0.10ms]
(pass) Node.js ERR_* error .code is an own property > ERR_SYSTEM_ERROR 'code' is own and enumerable [0.08ms]

 10 pass
 0 fail
 45 expect() calls
Ran 10 tests across 1 file. [158.00ms]
__F:0:S:0
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/js/node/errors/error-code-own-property.test.ts
bun test v1.4.0 (1a59c335f)

test/js/node/errors/error-code-own-property.test.ts:
(pass) Node.js ERR_* error .code is an own property > fs options ERR_INVALID_ARG_TYPE [21.82ms]
(pass) Node.js ERR_* error .code is an own property > fs ERR_OUT_OF_RANGE [6.51ms]
(pass) Node.js ERR_* error .code is an own property > Buffer ERR_OUT_OF_RANGE [4.28ms]
(pass) Node.js ERR_* error .code is an own property > URL ERR_INVALID_URL [4.36ms]
(pass) Node.js ERR_* error .code is an own property > events ERR_INVALID_ARG_TYPE [9.18ms]
(pass) Node.js ERR_* error .code is an own property > for...in only enumerates own 'code', not prototype name/toString [6.10ms]
(pass) Node.js ERR_* error .code is an own property > prototype does not carry 'code' [4.74ms]
(pass) Node.js ERR_* error .code is an own property > toString() still includes the code [3.90ms]
(pass) Node.js ERR_* error .code is an own property > errno errors have own 'code' with Node's descriptor [6.29ms]
(pass) Node.js ERR_* error .code is an ow
... (truncated)

release with fix: all passed
$ bun scripts/build.ts --profile=release
[configured] bun-profile → bun (stripped) in 805ms (unchanged)
ninja: Entering directory `/workspace/bun/build/release'
[1/72] gen ErrorCode+*.h
[2/9] cxx obj/src/jsc/bindings/bindings.cpp.o
[3/9] cxx obj/unified/UnifiedSource-src_jsc_bindings-1.cpp.o
[4/9] gen cpp.rs (cppbind)
[4/9] 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_core v0.0.0 (/workspace/bun/src/bun_core)
�[1m�[92m   Compiling�[0m bun_errno v0.0.0 (/workspace/bun/src/errno)
�[1m�[92m   Compiling�[0m bun_ptr v0.0.0 (/workspace/bun/src/ptr)
�[1m�[92m   Compiling�[0m bun_boringssl_sys v0.0.0 (/workspace/bun/src/boringssl_sys)
�[1m�[92m   Compiling�[0m bun_safety v0.0.0 (/workspace/bun/src/safety)
�[1m�[92m   Compiling�[0m bun_zlib_sys v0.0.0 (/workspace/bun/src/zlib_sys)
�[1m�[92m   Compiling�[0m bun_cares_sys v0.0.0 (/workspace/bun/src/cares_sys)
�[1m�[92m   Compiling�[0m bun_zstd v0.0.0 (/workspace/bun/src/zstd)
�[1m�[92m   Compiling�[0m bun_picohttp v0.0.0 (/workspace/bun/src/picohttp)
�[1m�[92m   Compilin
... (truncated)
diff hotspot
src/jsc/bindings/ErrorCode.cpp                     | 29 ++++---
 src/jsc/bindings/bindings.cpp                      | 32 ++++----
 .../js/node/errors/error-code-own-property.test.ts | 95 ++++++++++++++++++++++
 3 files changed, 129 insertions(+), 27 deletions(-)

gate history · 4 passed · 0 rejected · iteration 2

evidence per changed file
file                                                 reads  edits  tests
src/jsc/bindings/ErrorCode.cpp                           6      9      0
src/jsc/bindings/bindings.cpp                            0      0      0
test/js/node/errors/error-code-own-property.test.ts      1      2      0

Node.js defines the code property on ERR_INVALID_ARG_TYPE, ERR_OUT_OF_RANGE
and every other ERR_* error as an own, enumerable, writable, configurable
data property on the error instance. Bun was placing it on a per-code
prototype object instead, so Object.keys(err), JSON.stringify(err),
{...err} and err.hasOwnProperty('code') all missed it. Structured error
loggers (pino, Sentry integrations, Object.assign-based serializers) rely
on code being own.

createErrorPrototype no longer writes code to the prototype; every
ErrorInstance::create site in ErrorCode.cpp now putDirect()s code on the
instance with attributes 0 (matching Node). The name and toString
properties that remain on the per-code prototype are now DontEnum so they
no longer leak into for...in.
@coderabbitai

coderabbitai Bot commented Jul 26, 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: 17 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: 3ef178a1-14c3-4b42-abad-210e96b5af73

📥 Commits

Reviewing files that changed from the base of the PR and between 44f6469 and 1a59c33.

📒 Files selected for processing (3)
  • src/jsc/bindings/ErrorCode.cpp
  • src/jsc/bindings/bindings.cpp
  • test/js/node/errors/error-code-own-property.test.ts

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

@robobun

robobun commented Jul 26, 2026 •

Copy link
Copy Markdown
Collaborator Author
Updated 10:31 AM PT - Jul 26th, 2026

❌ @robobun, your commit 1a59c33 has 2 failures in Build #82444 (All Failures):

  • step failed outside runner - exit 255 on 🍎 14 aarch64 - test-bun
  • 📦 Binary size — 12 over 0.50 MB
  • targetthis build canary: main #79916
    sizeΔ
    ❌ bun-darwin-aarch6458.13 MB57.58 MB+564.9 KB
    ❌ bun-darwin-x6463.48 MB62.95 MB+544.5 KB
    ❌ bun-linux-aarch6470.98 MB70.42 MB+576.0 KB
    ❌ bun-linux-x6472.47 MB71.95 MB+528.0 KB
    ❌ bun-linux-aarch64-musl64.88 MB64.32 MB+576.0 KB
    ❌ bun-linux-x64-musl66.98 MB66.45 MB+544.0 KB
    ❌ bun-linux-aarch64-android78.47 MB77.97 MB+512.0 KB
    ❌ bun-linux-x64-android80.62 MB80.10 MB+529.2 KB
    ❌ bun-freebsd-x6483.07 MB82.56 MB+528.0 KB
    ❌ bun-freebsd-aarch6484.84 MB84.31 MB+544.0 KB
    ❌ bun-windows-x6480.26 MB79.70 MB+571.0 KB
    ❌ bun-windows-aarch6470.86 MB70.34 MB+533.5 KB

    Add [skip size check] to the commit message if this increase is intentional.


🧪   To try this PR locally:

bunx bun-pr 35926

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

bun-35926 --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.

Beyond the inline nit: the third site (INVALID_ARG_VALUE_RangeError, line 1015) uses the ErrorInstance::create(vm, structure, WTF::String, ...) overload — message is already a WTF::String, so no user JS runs and no exception guard is needed there. Also confirmed createErrorStructure no longer reads data.code, so dropping the parameter is dead-code cleanup only.

Extended reasoning...

One nit was filed inline (missing exception guard in the non-Zig-global fallback). I checked whether the same guard is needed at the other two putDirect sites: ErrorCodeCache::createError already has the scope+guard immediately above the new line, and INVALID_ARG_VALUE_RangeError calls the (vm, structure, WTF::String, ...) overload which cannot enter user JS, so neither needs a change. Deferring to human review given this is a broad Node-compat behavior change (affects Object.keys/JSON.stringify/util.inspect output for every ERR_* error) and CI hasn't reported yet.

Comment thread src/jsc/bindings/ErrorCode.cpp Resolved

@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.

Thanks for applying the exception guard in a0790f8 — that resolves my earlier note. I didn't find further issues, but since this changes the observable shape of every ERR_* error (own code, DontEnum prototype name/toString, and by extension util.inspect output), it's worth a maintainer's eyes before merge.

What was reviewed:

  • All three createErrorStructure call sites now putDirect code on the instance; no other callers exist.
  • NodeError_proto_toString reads code via thisVal.get(...), so it still resolves from the own property.
  • INVALID_ARG_VALUE_RangeError uses the WTF::String ErrorInstance::create overload (non-throwing), so no extra guard is needed there.
  • Grepped test snapshots for existing [ERR_*]/inspect assertions that might flip — none found.
Extended reasoning...

Overview

The PR moves the .code property on Node-style ERR_* errors from an enumerable data property on the per-code prototype to an own writable/enumerable/configurable data property on each error instance, and marks the remaining prototype name and toString as DontEnum. This matches Node's makeNodeErrorWithCode, so Object.keys, spread, JSON.stringify, hasOwnProperty and for...in now behave as they do in Node. Production changes are ~20 lines across three creation sites in src/jsc/bindings/ErrorCode.cpp, plus a new 74-line test file.

Security risks

None. This is property-placement/enumerability metadata on error objects; no user input parsing, no auth/crypto/permissions surface.

Level of scrutiny

Medium-high. ErrorCode.cpp is the single funnel for all C++/Rust/JS ERR_* throws (fs, buffer, url, net, events, crypto, child_process, …). The change is small and dictated by Node's observable behavior — there is no real design freedom here — but it alters the enumerable own-property set and util.inspect output of every such error, which is a broad user-visible surface. That breadth is why I'm deferring rather than auto-approving.

Other factors

  • My earlier inline nit (missing exception guard on the non-Zig-global fallback before dereferencing created_error) was addressed in a0790f8; the guard now mirrors ErrorCodeCache::createError exactly.
  • I confirmed createErrorStructure/createErrorPrototype have no other callers, so dropping the code parameter is complete.
  • NodeError_proto_toString still works because it uses .get() (prototype-chain lookup), and the test asserts String(err) still contains [ERR_...].
  • The INVALID_ARG_VALUE_RangeError path uses the (VM&, Structure*, WTF::String, ...) ErrorInstance::create overload, which does not run user toString, so no guard is needed before its new putDirect.
  • Structure caching is preserved: instances of a given ErrorCode still start from the same cached structure and take the same code transition, so they continue to share a final structure.
  • Test coverage is solid (matrix across fs/buffer/URL/events, descriptor shape, keys/spread/JSON/for-in, prototype absence, toString), with fail-on-main / pass-on-PR evidence. The author also ran adjacent suites (buffer, events, capture-stack-trace), and I found no .snap files asserting on the old inspect shape. CI (#82419) will exercise the full suite.

SystemError__toErrorInstance (errno family: ENOENT etc.) used DontDelete
on code/errno/syscall/path/dest/fd/hostname, giving configurable:false
where Node has configurable:true.

SystemError__toErrorInstanceWithInfoObject (ERR_SYSTEM_ERROR from node:os)
used DontEnum on code, so Object.keys/spread/JSON.stringify dropped it.

Both now use attributes 0 to match Node's {writable:true, enumerable:true,
configurable:true}.

@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.

Beyond the inline finding, I confirmed the earlier exception-guard concern on the non-Zig-global fallback is addressed in a0790f8, and that NodeError_proto_toString still resolves code via thisVal.get() (prototype-chain lookup) so moving it to the instance does not break toString() — the new test covers this. The duplicate info->putDirect(code) line removed from SystemError__toErrorInstanceWithInfoObject was a pre-existing redundant write, not a behavior change.

Extended reasoning...

Previous review concern (missing exception scope in the non-Zig-global fallback) was applied in a0790f8 and is visible in the current diff. This run's remaining finding is the Windows-specific os.setPriority(0x7ffffffe, 0) trigger in the new test, which is covered by the inline comment. I also traced NodeError_proto_toString — it reads code via thisVal.get() so relocating the property from prototype to instance keeps [ERR_*] in the string, and checked that the removed duplicate info code write in SystemError__toErrorInstanceWithInfoObject was redundant. Deferring rather than approving because this changes observable error shape (Object.keys, for...in, util.inspect) for every ERR_* error Bun throws, which is worth a human glance at CI results across the wider suite.

… too

set_process_priority_impl short-circuits pid < 0 to ESRCH on every
platform before any syscall runs. On Windows, a bogus positive pid maps
to EINVAL which set_priority1 swallows, so the call returned undefined.

@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.

LGTM — both earlier findings addressed; the remaining diff is a focused property-attribute change to match Node's makeNodeErrorWithCode.

What was reviewed:

  • Verified all three createErrorStructure call sites now putDirect code on the instance, and NodeError_proto_toString reads via .get() so it still finds the moved property.
  • Confirmed the a0790f8 exception guard mirrors the sibling in ErrorCodeCache::createError, and the INVALID_ARG_VALUE_RangeError site uses the non-throwing WTFString create overload so no guard is needed there.
  • Checked that removing the duplicate info->putDirect(code) in SystemError__toErrorInstanceWithInfoObject only reorders info keys; os.test.js's toEqual on err.info is order-insensitive.
  • os.setPriority(-1, 0) hits the pid < 0 → ESRCH short-circuit on all platforms, resolving the Windows CI failure.
Extended reasoning...

Overview

Moves the Node-style .code property on ERR_* errors from the per-code prototype onto each error instance (writable/enumerable/configurable), marks the remaining prototype name/toString as DontEnum, and drops DontDelete/DontEnum from the SystemError property descriptors so they match Node's uvException/SystemError. Touches src/jsc/bindings/ErrorCode.cpp (three creation sites + prototype builder), src/jsc/bindings/bindings.cpp (two SystemError__toErrorInstance* functions), and adds test/js/node/errors/error-code-own-property.test.ts.

Security risks

None. This adjusts property attribute flags on error objects Bun itself constructs; no user input flows into new code paths, and no new JS re-entry points were added beyond what ErrorInstance::create already had (now guarded on both branches).

Level of scrutiny

Medium. The change funnels through the central error-creation path so it affects every ERR_* throw site, but the transformation is mechanical (move one putDirect from prototype to instance; flip attribute bits). I traced each createErrorStructure caller, confirmed NodeError_proto_toString still resolves code via prototype-chain get(), and checked that the info dedup in SystemError__toErrorInstanceWithInfoObject only changes key order (not observed by any toEqual assertion).

Other factors

Two prior review rounds were addressed: (1) the non-Zig-global fallback now guards ErrorInstance::create with a TopExceptionScope before putDirect, matching the sibling path; (2) the ERR_SYSTEM_ERROR test now uses setPriority(-1, 0), which set_process_priority_impl short-circuits to ESRCH on every platform (confirmed against the Windows CI failure the author cited). PR verification shows the new test fails 9/10 on system Bun and passes 10/10 on the debug+ASAN and release builds, plus green runs of buffer.test.js, os.test.js, and capture-stack-trace.test.js.

@robobun

robobun commented Jul 26, 2026 •

Copy link
Copy Markdown
Collaborator Author

Build 82444 finished: all test lanes green (194/196 jobs pass, including Windows x64 and aarch64 for the new test). The two red jobs are infra:

  • :package: binary-size is comparing against stale canary #79916 and reports ~530 KB of accumulated main growth; the same check also fails on unrelated PR build 82390. This diff is ~25 lines of C++ and does not contribute to that delta.
  • :darwin: 14 aarch64 - test-bun exited 255 outside the runner (step-failed-outside-runner, pre-existing on main).

Ready for review.

@robobun

robobun commented Sep 6, 2026

Copy link
Copy Markdown
Collaborator Author

Closing in favor of #41737, which rebuilds this change on current main. It also covers the process.emitWarning() warning objects and S3Error, and leaves the errno-family SystemError descriptors out of scope.

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