Skip to content

Add native TLS transport backends#428

Merged
frostney merged 6 commits into
mainfrom
t3code/verify-openssl-linux-sandbox
Apr 27, 2026
Merged

Add native TLS transport backends#428
frostney merged 6 commits into
mainfrom
t3code/verify-openssl-linux-sandbox

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Apr 27, 2026

Summary

  • add shared TransportSecurity TLS layer for HTTPClient
  • use SecureTransport on macOS, SChannel on Windows, and OpenSSL on Linux with OpenSSL 3 loading support
  • update existing CLI app smoke suite to cover HTTPS HEAD against www.gstatic.com/generate_204
  • document platform TLS behavior and add Windows OpenSSL dependency guard in C

Fixes #398

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 27, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
gocciascript-homepage Ignored Ignored Preview Apr 27, 2026 7:25pm

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 27, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d2d64ce9-0cdf-4562-9d91-fe4546f1e009

📥 Commits

Reviewing files that changed from the base of the PR and between 29ba23b and b4bb6f2.

📒 Files selected for processing (1)
  • .github/workflows/ci.yml

📝 Walkthrough

Walkthrough

Adds a cross-platform TLS transport unit and integrates it into the HTTP client, replaces OpenSSL-specific HTTPS plumbing, adds an HTTPS CLI smoke test, updates fetch docs to list per-platform TLS backends, and tightens CI to detect embedded OpenSSL symbols on Windows and set macOS SDK search paths.

Changes

Cohort / File(s) Summary
CI
\.github/workflows/ci.yml
Compute macOS SDK_ROOT with xcrun and add SDK usr/lib and System/Library/Frameworks search flags; Windows cli job: fail if built GocciaScriptLoader.exe contains libssl/libcrypto strings.
Docs
docs/built-ins.md
Clarify fetch TLS backends by platform: SecureTransport (macOS), SChannel (Windows), OpenSSL (Linux); remove blanket requirement that OpenSSL runtime is always needed.
Tests
scripts/test-cli-apps.ts
Add end-to-end CLI smoke test that runs the loader with JSON/ASI and issues a HEAD to www.gstatic.com using --allowed-host, asserting timely success and a JSON ok: true with HTTP 204.
HTTP client
source/shared/HTTPClient.pas
Replace OpenSSL-specific TLS lifecycle and I/O with transport-security abstraction; use TTransportSecurityConnection and call StartTransportSecurity/CloseTransportSecurity; route reads/writes through transport when active.
Transport layer
source/shared/TransportSecurity.pas
New unit implementing TTransportSecurityConnection, StartTransportSecurity, CloseTransportSecurity, TransportSecurityRead, and TransportSecurityWrite; provides per-platform backends (SecureTransport/SChannel/OpenSSL) and surfaces ETransportSecurityError.

Sequence Diagram(s)

sequenceDiagram
    participant HTTPClient
    participant TransportSecurity
    participant TLSBackend as TLS Backend
    participant Socket

    HTTPClient->>TransportSecurity: StartTransportSecurity(socket, host)
    activate TransportSecurity
    TransportSecurity->>TLSBackend: Initialize backend & configure verification
    TLSBackend->>Socket: Perform TLS handshake (I/O)
    Socket-->>TLSBackend: Handshake responses
    TLSBackend-->>TransportSecurity: Handshake complete
    deactivate TransportSecurity

    HTTPClient->>TransportSecurity: TransportSecurityWrite(data)
    activate TransportSecurity
    TransportSecurity->>TLSBackend: Encrypt & send
    TLSBackend->>Socket: Write encrypted bytes
    deactivate TransportSecurity

    HTTPClient->>TransportSecurity: TransportSecurityRead(buf)
    activate TransportSecurity
    TLSBackend->>Socket: Read encrypted bytes
    TLSBackend->>TLSBackend: Decrypt
    TransportSecurity-->>HTTPClient: Return plaintext
    deactivate TransportSecurity

    HTTPClient->>TransportSecurity: CloseTransportSecurity()
    activate TransportSecurity
    TransportSecurity->>TLSBackend: Shutdown & cleanup
    TLSBackend->>Socket: Close
    deactivate TransportSecurity
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Add native TLS transport backends' directly and accurately summarizes the main change—introducing platform-native TLS support across macOS (SecureTransport), Windows (SChannel), and Linux (OpenSSL).
Description check ✅ Passed The PR description covers the key changes (TransportSecurity layer, platform backends, test updates, documentation) and issue reference, though testing checkboxes are not explicitly marked.
Linked Issues check ✅ Passed The PR fully addresses issue #398: implements a TLS-backend abstraction, uses SecureTransport on macOS (acceptable per issue), keeps OpenSSL on Linux, and adds HTTPS integration tests; all acceptance criteria met.
Out of Scope Changes check ✅ Passed All changes are within scope: TLS abstraction layer, platform backend implementations, documentation updates, CI workflow enhancements for verification, and HTTPS test coverage align with issue #398 objectives.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

@coderabbitai coderabbitai Bot added documentation Improvements or additions to documentation new feature New feature or request labels Apr 27, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 27, 2026

Benchmark Results

386 benchmarks

Interpreted: 🟢 337 improved · 🔴 10 regressed · 39 unchanged · avg +9.1%
Bytecode: 🟢 204 improved · 🔴 51 regressed · 131 unchanged · avg +3.5%

arraybuffer.js — Interp: 🟢 12, 2 unch. · avg +7.5% · Bytecode: 🟢 10, 4 unch. · avg +5.3%
Benchmark Interpreted Δ Bytecode Δ
create ArrayBuffer(0) 169,971 ops/sec [119,135..180,793] → 191,791 ops/sec [127,998..200,747] ~ overlap (+12.8%) 221,750 ops/sec [214,175..229,769] → 237,393 ops/sec [230,828..238,821] 🟢 +7.1%
create ArrayBuffer(64) 173,982 ops/sec [170,381..176,226] → 190,924 ops/sec [189,532..192,606] 🟢 +9.7% 209,450 ops/sec [163,159..213,993] → 222,338 ops/sec [217,247..225,535] 🟢 +6.2%
create ArrayBuffer(1024) 148,312 ops/sec [134,261..149,018] → 160,776 ops/sec [158,872..162,108] 🟢 +8.4% 175,140 ops/sec [169,438..176,232] → 192,874 ops/sec [190,107..193,548] 🟢 +10.1%
create ArrayBuffer(8192) 79,607 ops/sec [73,012..80,860] → 79,694 ops/sec [78,598..81,758] ~ overlap (+0.1%) 89,007 ops/sec [86,368..90,411] → 105,565 ops/sec [103,510..106,933] 🟢 +18.6%
slice full buffer (64 bytes) 192,744 ops/sec [189,294..193,436] → 207,112 ops/sec [193,987..207,932] 🟢 +7.5% 258,677 ops/sec [246,569..270,512] → 270,434 ops/sec [234,148..273,677] ~ overlap (+4.5%)
slice half buffer (512 of 1024 bytes) 172,736 ops/sec [169,194..174,070] → 187,117 ops/sec [185,828..190,360] 🟢 +8.3% 236,002 ops/sec [235,417..236,588] → 240,798 ops/sec [239,287..242,294] 🟢 +2.0%
slice with negative indices 160,328 ops/sec [159,846..161,100] → 174,516 ops/sec [173,378..179,557] 🟢 +8.8% 235,487 ops/sec [225,161..237,558] → 250,358 ops/sec [248,880..251,445] 🟢 +6.3%
slice empty range 184,402 ops/sec [180,488..187,434] → 199,332 ops/sec [196,342..201,877] 🟢 +8.1% 248,970 ops/sec [243,038..258,590] → 258,882 ops/sec [257,334..261,728] ~ overlap (+4.0%)
byteLength access 429,167 ops/sec [410,132..431,073] → 461,971 ops/sec [454,033..463,102] 🟢 +7.6% 674,850 ops/sec [659,496..679,483] → 659,767 ops/sec [619,431..666,664] ~ overlap (-2.2%)
Symbol.toStringTag access 353,369 ops/sec [346,010..354,322] → 383,876 ops/sec [373,790..387,336] 🟢 +8.6% 419,844 ops/sec [413,847..427,240] → 431,402 ops/sec [423,564..439,224] ~ overlap (+2.8%)
ArrayBuffer.isView 258,739 ops/sec [255,057..261,593] → 278,473 ops/sec [277,703..278,813] 🟢 +7.6% 332,086 ops/sec [325,002..336,199] → 342,574 ops/sec [341,625..343,028] 🟢 +3.2%
clone ArrayBuffer(64) 173,603 ops/sec [173,130..174,025] → 184,602 ops/sec [183,968..187,041] 🟢 +6.3% 217,365 ops/sec [212,010..220,443] → 227,696 ops/sec [226,850..228,316] 🟢 +4.8%
clone ArrayBuffer(1024) 148,166 ops/sec [146,870..149,629] → 155,178 ops/sec [154,183..156,577] 🟢 +4.7% 187,255 ops/sec [186,037..188,297] → 196,592 ops/sec [193,384..197,783] 🟢 +5.0%
clone ArrayBuffer inside object 121,751 ops/sec [119,705..122,676] → 129,006 ops/sec [128,422..129,487] 🟢 +6.0% 147,034 ops/sec [146,436..147,847] → 149,922 ops/sec [149,031..150,846] 🟢 +2.0%
arrays.js — Interp: 🟢 17, 2 unch. · avg +10.1% · Bytecode: 🟢 10, 🔴 2, 7 unch. · avg +3.2%
Benchmark Interpreted Δ Bytecode Δ
Array.from length 100 4,023 ops/sec [3,070..4,090] → 3,984 ops/sec [2,929..4,437] ~ overlap (-1.0%) 6,327 ops/sec [5,645..6,723] → 6,906 ops/sec [6,788..7,443] 🟢 +9.1%
Array.from 10 elements 90,964 ops/sec [88,391..92,905] → 99,491 ops/sec [98,717..100,388] 🟢 +9.4% 95,288 ops/sec [75,235..99,011] → 100,355 ops/sec [99,064..102,215] 🟢 +5.3%
Array.of 10 elements 109,053 ops/sec [74,695..113,707] → 122,708 ops/sec [122,284..123,271] 🟢 +12.5% 129,916 ops/sec [128,923..131,859] → 129,893 ops/sec [129,025..132,772] ~ overlap (-0.0%)
spread into new array 135,378 ops/sec [122,192..138,104] → 149,872 ops/sec [149,347..151,422] 🟢 +10.7% 78,394 ops/sec [77,562..80,471] → 84,888 ops/sec [65,601..86,543] ~ overlap (+8.3%)
map over 50 elements 7,174 ops/sec [6,997..7,201] → 7,801 ops/sec [7,714..7,848] 🟢 +8.7% 12,105 ops/sec [11,956..12,408] → 12,530 ops/sec [12,383..12,641] ~ overlap (+3.5%)
filter over 50 elements 6,550 ops/sec [6,459..6,609] → 7,255 ops/sec [6,415..7,290] ~ overlap (+10.8%) 11,353 ops/sec [11,007..11,393] → 11,862 ops/sec [11,774..11,982] 🟢 +4.5%
reduce sum 50 elements 7,297 ops/sec [7,239..7,365] → 8,168 ops/sec [8,070..8,211] 🟢 +11.9% 11,606 ops/sec [11,539..11,650] → 11,604 ops/sec [11,546..11,686] ~ overlap (-0.0%)
forEach over 50 elements 6,488 ops/sec [5,951..6,645] → 7,383 ops/sec [7,301..7,465] 🟢 +13.8% 11,357 ops/sec [11,329..11,385] → 11,751 ops/sec [11,658..11,878] 🟢 +3.5%
find in 50 elements 9,414 ops/sec [9,326..9,593] → 10,158 ops/sec [9,833..10,345] 🟢 +7.9% 17,809 ops/sec [17,698..17,965] → 17,310 ops/sec [17,162..17,458] 🔴 -2.8%
sort 20 elements 3,627 ops/sec [3,613..3,651] → 3,884 ops/sec [3,783..3,907] 🟢 +7.1% 6,993 ops/sec [6,927..7,016] → 6,812 ops/sec [6,783..6,881] 🔴 -2.6%
flat nested array 47,102 ops/sec [46,633..47,400] → 51,641 ops/sec [51,456..52,106] 🟢 +9.6% 50,613 ops/sec [49,210..51,019] → 52,392 ops/sec [51,831..52,521] 🟢 +3.5%
flatMap 27,206 ops/sec [27,098..27,222] → 29,640 ops/sec [29,273..29,862] 🟢 +8.9% 34,598 ops/sec [33,973..34,839] → 35,886 ops/sec [35,558..36,261] 🟢 +3.7%
map inside map (5x5) 7,113 ops/sec [7,012..7,284] → 8,139 ops/sec [8,070..8,177] 🟢 +14.4% 10,204 ops/sec [10,083..10,283] → 10,414 ops/sec [10,322..10,481] 🟢 +2.1%
filter inside map (5x10) 5,024 ops/sec [4,954..5,079] → 5,534 ops/sec [5,485..5,775] 🟢 +10.1% 7,888 ops/sec [7,721..8,009] → 8,337 ops/sec [8,194..8,424] 🟢 +5.7%
reduce inside map (5x10) 5,868 ops/sec [5,844..5,893] → 6,574 ops/sec [6,416..6,601] 🟢 +12.0% 8,915 ops/sec [8,882..9,013] → 9,136 ops/sec [8,980..9,183] ~ overlap (+2.5%)
forEach inside forEach (5x10) 5,149 ops/sec [4,989..5,231] → 5,751 ops/sec [5,709..5,777] 🟢 +11.7% 8,871 ops/sec [8,713..9,036] → 9,127 ops/sec [8,981..9,275] ~ overlap (+2.9%)
find inside some (10x10) 4,160 ops/sec [4,079..4,247] → 4,632 ops/sec [4,568..4,656] 🟢 +11.3% 7,128 ops/sec [6,978..7,201] → 7,122 ops/sec [7,025..7,162] ~ overlap (-0.1%)
map+filter chain nested (5x20) 1,553 ops/sec [1,505..1,570] → 1,783 ops/sec [1,728..1,813] 🟢 +14.8% 2,601 ops/sec [2,586..2,641] → 2,664 ops/sec [2,652..2,674] 🟢 +2.4%
reduce flatten (10x5) 16,414 ops/sec [16,209..16,475] → 17,700 ops/sec [17,578..17,973] 🟢 +7.8% 7,377 ops/sec [7,246..7,486] → 8,041 ops/sec [7,941..8,087] 🟢 +9.0%
async-await.js — Interp: 🟢 3, 3 unch. · avg +6.3% · Bytecode: 🟢 4, 2 unch. · avg +4.9%
Benchmark Interpreted Δ Bytecode Δ
single await 147,781 ops/sec [95,455..151,344] → 147,557 ops/sec [107,075..164,031] ~ overlap (-0.2%) 167,613 ops/sec [133,394..174,790] → 179,627 ops/sec [151,063..181,945] ~ overlap (+7.2%)
multiple awaits 71,249 ops/sec [69,798..72,099] → 77,036 ops/sec [76,063..77,489] 🟢 +8.1% 74,428 ops/sec [59,389..76,284] → 79,771 ops/sec [76,444..81,148] 🟢 +7.2%
await non-Promise value 299,149 ops/sec [188,563..301,085] → 314,490 ops/sec [312,476..318,966] 🟢 +5.1% 459,733 ops/sec [454,334..461,297] → 473,540 ops/sec [469,685..479,909] 🟢 +3.0%
await with try/catch 137,299 ops/sec [129,635..141,195] → 151,298 ops/sec [105,889..154,817] ~ overlap (+10.2%) 170,692 ops/sec [167,595..172,255] → 180,537 ops/sec [179,539..181,020] 🟢 +5.8%
await Promise.all 22,654 ops/sec [22,353..22,971] → 24,216 ops/sec [17,726..24,988] ~ overlap (+6.9%) 23,369 ops/sec [23,258..23,774] → 23,983 ops/sec [21,489..24,497] ~ overlap (+2.6%)
nested async function call 77,949 ops/sec [77,515..78,541] → 83,892 ops/sec [82,709..84,906] 🟢 +7.6% 103,642 ops/sec [91,903..104,765] → 107,513 ops/sec [104,901..108,967] 🟢 +3.7%
base64.js — Interp: 🟢 10 · avg +11.2% · Bytecode: 🟢 8, 2 unch. · avg +7.7%
Benchmark Interpreted Δ Bytecode Δ
short ASCII (13 chars) 4,976 ops/sec [4,882..5,149] → 5,713 ops/sec [5,456..5,811] 🟢 +14.8% 5,227 ops/sec [4,318..5,451] → 5,686 ops/sec [5,115..5,708] ~ overlap (+8.8%)
medium ASCII (450 chars) 201 ops/sec [197..202] → 224 ops/sec [220..228] 🟢 +11.5% 198 ops/sec [183..205] → 221 ops/sec [220..221] 🟢 +11.6%
Latin-1 characters 5,539 ops/sec [5,496..5,591] → 6,277 ops/sec [5,991..6,315] 🟢 +13.3% 5,476 ops/sec [5,383..5,670] → 6,431 ops/sec [6,366..6,464] 🟢 +17.4%
short base64 (20 chars) 2,576 ops/sec [2,193..2,671] → 2,928 ops/sec [2,905..2,957] 🟢 +13.7% 2,710 ops/sec [2,607..2,804] → 2,920 ops/sec [2,871..3,019] 🟢 +7.7%
medium base64 (600 chars) 112 ops/sec [109..114] → 123 ops/sec [118..127] 🟢 +10.0% 116 ops/sec [116..117] → 119 ops/sec [90..127] ~ overlap (+2.7%)
Latin-1 output 3,852 ops/sec [3,839..3,888] → 4,321 ops/sec [4,005..4,379] 🟢 +12.2% 3,888 ops/sec [3,852..3,966] → 4,118 ops/sec [4,068..4,169] 🟢 +5.9%
forgiving (no padding) 5,683 ops/sec [5,675..5,701] → 6,345 ops/sec [6,294..6,401] 🟢 +11.7% 5,781 ops/sec [5,716..5,857] → 6,049 ops/sec [6,003..6,066] 🟢 +4.6%
with whitespace 2,447 ops/sec [2,393..2,511] → 2,643 ops/sec [2,620..2,656] 🟢 +8.0% 2,516 ops/sec [2,464..2,557] → 2,618 ops/sec [2,609..2,626] 🟢 +4.0%
atob(btoa(short)) 1,790 ops/sec [1,781..1,813] → 1,968 ops/sec [1,937..2,028] 🟢 +9.9% 1,835 ops/sec [1,802..1,845] → 1,951 ops/sec [1,935..1,966] 🟢 +6.3%
atob(btoa(medium)) 73 ops/sec [73..74] → 78 ops/sec [78..81] 🟢 +7.3% 73 ops/sec [73..74] → 79 ops/sec [78..79] 🟢 +7.4%
classes.js — Interp: 🟢 26, 5 unch. · avg +6.1% · Bytecode: 🟢 8, 🔴 4, 19 unch. · avg +0.9%
Benchmark Interpreted Δ Bytecode Δ
simple class new 58,093 ops/sec [57,830..58,583] → 61,815 ops/sec [61,533..62,466] 🟢 +6.4% 88,067 ops/sec [87,724..88,314] → 87,955 ops/sec [87,612..87,985] ~ overlap (-0.1%)
class with defaults 46,174 ops/sec [45,842..46,680] → 49,895 ops/sec [49,563..50,300] 🟢 +8.1% 60,206 ops/sec [59,741..60,456] → 59,340 ops/sec [59,233..59,517] 🔴 -1.4%
50 instances via Array.from 2,209 ops/sec [2,190..2,230] → 2,337 ops/sec [2,331..2,377] 🟢 +5.8% 3,864 ops/sec [3,845..3,882] → 3,690 ops/sec [3,651..3,702] 🔴 -4.5%
instance method call 27,862 ops/sec [27,391..27,959] → 29,973 ops/sec [29,898..30,089] 🟢 +7.6% 43,108 ops/sec [42,628..43,318] → 43,799 ops/sec [43,727..43,886] 🟢 +1.6%
static method call 42,887 ops/sec [42,496..43,306] → 46,701 ops/sec [45,965..47,206] 🟢 +8.9% 78,290 ops/sec [77,641..78,838] → 81,177 ops/sec [80,570..81,932] 🟢 +3.7%
single-level inheritance 23,044 ops/sec [22,643..23,239] → 25,256 ops/sec [24,997..25,429] 🟢 +9.6% 32,707 ops/sec [31,927..33,209] → 34,246 ops/sec [33,956..34,401] 🟢 +4.7%
two-level inheritance 20,188 ops/sec [19,908..20,387] → 21,922 ops/sec [21,732..22,119] 🟢 +8.6% 26,471 ops/sec [26,313..26,859] → 27,177 ops/sec [26,985..27,413] 🟢 +2.7%
private field access 30,859 ops/sec [30,743..31,177] → 33,566 ops/sec [32,907..34,217] 🟢 +8.8% 44,581 ops/sec [44,401..44,873] → 44,860 ops/sec [44,356..45,698] ~ overlap (+0.6%)
private methods 33,781 ops/sec [33,449..34,120] → 36,103 ops/sec [35,107..36,451] 🟢 +6.9% 48,081 ops/sec [47,373..48,714] → 49,071 ops/sec [48,827..49,553] 🟢 +2.1%
getter/setter access 31,457 ops/sec [30,824..31,988] → 33,894 ops/sec [33,838..33,906] 🟢 +7.7% 48,708 ops/sec [48,130..49,715] → 50,561 ops/sec [50,398..51,332] 🟢 +3.8%
class decorator (identity) 41,782 ops/sec [41,450..41,924] → 44,963 ops/sec [44,795..45,234] 🟢 +7.6% 51,003 ops/sec [50,107..51,066] → 51,851 ops/sec [51,011..52,943] ~ overlap (+1.7%)
class decorator (wrapping) 24,619 ops/sec [24,405..24,651] → 26,850 ops/sec [26,604..27,050] 🟢 +9.1% 27,565 ops/sec [27,214..28,402] → 28,306 ops/sec [28,054..28,407] ~ overlap (+2.7%)
identity method decorator 30,797 ops/sec [30,583..31,033] → 33,050 ops/sec [32,760..33,458] 🟢 +7.3% 42,004 ops/sec [41,542..42,909] → 44,545 ops/sec [42,855..45,213] ~ overlap (+6.0%)
wrapping method decorator 24,778 ops/sec [24,505..25,104] → 26,568 ops/sec [26,037..26,957] 🟢 +7.2% 31,637 ops/sec [30,248..32,718] → 32,338 ops/sec [31,790..33,045] ~ overlap (+2.2%)
stacked method decorators (x3) 16,930 ops/sec [16,017..17,140] → 18,280 ops/sec [18,002..18,955] 🟢 +8.0% 21,983 ops/sec [21,276..22,154] → 23,157 ops/sec [22,526..23,729] 🟢 +5.3%
identity field decorator 33,846 ops/sec [33,357..34,480] → 36,047 ops/sec [35,517..36,547] 🟢 +6.5% 38,341 ops/sec [37,670..39,087] → 39,259 ops/sec [38,698..39,758] ~ overlap (+2.4%)
field initializer decorator 28,542 ops/sec [28,352..28,872] → 30,752 ops/sec [30,075..31,352] 🟢 +7.7% 34,188 ops/sec [33,515..34,759] → 34,780 ops/sec [32,196..35,616] ~ overlap (+1.7%)
getter decorator (identity) 31,572 ops/sec [31,285..32,349] → 32,912 ops/sec [31,698..33,257] ~ overlap (+4.2%) 38,279 ops/sec [36,815..39,112] → 38,248 ops/sec [38,054..39,097] ~ overlap (-0.1%)
setter decorator (identity) 25,686 ops/sec [24,650..25,953] → 27,518 ops/sec [27,030..27,847] 🟢 +7.1% 31,173 ops/sec [31,062..31,365] → 31,168 ops/sec [31,110..32,048] ~ overlap (-0.0%)
static method decorator 32,853 ops/sec [32,362..33,111] → 33,878 ops/sec [33,679..34,041] 🟢 +3.1% 42,792 ops/sec [42,516..43,099] → 45,182 ops/sec [43,928..45,865] 🟢 +5.6%
static field decorator 40,350 ops/sec [40,088..41,569] → 40,936 ops/sec [40,135..42,352] ~ overlap (+1.5%) 44,712 ops/sec [43,037..45,831] → 43,099 ops/sec [42,336..43,740] ~ overlap (-3.6%)
private method decorator 25,805 ops/sec [24,941..25,961] → 27,462 ops/sec [27,042..27,557] 🟢 +6.4% 37,105 ops/sec [36,018..37,881] → 37,934 ops/sec [36,947..38,930] ~ overlap (+2.2%)
private field decorator 28,791 ops/sec [28,112..29,512] → 30,318 ops/sec [29,776..30,579] 🟢 +5.3% 32,615 ops/sec [32,221..33,055] → 32,406 ops/sec [30,783..33,032] ~ overlap (-0.6%)
plain auto-accessor (no decorator) 49,119 ops/sec [47,617..51,060] → 51,310 ops/sec [50,052..54,239] ~ overlap (+4.5%) 49,375 ops/sec [48,379..50,249] → 48,164 ops/sec [47,718..50,274] ~ overlap (-2.5%)
auto-accessor with decorator 27,403 ops/sec [27,263..28,388] → 28,589 ops/sec [28,490..30,193] 🟢 +4.3% 30,062 ops/sec [29,359..30,919] → 29,312 ops/sec [28,714..30,498] ~ overlap (-2.5%)
decorator writing metadata 21,954 ops/sec [21,348..22,427] → 23,020 ops/sec [22,717..23,424] 🟢 +4.9% 25,948 ops/sec [25,498..27,045] → 26,642 ops/sec [25,639..27,376] ~ overlap (+2.7%)
static getter read 57,705 ops/sec [57,141..58,114] → 59,049 ops/sec [58,653..60,241] 🟢 +2.3% 83,800 ops/sec [82,129..84,728] → 78,110 ops/sec [77,452..79,282] 🔴 -6.8%
static getter/setter pair 42,097 ops/sec [41,313..42,735] → 43,919 ops/sec [43,701..44,057] 🟢 +4.3% 56,953 ops/sec [55,446..58,948] → 57,602 ops/sec [56,881..59,388] ~ overlap (+1.1%)
inherited static getter 34,905 ops/sec [34,404..35,358] → 35,454 ops/sec [35,118..35,783] ~ overlap (+1.6%) 43,400 ops/sec [42,864..43,863] → 42,342 ops/sec [41,253..43,158] ~ overlap (-2.4%)
inherited static setter 37,161 ops/sec [36,918..37,408] → 39,267 ops/sec [39,058..39,608] 🟢 +5.7% 45,812 ops/sec [45,496..46,137] → 46,720 ops/sec [45,228..47,402] ~ overlap (+2.0%)
inherited static getter with this binding 30,868 ops/sec [30,307..31,024] → 31,972 ops/sec [30,981..32,891] ~ overlap (+3.6%) 38,282 ops/sec [37,884..38,503] → 37,533 ops/sec [37,341..37,606] 🔴 -2.0%
closures.js — Interp: 🟢 11 · avg +8.1% · Bytecode: 🟢 9, 2 unch. · avg +3.4%
Benchmark Interpreted Δ Bytecode Δ
closure over single variable 46,841 ops/sec [46,589..47,580] → 50,699 ops/sec [49,831..51,067] 🟢 +8.2% 142,798 ops/sec [140,928..144,985] → 154,403 ops/sec [153,358..155,232] 🟢 +8.1%
closure over multiple variables 46,968 ops/sec [46,875..47,061] → 51,841 ops/sec [51,260..52,452] 🟢 +10.4% 136,760 ops/sec [136,125..137,279] → 140,560 ops/sec [139,796..141,074] 🟢 +2.8%
nested closures 51,843 ops/sec [50,741..52,132] → 55,565 ops/sec [55,442..55,689] 🟢 +7.2% 142,881 ops/sec [141,573..143,423] → 144,184 ops/sec [143,043..145,844] ~ overlap (+0.9%)
function as argument 35,660 ops/sec [35,430..36,135] → 38,281 ops/sec [37,694..38,738] 🟢 +7.4% 150,295 ops/sec [148,868..151,518] → 149,375 ops/sec [145,757..150,025] ~ overlap (-0.6%)
function returning function 46,694 ops/sec [45,183..46,814] → 50,122 ops/sec [49,397..50,654] 🟢 +7.3% 165,353 ops/sec [161,957..167,851] → 170,995 ops/sec [169,385..171,615] 🟢 +3.4%
compose two functions 27,639 ops/sec [27,378..27,972] → 30,532 ops/sec [30,130..31,317] 🟢 +10.5% 93,254 ops/sec [91,136..94,458] → 95,463 ops/sec [95,043..96,072] 🟢 +2.4%
fn.call 62,914 ops/sec [61,685..63,621] → 68,998 ops/sec [68,411..69,264] 🟢 +9.7% 93,131 ops/sec [92,496..93,781] → 97,016 ops/sec [95,706..97,789] 🟢 +4.2%
fn.apply 49,337 ops/sec [48,842..49,488] → 53,187 ops/sec [52,246..53,512] 🟢 +7.8% 95,482 ops/sec [92,865..96,217] → 100,629 ops/sec [99,862..101,008] 🟢 +5.4%
fn.bind 60,076 ops/sec [58,296..60,317] → 64,352 ops/sec [63,504..65,489] 🟢 +7.1% 169,981 ops/sec [168,777..170,543] → 175,949 ops/sec [174,256..177,500] 🟢 +3.5%
recursive sum to 50 4,286 ops/sec [4,279..4,315] → 4,620 ops/sec [4,541..4,665] 🟢 +7.8% 18,973 ops/sec [18,861..19,238] → 19,622 ops/sec [19,296..19,832] 🟢 +3.4%
recursive tree traversal 8,339 ops/sec [8,271..8,362] → 8,793 ops/sec [8,659..8,820] 🟢 +5.4% 19,306 ops/sec [19,107..19,611] → 20,038 ops/sec [19,853..20,252] 🟢 +3.8%
collections.js — Interp: 🟢 12 · avg +11.4% · Bytecode: 🟢 10, 2 unch. · avg +12.9%
Benchmark Interpreted Δ Bytecode Δ
add 50 elements 2,880 ops/sec [2,837..2,916] → 3,176 ops/sec [3,143..3,199] 🟢 +10.3% 3,335 ops/sec [3,296..3,358] → 3,880 ops/sec [3,831..3,930] 🟢 +16.3%
has lookup (50 elements) 40,841 ops/sec [40,514..41,194] → 46,013 ops/sec [43,858..46,198] 🟢 +12.7% 46,107 ops/sec [45,673..46,468] → 55,507 ops/sec [55,125..55,898] 🟢 +20.4%
delete elements 22,104 ops/sec [21,902..22,313] → 25,314 ops/sec [24,952..25,801] 🟢 +14.5% 23,864 ops/sec [23,748..23,988] → 29,174 ops/sec [28,953..29,283] 🟢 +22.3%
forEach iteration 5,575 ops/sec [5,397..5,615] → 6,117 ops/sec [6,044..6,206] 🟢 +9.7% 8,445 ops/sec [8,418..8,473] → 8,403 ops/sec [8,341..8,494] ~ overlap (-0.5%)
spread to array 16,046 ops/sec [15,743..16,236] → 17,485 ops/sec [17,116..17,781] 🟢 +9.0% 109,680 ops/sec [108,251..110,584] → 116,521 ops/sec [112,458..119,451] 🟢 +6.2%
deduplicate array 20,517 ops/sec [20,229..20,652] → 23,231 ops/sec [22,741..23,423] 🟢 +13.2% 33,835 ops/sec [33,293..34,484] → 38,383 ops/sec [37,157..38,956] 🟢 +13.4%
set 50 entries 2,149 ops/sec [2,142..2,161] → 2,397 ops/sec [2,358..2,459] 🟢 +11.5% 2,560 ops/sec [2,485..2,589] → 2,914 ops/sec [2,904..2,932] 🟢 +13.9%
get lookup (50 entries) 37,967 ops/sec [37,327..38,185] → 43,755 ops/sec [43,112..44,030] 🟢 +15.2% 40,643 ops/sec [39,751..41,458] → 48,568 ops/sec [48,338..48,840] 🟢 +19.5%
has check 56,483 ops/sec [55,604..56,777] → 62,602 ops/sec [60,241..64,337] 🟢 +10.8% 61,485 ops/sec [60,617..63,070] → 72,685 ops/sec [72,458..72,857] 🟢 +18.2%
delete entries 20,795 ops/sec [20,546..20,860] → 23,725 ops/sec [23,458..23,914] 🟢 +14.1% 21,754 ops/sec [21,604..22,034] → 26,182 ops/sec [25,903..26,277] 🟢 +20.4%
forEach iteration 5,626 ops/sec [5,463..5,667] → 6,156 ops/sec [6,066..6,199] 🟢 +9.4% 8,513 ops/sec [8,507..8,530] → 8,393 ops/sec [7,935..8,667] ~ overlap (-1.4%)
keys/values/entries 4,436 ops/sec [4,268..4,463] → 4,691 ops/sec [4,636..4,751] 🟢 +5.7% 14,154 ops/sec [13,927..14,306] → 15,062 ops/sec [14,953..15,614] 🟢 +6.4%
csv.js — Interp: 🟢 12, 1 unch. · avg +9.6% · Bytecode: 🟢 1, 🔴 9, 3 unch. · avg -2.8%
Benchmark Interpreted Δ Bytecode Δ
parse simple 3-column CSV 48,202 ops/sec [47,602..48,506] → 54,157 ops/sec [52,912..54,493] 🟢 +12.4% 51,689 ops/sec [51,365..51,956] → 50,820 ops/sec [50,590..50,917] 🔴 -1.7%
parse 10-row CSV 13,654 ops/sec [13,340..13,807] → 15,276 ops/sec [14,716..15,594] 🟢 +11.9% 14,037 ops/sec [13,891..14,081] → 13,722 ops/sec [13,673..13,732] 🔴 -2.2%
parse 100-row CSV 2,117 ops/sec [2,071..2,124] → 2,330 ops/sec [2,277..2,367] 🟢 +10.1% 2,160 ops/sec [2,066..2,211] → 2,095 ops/sec [2,051..2,106] ~ overlap (-3.0%)
parse CSV with quoted fields 71,083 ops/sec [70,007..71,220] → 77,105 ops/sec [76,191..78,555] 🟢 +8.5% 77,607 ops/sec [75,551..80,243] → 74,335 ops/sec [73,672..75,052] 🔴 -4.2%
parse without headers (array of arrays) 5,770 ops/sec [5,582..5,795] → 6,349 ops/sec [6,133..6,935] 🟢 +10.0% 6,041 ops/sec [5,973..6,095] → 5,963 ops/sec [5,924..5,978] ~ overlap (-1.3%)
parse with semicolon delimiter 9,585 ops/sec [9,564..9,618] → 10,381 ops/sec [10,256..10,523] 🟢 +8.3% 10,174 ops/sec [10,136..10,224] → 9,943 ops/sec [9,877..9,969] 🔴 -2.3%
stringify array of objects 67,875 ops/sec [67,178..68,100] → 77,272 ops/sec [76,950..77,405] 🟢 +13.8% 75,637 ops/sec [75,213..76,571] → 70,190 ops/sec [69,802..70,516] 🔴 -7.2%
stringify array of arrays 24,606 ops/sec [24,381..25,246] → 27,789 ops/sec [27,383..28,045] 🟢 +12.9% 26,252 ops/sec [26,059..26,501] → 23,688 ops/sec [23,045..23,903] 🔴 -9.8%
stringify with values needing escaping 51,277 ops/sec [49,991..52,031] → 57,255 ops/sec [56,943..57,706] 🟢 +11.7% 55,119 ops/sec [54,723..55,719] → 53,219 ops/sec [52,901..53,461] 🔴 -3.4%
reviver converts numbers 1,358 ops/sec [1,344..1,373] → 1,468 ops/sec [1,463..1,499] 🟢 +8.1% 1,568 ops/sec [1,543..1,587] → 1,643 ops/sec [1,628..1,657] 🟢 +4.8%
reviver filters empty to null 12,277 ops/sec [11,889..12,715] → 12,865 ops/sec [12,191..13,177] ~ overlap (+4.8%) 13,893 ops/sec [13,430..14,286] → 14,282 ops/sec [14,203..14,605] ~ overlap (+2.8%)
parse then stringify 8,627 ops/sec [8,484..8,982] → 9,112 ops/sec [9,047..9,389] 🟢 +5.6% 8,929 ops/sec [8,902..9,049] → 8,665 ops/sec [8,570..8,679] 🔴 -3.0%
stringify then parse 8,374 ops/sec [8,243..8,742] → 8,932 ops/sec [8,865..9,170] 🟢 +6.7% 8,687 ops/sec [8,638..8,809] → 8,231 ops/sec [7,930..8,412] 🔴 -5.2%
destructuring.js — Interp: 🟢 21, 1 unch. · avg +8.2% · Bytecode: 🟢 17, 5 unch. · avg +6.4%
Benchmark Interpreted Δ Bytecode Δ
simple array destructuring 176,825 ops/sec [172,867..179,530] → 188,367 ops/sec [184,444..190,298] 🟢 +6.5% 118,807 ops/sec [117,530..119,390] → 131,528 ops/sec [129,795..132,528] 🟢 +10.7%
with rest element 117,541 ops/sec [116,698..117,863] → 127,178 ops/sec [123,463..128,488] 🟢 +8.2% 87,905 ops/sec [87,265..89,253] → 98,116 ops/sec [94,742..99,328] 🟢 +11.6%
with defaults 169,319 ops/sec [165,709..171,954] → 187,690 ops/sec [186,086..188,361] 🟢 +10.8% 140,448 ops/sec [136,548..144,438] → 158,571 ops/sec [145,307..161,266] 🟢 +12.9%
skip elements 184,086 ops/sec [181,373..186,827] → 195,586 ops/sec [194,251..195,995] 🟢 +6.2% 127,303 ops/sec [125,027..129,249] → 142,972 ops/sec [140,737..144,606] 🟢 +12.3%
nested array destructuring 84,966 ops/sec [83,227..87,273] → 92,140 ops/sec [88,134..94,085] 🟢 +8.4% 42,964 ops/sec [40,448..44,261] → 48,874 ops/sec [48,230..49,416] 🟢 +13.8%
swap variables 211,590 ops/sec [210,338..215,939] → 224,707 ops/sec [221,987..229,821] 🟢 +6.2% 158,155 ops/sec [157,529..159,572] → 178,530 ops/sec [174,433..179,709] 🟢 +12.9%
simple object destructuring 140,691 ops/sec [139,712..141,359] → 156,496 ops/sec [150,999..158,431] 🟢 +11.2% 172,656 ops/sec [171,517..175,072] → 175,679 ops/sec [174,420..177,579] ~ overlap (+1.8%)
with defaults 157,744 ops/sec [154,430..160,549] → 172,744 ops/sec [168,838..176,407] 🟢 +9.5% 234,695 ops/sec [231,484..236,045] → 241,759 ops/sec [238,789..244,955] 🟢 +3.0%
with renaming 151,123 ops/sec [150,960..151,213] → 158,126 ops/sec [139,140..164,503] ~ overlap (+4.6%) 175,784 ops/sec [174,142..179,124] → 184,052 ops/sec [181,815..187,697] 🟢 +4.7%
nested object destructuring 75,483 ops/sec [73,479..77,254] → 82,603 ops/sec [79,356..83,815] 🟢 +9.4% 87,604 ops/sec [79,298..88,872] → 90,432 ops/sec [86,933..91,769] ~ overlap (+3.2%)
rest properties 93,800 ops/sec [92,709..94,455] → 102,178 ops/sec [100,176..104,215] 🟢 +8.9% 83,909 ops/sec [83,403..85,018] → 86,588 ops/sec [85,391..88,992] 🟢 +3.2%
object parameter 43,503 ops/sec [42,655..43,794] → 47,005 ops/sec [46,489..47,206] 🟢 +8.1% 70,504 ops/sec [69,498..71,532] → 74,937 ops/sec [73,089..75,432] 🟢 +6.3%
array parameter 54,274 ops/sec [53,515..55,061] → 57,646 ops/sec [57,169..58,985] 🟢 +6.2% 61,355 ops/sec [60,205..61,946] → 66,702 ops/sec [65,836..68,049] 🟢 +8.7%
mixed destructuring in map 12,278 ops/sec [12,088..12,428] → 13,533 ops/sec [13,362..13,568] 🟢 +10.2% 17,895 ops/sec [17,488..18,500] → 17,997 ops/sec [17,708..18,291] ~ overlap (+0.6%)
forEach with array destructuring 27,487 ops/sec [27,297..28,064] → 29,398 ops/sec [28,596..29,944] 🟢 +7.0% 22,663 ops/sec [22,174..22,964] → 23,691 ops/sec [23,622..24,066] 🟢 +4.5%
map with array destructuring 28,137 ops/sec [27,558..28,867] → 30,756 ops/sec [30,515..30,985] 🟢 +9.3% 21,816 ops/sec [21,287..22,042] → 22,801 ops/sec [22,775..22,829] 🟢 +4.5%
filter with array destructuring 29,807 ops/sec [29,276..30,236] → 31,931 ops/sec [31,302..32,235] 🟢 +7.1% 23,399 ops/sec [22,687..23,943] → 24,709 ops/sec [24,437..24,795] 🟢 +5.6%
reduce with array destructuring 31,513 ops/sec [30,699..32,664] → 33,894 ops/sec [33,581..34,292] 🟢 +7.6% 23,937 ops/sec [23,431..24,210] → 25,573 ops/sec [25,257..25,850] 🟢 +6.8%
map with object destructuring 26,915 ops/sec [26,818..27,382] → 29,263 ops/sec [28,878..30,384] 🟢 +8.7% 40,058 ops/sec [39,197..41,210] → 41,008 ops/sec [40,701..41,080] ~ overlap (+2.4%)
map with nested destructuring 23,245 ops/sec [22,902..23,587] → 24,949 ops/sec [24,518..25,733] 🟢 +7.3% 36,185 ops/sec [35,744..36,618] → 38,015 ops/sec [37,240..38,151] 🟢 +5.1%
map with rest in destructuring 17,373 ops/sec [17,320..17,416] → 18,804 ops/sec [18,767..19,255] 🟢 +8.2% 12,112 ops/sec [11,923..12,456] → 12,860 ops/sec [12,829..12,982] 🟢 +6.2%
map with defaults in destructuring 21,760 ops/sec [21,547..22,100] → 23,812 ops/sec [23,735..24,257] 🟢 +9.4% 30,122 ops/sec [29,156..30,845] → 30,287 ops/sec [30,113..30,449] ~ overlap (+0.5%)
fibonacci.js — Interp: 🟢 8 · avg +11.2% · Bytecode: 🟢 5, 3 unch. · avg +3.8%
Benchmark Interpreted Δ Bytecode Δ
recursive fib(15) 111 ops/sec [109..112] → 124 ops/sec [121..126] 🟢 +12.0% 539 ops/sec [529..548] → 536 ops/sec [534..537] ~ overlap (-0.6%)
recursive fib(20) 10 ops/sec [10..10] → 11 ops/sec [11..11] 🟢 +11.0% 49 ops/sec [47..49] → 49 ops/sec [49..50] ~ overlap (+1.5%)
recursive fib(15) typed 112 ops/sec [111..114] → 123 ops/sec [122..126] 🟢 +9.9% 444 ops/sec [436..446] → 453 ops/sec [433..464] ~ overlap (+2.0%)
recursive fib(20) typed 10 ops/sec [10..10] → 11 ops/sec [11..11] 🟢 +11.7% 40 ops/sec [39..40] → 41 ops/sec [41..42] 🟢 +2.9%
iterative fib(20) via reduce 4,998 ops/sec [4,990..5,018] → 5,557 ops/sec [5,476..5,655] 🟢 +11.2% 9,320 ops/sec [9,192..9,399] → 10,349 ops/sec [10,272..10,397] 🟢 +11.0%
iterator fib(20) 4,024 ops/sec [3,983..4,044] → 4,484 ops/sec [4,368..4,662] 🟢 +11.4% 7,792 ops/sec [7,633..7,928] → 8,235 ops/sec [8,148..8,294] 🟢 +5.7%
iterator fib(20) via Iterator.from + take 6,404 ops/sec [6,315..6,461] → 6,997 ops/sec [6,906..7,105] 🟢 +9.3% 8,935 ops/sec [8,822..9,009] → 9,436 ops/sec [9,386..9,488] 🟢 +5.6%
iterator fib(20) last value via reduce 4,605 ops/sec [4,597..4,606] → 5,193 ops/sec [5,139..5,244] 🟢 +12.8% 6,740 ops/sec [6,639..6,762] → 6,923 ops/sec [6,875..6,967] 🟢 +2.7%
float16array.js — Interp: 🟢 26, 🔴 4, 2 unch. · avg +3.3% · Bytecode: 🟢 16, 🔴 4, 12 unch. · avg +5.4%
Benchmark Interpreted Δ Bytecode Δ
new Float16Array(0) 138,810 ops/sec [137,017..139,639] → 146,645 ops/sec [145,407..149,158] 🟢 +5.6% 159,405 ops/sec [157,518..165,557] → 165,378 ops/sec [164,441..166,060] ~ overlap (+3.7%)
new Float16Array(100) 131,585 ops/sec [130,943..132,329] → 138,675 ops/sec [137,495..140,605] 🟢 +5.4% 152,556 ops/sec [150,533..155,661] → 153,815 ops/sec [152,393..154,338] ~ overlap (+0.8%)
new Float16Array(1000) 109,008 ops/sec [108,339..109,354] → 111,839 ops/sec [111,582..113,099] 🟢 +2.6% 122,476 ops/sec [120,994..123,810] → 130,647 ops/sec [130,139..131,261] 🟢 +6.7%
Float16Array.from([...100]) 86,164 ops/sec [84,417..87,283] → 90,970 ops/sec [89,219..91,781] 🟢 +5.6% 92,698 ops/sec [91,916..93,114] → 93,056 ops/sec [92,952..93,561] ~ overlap (+0.4%)
Float16Array.of(1.5, 2.5, 3.5, 4.5, 5.5) 133,851 ops/sec [131,421..135,635] → 142,297 ops/sec [140,860..144,094] 🟢 +6.3% 111,184 ops/sec [109,215..112,380] → 111,334 ops/sec [111,138..111,983] ~ overlap (+0.1%)
new Float16Array(float64Array) 91,787 ops/sec [91,074..92,585] → 96,447 ops/sec [94,985..98,021] 🟢 +5.1% 99,030 ops/sec [98,079..99,479] → 97,567 ops/sec [96,080..98,209] ~ overlap (-1.5%)
sequential write 100 elements 1,535 ops/sec [1,517..1,553] → 1,635 ops/sec [1,610..1,666] 🟢 +6.5% 3,513 ops/sec [3,471..3,557] → 3,956 ops/sec [3,919..3,966] 🟢 +12.6%
sequential read 100 elements 1,705 ops/sec [1,686..1,758] → 1,770 ops/sec [1,736..1,793] ~ overlap (+3.8%) 5,128 ops/sec [4,923..5,160] → 5,132 ops/sec [5,104..5,160] ~ overlap (+0.1%)
write special values (NaN, Inf, -0) 68,617 ops/sec [67,079..69,926] → 74,204 ops/sec [72,184..76,114] 🟢 +8.1% 124,328 ops/sec [123,889..124,902] → 115,157 ops/sec [114,371..116,332] 🔴 -7.4%
Float16Array write 1,553 ops/sec [1,521..1,587] → 1,634 ops/sec [1,606..1,670] 🟢 +5.2% 3,638 ops/sec [3,611..3,670] → 3,952 ops/sec [3,923..3,973] 🟢 +8.6%
Float32Array write 1,589 ops/sec [1,569..1,615] → 1,635 ops/sec [1,627..1,689] 🟢 +2.9% 3,644 ops/sec [3,633..3,664] → 3,999 ops/sec [3,997..4,007] 🟢 +9.7%
Float64Array write 1,598 ops/sec [1,567..1,608] → 1,672 ops/sec [1,662..1,686] 🟢 +4.6% 3,668 ops/sec [3,645..3,677] → 4,222 ops/sec [4,134..4,245] 🟢 +15.1%
Float16Array read 1,586 ops/sec [1,571..1,629] → 1,736 ops/sec [1,722..1,739] 🟢 +9.4% 4,529 ops/sec [4,521..4,558] → 5,314 ops/sec [5,305..5,342] 🟢 +17.3%
Float32Array read 1,659 ops/sec [1,647..1,680] → 1,728 ops/sec [1,723..1,768] 🟢 +4.1% 5,349 ops/sec [5,326..5,362] → 5,508 ops/sec [5,415..5,562] 🟢 +3.0%
Float64Array read 1,704 ops/sec [1,693..1,710] → 1,774 ops/sec [1,754..1,780] 🟢 +4.1% 5,327 ops/sec [5,274..5,343] → 5,231 ops/sec [5,044..5,267] 🔴 -1.8%
fill(1.5) 22,804 ops/sec [22,469..23,064] → 23,801 ops/sec [23,487..23,935] 🟢 +4.4% 23,910 ops/sec [23,808..23,985] → 24,536 ops/sec [22,786..24,807] ~ overlap (+2.6%)
slice() 89,847 ops/sec [87,781..90,926] → 90,246 ops/sec [89,005..91,169] ~ overlap (+0.4%) 104,155 ops/sec [103,325..104,484] → 100,932 ops/sec [100,117..101,338] 🔴 -3.1%
map(x => x * 2) 2,731 ops/sec [2,692..2,762] → 2,851 ops/sec [2,822..2,949] 🟢 +4.4% 4,114 ops/sec [4,095..4,133] → 4,122 ops/sec [4,076..4,162] ~ overlap (+0.2%)
filter(x => x > 25) 2,927 ops/sec [2,908..2,955] → 3,112 ops/sec [3,086..3,140] 🟢 +6.3% 4,607 ops/sec [4,595..4,628] → 4,446 ops/sec [4,414..4,486] 🔴 -3.5%
reduce (sum) 2,742 ops/sec [2,722..2,767] → 2,936 ops/sec [2,902..2,965] 🟢 +7.1% 3,707 ops/sec [3,602..3,730] → 3,677 ops/sec [3,668..3,719] ~ overlap (-0.8%)
sort() 20,770 ops/sec [20,705..20,839] → 17,667 ops/sec [17,628..17,765] 🔴 -14.9% 21,153 ops/sec [21,148..21,185] → 24,835 ops/sec [24,717..25,049] 🟢 +17.4%
indexOf() 109,844 ops/sec [106,831..110,559] → 98,915 ops/sec [98,476..99,399] 🔴 -9.9% 123,378 ops/sec [122,987..123,876] → 145,585 ops/sec [144,278..146,113] 🟢 +18.0%
reverse() 110,754 ops/sec [109,979..111,462] → 117,250 ops/sec [116,146..118,952] 🟢 +5.9% 132,146 ops/sec [131,727..133,459] → 135,877 ops/sec [135,133..136,550] 🟢 +2.8%
toReversed() 54,831 ops/sec [54,618..55,434] → 50,708 ops/sec [50,196..50,920] 🔴 -7.5% 59,929 ops/sec [59,775..60,329] → 66,274 ops/sec [65,612..66,526] 🟢 +10.6%
toSorted() 823 ops/sec [818..827] → 690 ops/sec [688..691] 🔴 -16.2% 813 ops/sec [813..814] → 971 ops/sec [967..975] 🟢 +19.5%
create view over existing buffer 158,541 ops/sec [154,255..160,063] → 167,503 ops/sec [165,482..170,254] 🟢 +5.7% 191,535 ops/sec [189,956..196,058] → 196,555 ops/sec [195,666..197,590] ~ overlap (+2.6%)
subarray() 187,411 ops/sec [186,575..189,815] → 199,922 ops/sec [198,244..203,319] 🟢 +6.7% 259,706 ops/sec [257,005..263,616] → 267,588 ops/sec [260,922..277,464] ~ overlap (+3.0%)
set() from array 210,810 ops/sec [207,836..213,573] → 226,292 ops/sec [223,582..229,600] 🟢 +7.3% 276,525 ops/sec [274,979..277,639] → 286,534 ops/sec [283,035..287,220] 🟢 +3.6%
for-of loop 2,440 ops/sec [2,420..2,457] → 2,631 ops/sec [2,605..2,655] 🟢 +7.8% 7,080 ops/sec [6,982..7,120] → 7,584 ops/sec [7,428..7,611] 🟢 +7.1%
spread into array 9,013 ops/sec [8,914..9,097] → 9,411 ops/sec [9,317..9,486] 🟢 +4.4% 36,690 ops/sec [36,576..36,797] → 36,879 ops/sec [35,961..37,049] ~ overlap (+0.5%)
f16round(1.337) 265,050 ops/sec [264,903..265,608] → 285,011 ops/sec [280,986..289,050] 🟢 +7.5% 286,544 ops/sec [285,875..288,471] → 308,810 ops/sec [306,368..310,642] 🟢 +7.8%
f16round over 100 values 1,692 ops/sec [1,655..1,703] → 1,797 ops/sec [1,783..1,816] 🟢 +6.2% 3,080 ops/sec [3,066..3,111] → 3,605 ops/sec [3,559..3,623] 🟢 +17.0%
for-of.js — Interp: 🟢 7 · avg +11.2% · Bytecode: 🟢 5, 2 unch. · avg +4.2%
Benchmark Interpreted Δ Bytecode Δ
for...of with 10-element array 22,477 ops/sec [19,953..22,777] → 24,836 ops/sec [24,170..25,158] 🟢 +10.5% 89,438 ops/sec [88,577..91,054] → 92,868 ops/sec [91,510..96,134] 🟢 +3.8%
for...of with 100-element array 2,601 ops/sec [2,575..2,632] → 2,885 ops/sec [2,781..2,950] 🟢 +10.9% 10,450 ops/sec [10,432..10,515] → 10,816 ops/sec [10,678..11,225] 🟢 +3.5%
for...of with string (10 chars) 16,271 ops/sec [16,083..16,657] → 18,404 ops/sec [18,027..18,948] 🟢 +13.1% 36,015 ops/sec [35,632..36,266] → 36,604 ops/sec [36,220..36,798] ~ overlap (+1.6%)
for...of with Set (10 elements) 23,240 ops/sec [23,118..23,668] → 25,853 ops/sec [25,424..26,150] 🟢 +11.2% 88,628 ops/sec [85,708..89,956] → 90,713 ops/sec [90,318..91,422] 🟢 +2.4%
for...of with Map entries (10 entries) 14,896 ops/sec [14,738..15,366] → 16,676 ops/sec [16,465..16,856] 🟢 +12.0% 15,403 ops/sec [15,057..15,735] → 16,895 ops/sec [16,827..17,108] 🟢 +9.7%
for...of with destructuring 18,612 ops/sec [18,285..18,812] → 20,481 ops/sec [20,355..21,277] 🟢 +10.0% 20,353 ops/sec [20,321..20,428] → 21,834 ops/sec [21,585..22,076] 🟢 +7.3%
for-await-of with sync array 21,055 ops/sec [20,761..21,263] → 23,293 ops/sec [22,811..24,285] 🟢 +10.6% 64,611 ops/sec [63,795..64,888] → 65,305 ops/sec [64,583..65,492] ~ overlap (+1.1%)
helpers/bench-module.js — Interp: 0 · Bytecode: 0
Benchmark Interpreted Δ Bytecode Δ
iterators.js — Interp: 🟢 27, 15 unch. · avg +3.9% · Bytecode: 🟢 27, 🔴 2, 13 unch. · avg +3.9%
Benchmark Interpreted Δ Bytecode Δ
Iterator.from({next}).toArray() — 20 elements 6,386 ops/sec [6,357..6,421] → 6,632 ops/sec [6,608..6,651] 🟢 +3.9% 9,429 ops/sec [9,299..9,498] → 9,346 ops/sec [9,283..9,420] ~ overlap (-0.9%)
Iterator.from({next}).toArray() — 50 elements 2,715 ops/sec [2,689..2,778] → 2,828 ops/sec [2,820..2,848] 🟢 +4.1% 4,282 ops/sec [4,166..4,345] → 4,196 ops/sec [4,175..4,225] ~ overlap (-2.0%)
spread pre-wrapped iterator — 20 elements 5,122 ops/sec [5,070..5,169] → 5,294 ops/sec [5,235..5,362] 🟢 +3.4% 9,182 ops/sec [9,097..9,310] → 9,297 ops/sec [9,248..9,366] ~ overlap (+1.3%)
Iterator.from({next}).forEach — 50 elements 1,778 ops/sec [1,772..1,787] → 1,925 ops/sec [1,897..1,941] 🟢 +8.3% 2,828 ops/sec [2,819..2,843] → 2,815 ops/sec [2,788..2,823] ~ overlap (-0.5%)
Iterator.from({next}).reduce — 50 elements 1,814 ops/sec [1,796..1,836] → 1,976 ops/sec [1,945..1,991] 🟢 +9.0% 2,960 ops/sec [2,865..2,964] → 2,803 ops/sec [2,762..2,851] 🔴 -5.3%
wrap array iterator 74,821 ops/sec [72,716..76,127] → 77,083 ops/sec [76,322..77,426] 🟢 +3.0% 86,328 ops/sec [85,884..86,693] → 86,704 ops/sec [86,543..87,012] ~ overlap (+0.4%)
wrap plain {next()} object 4,417 ops/sec [4,341..4,469] → 4,686 ops/sec [4,651..4,694] 🟢 +6.1% 6,842 ops/sec [6,821..6,875] → 6,610 ops/sec [6,585..6,696] 🔴 -3.4%
map + toArray (50 elements) 1,835 ops/sec [1,826..1,843] → 1,932 ops/sec [1,909..1,944] 🟢 +5.3% 2,855 ops/sec [2,791..3,069] → 2,894 ops/sec [2,882..2,907] ~ overlap (+1.4%)
filter + toArray (50 elements) 1,801 ops/sec [1,779..1,806] → 1,934 ops/sec [1,917..1,944] 🟢 +7.4% 2,789 ops/sec [2,762..2,795] → 2,848 ops/sec [2,809..2,854] 🟢 +2.1%
take(10) + toArray (50 element source) 12,107 ops/sec [12,051..12,177] → 12,637 ops/sec [12,457..12,747] 🟢 +4.4% 17,325 ops/sec [17,207..17,399] → 17,344 ops/sec [17,239..17,417] ~ overlap (+0.1%)
drop(40) + toArray (50 element source) 2,816 ops/sec [2,782..2,822] → 2,889 ops/sec [2,845..2,950] 🟢 +2.6% 4,144 ops/sec [4,133..4,157] → 4,155 ops/sec [4,110..4,171] ~ overlap (+0.2%)
chained map + filter + take (100 element source) 3,394 ops/sec [3,351..3,427] → 3,729 ops/sec [3,586..3,866] 🟢 +9.9% 5,084 ops/sec [5,042..5,158] → 5,198 ops/sec [5,134..5,211] ~ overlap (+2.3%)
some + every (50 elements) 1,089 ops/sec [1,063..1,105] → 1,110 ops/sec [1,106..1,121] 🟢 +1.9% 1,647 ops/sec [1,628..1,659] → 1,663 ops/sec [1,661..1,669] 🟢 +1.0%
find (50 elements) 2,382 ops/sec [2,372..2,393] → 2,410 ops/sec [2,393..2,468] ~ overlap (+1.2%) 3,607 ops/sec [3,599..3,623] → 3,562 ops/sec [3,518..3,617] ~ overlap (-1.3%)
concat 2 arrays (10 + 10 elements) 70,754 ops/sec [68,036..71,500] → 76,047 ops/sec [75,077..78,139] 🟢 +7.5% 76,422 ops/sec [76,170..76,886] → 81,968 ops/sec [81,842..82,081] 🟢 +7.3%
concat 5 arrays (10 elements each) 42,606 ops/sec [41,009..42,646] → 44,834 ops/sec [44,106..46,010] 🟢 +5.2% 44,975 ops/sec [43,897..45,310] → 48,270 ops/sec [47,987..48,510] 🟢 +7.3%
concat 2 arrays (20 + 20 elements) 60,825 ops/sec [60,564..62,368] → 66,219 ops/sec [64,130..68,336] 🟢 +8.9% 66,303 ops/sec [65,659..66,509] → 70,517 ops/sec [69,945..70,851] 🟢 +6.4%
concat + filter + toArray (20 + 20 elements) 6,108 ops/sec [5,975..6,243] → 6,301 ops/sec [6,206..6,335] ~ overlap (+3.2%) 9,372 ops/sec [9,164..9,417] → 9,775 ops/sec [9,598..9,784] 🟢 +4.3%
concat + map + take (20 + 20 elements, take 10) 19,364 ops/sec [18,922..19,570] → 19,816 ops/sec [19,602..20,064] 🟢 +2.3% 27,095 ops/sec [26,984..27,338] → 27,913 ops/sec [27,895..28,085] 🟢 +3.0%
concat Sets (15 + 15 elements) 69,363 ops/sec [68,838..69,627] → 72,309 ops/sec [71,909..73,348] 🟢 +4.2% 75,172 ops/sec [74,510..75,561] → 79,477 ops/sec [78,228..80,085] 🟢 +5.7%
concat strings (13 + 13 characters) 52,614 ops/sec [51,838..53,096] → 53,141 ops/sec [51,050..53,644] ~ overlap (+1.0%) 53,465 ops/sec [52,819..54,197] → 54,529 ops/sec [54,023..54,890] ~ overlap (+2.0%)
zip 2 arrays (10 + 10 elements) 28,189 ops/sec [28,084..28,195] → 28,996 ops/sec [28,189..29,403] ~ overlap (+2.9%) 29,058 ops/sec [28,705..29,456] → 31,541 ops/sec [31,184..31,661] 🟢 +8.5%
zip 3 arrays (10 elements each) 25,966 ops/sec [25,621..26,426] → 26,335 ops/sec [26,068..26,829] ~ overlap (+1.4%) 26,554 ops/sec [26,418..26,933] → 28,931 ops/sec [28,773..29,092] 🟢 +9.0%
zip 2 arrays (20 + 20 elements) 18,779 ops/sec [18,687..19,041] → 19,410 ops/sec [18,948..19,682] ~ overlap (+3.4%) 19,491 ops/sec [19,135..19,951] → 20,880 ops/sec [20,571..21,188] 🟢 +7.1%
zip 2 arrays (50 + 50 elements) 9,785 ops/sec [9,535..9,861] → 9,780 ops/sec [9,560..9,847] ~ overlap (-0.1%) 9,898 ops/sec [9,630..9,977] → 10,634 ops/sec [10,478..10,667] 🟢 +7.4%
zip shortest mode (20 + 10 elements) 28,424 ops/sec [28,119..28,772] → 29,123 ops/sec [28,732..29,360] ~ overlap (+2.5%) 28,844 ops/sec [27,493..30,246] → 31,785 ops/sec [31,360..32,030] 🟢 +10.2%
zip longest mode (10 + 20 elements) 16,954 ops/sec [16,878..17,291] → 17,351 ops/sec [17,082..17,594] ~ overlap (+2.3%) 16,948 ops/sec [16,848..17,064] → 18,699 ops/sec [18,676..18,883] 🟢 +10.3%
zip strict mode (20 + 20 elements) 18,394 ops/sec [18,130..18,642] → 18,832 ops/sec [17,964..19,099] ~ overlap (+2.4%) 18,501 ops/sec [18,390..18,638] → 19,797 ops/sec [19,698..20,141] 🟢 +7.0%
zip + map + toArray (20 + 20 elements) 7,604 ops/sec [7,472..7,714] → 7,863 ops/sec [7,761..7,917] 🟢 +3.4% 5,739 ops/sec [5,666..5,786] → 6,145 ops/sec [6,040..6,190] 🟢 +7.1%
zip + filter + toArray (20 + 20 elements) 7,265 ops/sec [7,207..7,380] → 7,587 ops/sec [7,525..7,648] 🟢 +4.4% 5,682 ops/sec [5,669..5,729] → 6,369 ops/sec [6,330..6,394] 🟢 +12.1%
zip Sets (15 + 15 elements) 23,737 ops/sec [23,540..24,017] → 23,698 ops/sec [23,515..24,009] ~ overlap (-0.2%) 23,507 ops/sec [23,248..24,031] → 25,605 ops/sec [25,385..25,715] 🟢 +8.9%
zipKeyed 2 keys (10 elements each) 29,797 ops/sec [29,554..29,870] → 29,616 ops/sec [29,074..30,018] ~ overlap (-0.6%) 30,295 ops/sec [30,116..30,357] → 31,521 ops/sec [31,389..31,942] 🟢 +4.0%
zipKeyed 3 keys (20 elements each) 14,752 ops/sec [14,566..14,908] → 14,742 ops/sec [14,614..14,952] ~ overlap (-0.1%) 14,717 ops/sec [14,651..14,952] → 15,462 ops/sec [15,397..15,497] 🟢 +5.1%
zipKeyed longest mode (10 + 20 elements) 16,936 ops/sec [16,785..17,010] → 17,071 ops/sec [16,968..17,286] ~ overlap (+0.8%) 17,106 ops/sec [16,946..17,224] → 17,407 ops/sec [17,313..17,523] 🟢 +1.8%
zipKeyed strict mode (20 + 20 elements) 17,977 ops/sec [17,848..18,178] → 18,040 ops/sec [17,811..18,195] ~ overlap (+0.4%) 18,134 ops/sec [17,948..18,432] → 19,073 ops/sec [18,826..19,198] 🟢 +5.2%
zipKeyed + filter + map (20 elements) 5,557 ops/sec [5,541..5,589] → 5,720 ops/sec [5,699..5,795] 🟢 +2.9% 7,524 ops/sec [7,468..7,575] → 7,661 ops/sec [7,629..7,723] 🟢 +1.8%
array.values().map().filter().toArray() 2,939 ops/sec [2,928..2,953] → 3,093 ops/sec [3,030..3,184] 🟢 +5.3% 4,762 ops/sec [4,702..4,812] → 4,590 ops/sec [4,483..4,730] ~ overlap (-3.6%)
array.values().take(5).toArray() 97,843 ops/sec [97,734..99,422] → 103,320 ops/sec [101,393..103,550] 🟢 +5.6% 118,347 ops/sec [115,859..119,733] → 122,828 ops/sec [122,198..123,853] 🟢 +3.8%
array.values().drop(45).toArray() 78,954 ops/sec [78,139..79,619] → 84,339 ops/sec [81,858..85,696] 🟢 +6.8% 91,124 ops/sec [90,062..91,769] → 96,770 ops/sec [95,053..98,148] 🟢 +6.2%
map.entries() chained helpers 4,280 ops/sec [4,199..4,306] → 4,513 ops/sec [4,369..4,619] 🟢 +5.4% 3,019 ops/sec [2,992..3,081] → 3,280 ops/sec [3,226..3,316] 🟢 +8.6%
set.values() chained helpers 6,496 ops/sec [6,395..6,540] → 6,847 ops/sec [6,610..7,159] 🟢 +5.4% 9,833 ops/sec [9,705..10,130] → 10,257 ops/sec [10,098..10,582] ~ overlap (+4.3%)
string iterator map + toArray 5,975 ops/sec [5,928..6,015] → 6,340 ops/sec [6,312..6,558] 🟢 +6.1% 7,021 ops/sec [6,967..7,201] → 7,556 ops/sec [7,480..7,573] 🟢 +7.6%
json.js — Interp: 🟢 20 · avg +13.0% · Bytecode: 🟢 9, 🔴 2, 9 unch. · avg +2.2%
Benchmark Interpreted Δ Bytecode Δ
parse simple object 71,182 ops/sec [70,392..71,633] → 81,481 ops/sec [80,747..85,041] 🟢 +14.5% 74,148 ops/sec [73,557..74,460] → 77,376 ops/sec [76,528..78,556] 🟢 +4.4%
parse nested object 47,927 ops/sec [47,598..49,684] → 56,607 ops/sec [54,985..57,810] 🟢 +18.1% 49,200 ops/sec [48,483..49,823] → 49,190 ops/sec [48,822..49,673] ~ overlap (-0.0%)
parse array of objects 28,628 ops/sec [28,321..28,941] → 33,859 ops/sec [32,941..34,904] 🟢 +18.3% 29,391 ops/sec [29,238..29,530] → 30,201 ops/sec [29,829..30,586] 🟢 +2.8%
parse large flat object 30,577 ops/sec [30,167..30,945] → 36,563 ops/sec [36,018..37,909] 🟢 +19.6% 31,764 ops/sec [31,447..31,879] → 31,786 ops/sec [31,689..31,999] ~ overlap (+0.1%)
parse mixed types 34,662 ops/sec [33,834..35,272] → 41,439 ops/sec [40,799..41,917] 🟢 +19.6% 36,305 ops/sec [36,033..36,448] → 38,351 ops/sec [37,213..38,850] 🟢 +5.6%
stringify simple object 77,069 ops/sec [75,862..77,338] → 87,513 ops/sec [85,518..89,585] 🟢 +13.6% 78,433 ops/sec [77,868..78,828] → 81,344 ops/sec [81,061..81,441] 🟢 +3.7%
stringify nested object 44,809 ops/sec [44,419..45,695] → 51,165 ops/sec [49,579..51,938] 🟢 +14.2% 43,134 ops/sec [42,885..43,486] → 42,367 ops/sec [41,835..42,420] 🔴 -1.8%
stringify array of objects 18,550 ops/sec [18,373..18,578] → 21,181 ops/sec [20,795..22,790] 🟢 +14.2% 19,166 ops/sec [19,023..19,303] → 19,414 ops/sec [19,273..19,636] ~ overlap (+1.3%)
stringify mixed types 28,720 ops/sec [28,417..29,742] → 33,523 ops/sec [32,824..34,437] 🟢 +16.7% 28,588 ops/sec [28,129..28,736] → 30,095 ops/sec [29,831..30,317] 🟢 +5.3%
reviver doubles numbers 15,266 ops/sec [15,113..15,360] → 16,975 ops/sec [16,444..17,441] 🟢 +11.2% 17,947 ops/sec [17,666..18,410] → 18,692 ops/sec [18,622..18,912] 🟢 +4.2%
reviver filters properties 14,709 ops/sec [14,611..14,798] → 16,235 ops/sec [16,018..16,599] 🟢 +10.4% 16,156 ops/sec [16,096..16,242] → 17,412 ops/sec [17,202..17,790] 🟢 +7.8%
reviver on nested object 18,042 ops/sec [17,988..18,290] → 19,700 ops/sec [19,560..19,876] 🟢 +9.2% 20,043 ops/sec [19,899..20,417] → 20,894 ops/sec [19,939..21,872] ~ overlap (+4.2%)
reviver on array 9,554 ops/sec [9,518..9,571] → 10,348 ops/sec [10,265..10,387] 🟢 +8.3% 11,207 ops/sec [11,007..11,365] → 11,047 ops/sec [10,910..11,170] ~ overlap (-1.4%)
replacer function doubles numbers 18,476 ops/sec [18,082..18,581] → 19,629 ops/sec [19,500..19,994] 🟢 +6.2% 21,471 ops/sec [21,379..21,644] → 21,554 ops/sec [21,043..21,900] ~ overlap (+0.4%)
replacer function excludes properties 24,635 ops/sec [24,491..24,665] → 26,739 ops/sec [26,443..27,063] 🟢 +8.5% 25,404 ops/sec [24,593..25,743] → 25,284 ops/sec [25,132..25,467] ~ overlap (-0.5%)
array replacer (allowlist) 49,373 ops/sec [48,945..49,548] → 53,811 ops/sec [52,923..54,054] 🟢 +9.0% 45,858 ops/sec [45,254..47,028] → 47,053 ops/sec [46,761..47,483] ~ overlap (+2.6%)
stringify with 2-space indent 39,069 ops/sec [38,727..40,034] → 43,152 ops/sec [43,022..43,313] 🟢 +10.5% 40,174 ops/sec [39,702..40,592] → 41,469 ops/sec [40,702..42,260] 🟢 +3.2%
stringify with tab indent 39,483 ops/sec [38,684..40,281] → 44,032 ops/sec [43,436..44,580] 🟢 +11.5% 38,877 ops/sec [38,363..39,414] → 40,469 ops/sec [40,215..41,560] 🟢 +4.1%
parse then stringify 23,661 ops/sec [22,637..24,027] → 26,755 ops/sec [25,858..27,184] 🟢 +13.1% 24,669 ops/sec [24,520..25,174] → 24,386 ops/sec [24,269..24,518] 🔴 -1.1%
stringify then parse 13,603 ops/sec [13,553..13,926] → 15,313 ops/sec [15,157..15,501] 🟢 +12.6% 14,431 ops/sec [14,397..14,443] → 14,231 ops/sec [14,141..14,763] ~ overlap (-1.4%)
jsx.jsx — Interp: 🟢 21 · avg +9.7% · Bytecode: 🔴 3, 18 unch. · avg -0.1%
Benchmark Interpreted Δ Bytecode Δ
simple element 101,412 ops/sec [95,469..101,818] → 103,658 ops/sec [102,545..104,605] 🟢 +2.2% 146,938 ops/sec [143,725..148,624] → 144,926 ops/sec [143,611..146,220] ~ overlap (-1.4%)
self-closing element 99,820 ops/sec [99,379..100,571] → 118,606 ops/sec [108,543..119,592] 🟢 +18.8% 161,194 ops/sec [159,703..163,567] → 159,186 ops/sec [158,728..159,407] 🔴 -1.2%
element with string attribute 85,751 ops/sec [84,634..86,157] → 93,213 ops/sec [89,121..94,822] 🟢 +8.7% 115,656 ops/sec [114,752..118,968] → 116,762 ops/sec [114,920..117,758] ~ overlap (+1.0%)
element with multiple attributes 72,906 ops/sec [71,417..77,448] → 81,889 ops/sec [81,459..83,109] 🟢 +12.3% 90,571 ops/sec [89,118..91,889] → 89,831 ops/sec [89,418..89,924] ~ overlap (-0.8%)
element with expression attribute 76,335 ops/sec [75,607..76,975] → 84,026 ops/sec [82,532..84,936] 🟢 +10.1% 119,055 ops/sec [118,026..120,020] → 119,364 ops/sec [118,966..120,555] ~ overlap (+0.3%)
text child 94,372 ops/sec [93,965..95,069] → 103,903 ops/sec [103,344..103,980] 🟢 +10.1% 146,711 ops/sec [145,464..150,134] → 147,268 ops/sec [146,385..147,767] ~ overlap (+0.4%)
expression child 93,308 ops/sec [92,486..94,333] → 100,158 ops/sec [99,025..101,308] 🟢 +7.3% 146,611 ops/sec [145,991..147,713] → 145,012 ops/sec [144,566..145,768] 🔴 -1.1%
mixed text and expression 87,367 ops/sec [86,080..88,189] → 94,515 ops/sec [94,076..95,286] 🟢 +8.2% 125,621 ops/sec [124,927..126,424] → 123,621 ops/sec [123,150..124,724] 🔴 -1.6%
nested elements (3 levels) 36,768 ops/sec [36,432..37,496] → 39,223 ops/sec [38,839..40,072] 🟢 +6.7% 56,332 ops/sec [55,777..56,420] → 56,147 ops/sec [55,676..56,677] ~ overlap (-0.3%)
sibling children 27,325 ops/sec [27,130..27,407] → 29,724 ops/sec [28,962..30,055] 🟢 +8.8% 40,102 ops/sec [39,389..40,834] → 40,269 ops/sec [39,941..40,882] ~ overlap (+0.4%)
component element 72,326 ops/sec [71,366..73,014] → 77,230 ops/sec [76,164..79,888] 🟢 +6.8% 108,565 ops/sec [106,622..110,249] → 108,851 ops/sec [102,332..109,365] ~ overlap (+0.3%)
component with children 43,249 ops/sec [42,691..43,716] → 47,608 ops/sec [46,802..48,140] 🟢 +10.1% 64,290 ops/sec [64,130..64,560] → 64,438 ops/sec [64,288..64,684] ~ overlap (+0.2%)
dotted component 61,920 ops/sec [60,006..62,470] → 66,074 ops/sec [66,031..66,298] 🟢 +6.7% 82,468 ops/sec [81,753..83,994] → 84,183 ops/sec [83,699..85,475] ~ overlap (+2.1%)
empty fragment 95,988 ops/sec [94,206..97,166] → 106,713 ops/sec [104,227..107,797] 🟢 +11.2% 178,242 ops/sec [175,852..178,939] → 178,553 ops/sec [176,993..182,632] ~ overlap (+0.2%)
fragment with children 27,512 ops/sec [27,212..27,892] → 29,533 ops/sec [29,091..30,110] 🟢 +7.3% 41,705 ops/sec [40,996..41,898] → 41,314 ops/sec [40,682..41,801] ~ overlap (-0.9%)
spread attributes 51,645 ops/sec [50,224..52,121] → 57,404 ops/sec [56,483..58,947] 🟢 +11.2% 61,077 ops/sec [60,981..62,203] → 61,528 ops/sec [60,618..62,327] ~ overlap (+0.7%)
spread with overrides 45,582 ops/sec [43,935..46,626] → 51,481 ops/sec [50,657..52,176] 🟢 +12.9% 55,118 ops/sec [54,033..55,702] → 55,260 ops/sec [54,334..55,751] ~ overlap (+0.3%)
shorthand props 74,202 ops/sec [73,673..75,074] → 82,172 ops/sec [81,202..83,265] 🟢 +10.7% 108,030 ops/sec [107,368..110,509] → 106,381 ops/sec [105,617..107,392] ~ overlap (-1.5%)
nav bar structure 12,933 ops/sec [12,640..13,127] → 14,263 ops/sec [14,124..14,437] 🟢 +10.3% 18,714 ops/sec [18,354..19,119] → 18,891 ops/sec [18,689..18,953] ~ overlap (+0.9%)
card component tree 15,225 ops/sec [15,131..15,482] → 16,842 ops/sec [16,568..16,999] 🟢 +10.6% 20,905 ops/sec [20,866..20,947] → 20,927 ops/sec [20,780..21,101] ~ overlap (+0.1%)
10 list items via Array.from 6,690 ops/sec [6,656..6,728] → 7,499 ops/sec [7,436..7,556] 🟢 +12.1% 9,177 ops/sec [9,051..9,247] → 9,209 ops/sec [9,095..9,257] ~ overlap (+0.3%)
modules.js — Interp: 🟢 9 · avg +8.9% · Bytecode: 🟢 1, 🔴 3, 5 unch. · avg -0.4%
Benchmark Interpreted Δ Bytecode Δ
call imported function 164,591 ops/sec [161,950..166,731] → 179,179 ops/sec [176,128..185,338] 🟢 +8.9% 719,781 ops/sec [712,662..735,137] → 691,825 ops/sec [656,130..710,907] 🔴 -3.9%
call two imported functions 93,212 ops/sec [90,516..93,873] → 101,563 ops/sec [100,294..102,641] 🟢 +9.0% 464,589 ops/sec [461,570..466,848] → 450,948 ops/sec [449,779..455,455] 🔴 -2.9%
read imported constant 529,861 ops/sec [520,002..544,442] → 585,782 ops/sec [560,224..596,648] 🟢 +10.6% 1,946,913 ops/sec [1,937,450..1,951,548] → 2,039,729 ops/sec [2,034,373..2,046,530] 🟢 +4.8%
read imported string 535,114 ops/sec [530,682..545,451] → 571,941 ops/sec [562,994..600,546] 🟢 +6.9% 1,939,252 ops/sec [1,929,553..1,955,062] → 1,953,385 ops/sec [1,938,360..1,999,273] ~ overlap (+0.7%)
read JSON string property 538,999 ops/sec [525,933..552,242] → 577,916 ops/sec [563,142..599,782] 🟢 +7.2% 1,925,672 ops/sec [1,905,467..1,931,330] → 1,976,453 ops/sec [1,923,198..1,997,010] ~ overlap (+2.6%)
read JSON number property 538,984 ops/sec [520,913..544,805] → 592,857 ops/sec [563,662..609,060] 🟢 +10.0% 1,984,802 ops/sec [1,927,895..1,993,078] → 1,970,259 ops/sec [1,940,857..2,003,094] ~ overlap (-0.7%)
read JSON boolean property 543,766 ops/sec [535,915..550,538] → 591,163 ops/sec [563,461..599,559] 🟢 +8.7% 1,986,026 ops/sec [1,980,541..1,993,682] → 1,935,193 ops/sec [1,925,849..1,945,495] 🔴 -2.6%
read JSON array property 532,756 ops/sec [529,250..545,184] → 582,025 ops/sec [567,823..602,974] 🟢 +9.2% 1,927,561 ops/sec [1,920,411..1,936,278] → 1,926,448 ops/sec [1,914,182..1,937,666] ~ overlap (-0.1%)
read multiple JSON properties 330,697 ops/sec [328,230..331,441] → 362,210 ops/sec [359,384..363,215] 🟢 +9.5% 1,595,767 ops/sec [1,536,874..1,677,098] → 1,565,269 ops/sec [1,553,942..1,576,322] ~ overlap (-1.9%)
numbers.js — Interp: 🟢 11 · avg +14.4% · Bytecode: 🟢 7, 4 unch. · avg +5.3%
Benchmark Interpreted Δ Bytecode Δ
integer arithmetic 180,929 ops/sec [179,799..182,234] → 210,768 ops/sec [201,551..215,307] 🟢 +16.5% 571,194 ops/sec [565,489..576,950] → 698,611 ops/sec [697,304..704,367] 🟢 +22.3%
floating point arithmetic 206,086 ops/sec [201,710..210,775] → 241,010 ops/sec [231,426..252,608] 🟢 +16.9% 404,338 ops/sec [399,867..407,696] → 432,843 ops/sec [430,208..433,752] 🟢 +7.0%
number coercion 72,866 ops/sec [70,087..75,272] → 86,662 ops/sec [83,312..88,017] 🟢 +18.9% 90,414 ops/sec [88,850..92,183] → 92,767 ops/sec [92,026..93,770] ~ overlap (+2.6%)
toFixed 49,893 ops/sec [47,880..50,138] → 57,605 ops/sec [54,794..58,875] 🟢 +15.5% 56,722 ops/sec [55,947..57,454] → 59,703 ops/sec [59,118..60,286] 🟢 +5.3%
toString 65,931 ops/sec [65,543..67,208] → 75,067 ops/sec [70,484..77,154] 🟢 +13.9% 81,349 ops/sec [79,764..82,782] → 83,438 ops/sec [82,941..86,802] 🟢 +2.6%
valueOf 97,640 ops/sec [94,733..99,587] → 110,714 ops/sec [108,098..113,230] 🟢 +13.4% 118,064 ops/sec [116,256..120,152] → 127,890 ops/sec [127,654..128,130] 🟢 +8.3%
toPrecision 44,181 ops/sec [42,768..44,592] → 48,019 ops/sec [46,716..48,879] 🟢 +8.7% 47,517 ops/sec [47,009..47,806] → 47,055 ops/sec [46,896..47,403] ~ overlap (-1.0%)
Number.isNaN 118,987 ops/sec [118,516..122,656] → 136,677 ops/sec [132,345..138,160] 🟢 +14.9% 124,442 ops/sec [121,108..125,600] → 126,721 ops/sec [125,210..127,224] ~ overlap (+1.8%)
Number.isFinite 117,094 ops/sec [115,141..120,441] → 131,121 ops/sec [129,496..142,029] 🟢 +12.0% 117,480 ops/sec [115,922..121,654] → 120,679 ops/sec [120,089..121,855] ~ overlap (+2.7%)
Number.isInteger 121,141 ops/sec [120,050..123,511] → 138,281 ops/sec [133,725..142,995] 🟢 +14.1% 130,620 ops/sec [129,352..131,883] → 134,374 ops/sec [131,897..134,988] 🟢 +2.9%
Number.parseInt and parseFloat 99,565 ops/sec [99,271..99,804] → 112,837 ops/sec [109,653..113,403] 🟢 +13.3% 98,973 ops/sec [96,413..101,193] → 102,704 ops/sec [102,175..103,431] 🟢 +3.8%
objects.js — Interp: 🟢 7 · avg +10.0% · Bytecode: 🟢 1, 🔴 4, 2 unch. · avg -4.0%
Benchmark Interpreted Δ Bytecode Δ
create simple object 218,222 ops/sec [214,235..220,942] → 240,798 ops/sec [229,723..244,171] 🟢 +10.3% 271,161 ops/sec [269,760..274,783] → 242,299 ops/sec [241,052..245,566] 🔴 -10.6%
create nested object 115,498 ops/sec [112,862..118,037] → 125,823 ops/sec [121,988..126,443] 🟢 +8.9% 117,674 ops/sec [115,759..118,817] → 107,650 ops/sec [106,885..107,918] 🔴 -8.5%
create 50 objects via Array.from 4,116 ops/sec [4,024..4,205] → 4,439 ops/sec [4,395..4,602] 🟢 +7.9% 4,789 ops/sec [4,682..4,829] → 4,345 ops/sec [4,317..4,399] 🔴 -9.3%
property read 212,440 ops/sec [210,746..217,950] → 237,943 ops/sec [236,126..245,700] 🟢 +12.0% 300,820 ops/sec [291,697..306,413] → 298,016 ops/sec [295,042..301,083] ~ overlap (-0.9%)
Object.keys 123,914 ops/sec [121,656..125,300] → 140,427 ops/sec [139,446..141,004] 🟢 +13.3% 138,375 ops/sec [135,916..139,366] → 136,050 ops/sec [135,442..136,951] ~ overlap (-1.7%)
Object.entries 50,612 ops/sec [49,762..51,313] → 56,148 ops/sec [55,703..56,739] 🟢 +10.9% 50,404 ops/sec [50,227..51,316] → 53,910 ops/sec [52,404..54,269] 🟢 +7.0%
spread operator 92,587 ops/sec [91,068..93,702] → 98,545 ops/sec [97,402..103,634] 🟢 +6.4% 97,306 ops/sec [97,076..98,038] → 93,377 ops/sec [92,165..94,544] 🔴 -4.0%
promises.js — Interp: 🟢 12 · avg +8.3% · Bytecode: 🟢 8, 4 unch. · avg +4.5%
Benchmark Interpreted Δ Bytecode Δ
Promise.resolve(value) 211,116 ops/sec [206,761..212,465] → 228,508 ops/sec [222,749..234,477] 🟢 +8.2% 253,386 ops/sec [252,037..254,797] → 253,864 ops/sec [251,928..256,108] ~ overlap (+0.2%)
new Promise(resolve => resolve(value)) 82,378 ops/sec [80,588..83,242] → 89,009 ops/sec [86,482..90,474] 🟢 +8.0% 108,343 ops/sec [106,806..109,920] → 109,848 ops/sec [108,763..110,359] ~ overlap (+1.4%)
Promise.reject(reason) 217,644 ops/sec [214,612..221,390] → 233,399 ops/sec [228,054..236,689] 🟢 +7.2% 234,379 ops/sec [234,012..235,435] → 257,724 ops/sec [239,428..259,393] 🟢 +10.0%
resolve + then (1 handler) 77,951 ops/sec [76,511..78,992] → 84,384 ops/sec [81,813..86,165] 🟢 +8.3% 99,040 ops/sec [97,763..99,785] → 105,798 ops/sec [104,883..106,131] 🟢 +6.8%
resolve + then chain (3 deep) 32,736 ops/sec [32,080..33,119] → 34,563 ops/sec [33,381..34,756] 🟢 +5.6% 40,529 ops/sec [40,414..41,358] → 44,095 ops/sec [43,824..44,559] 🟢 +8.8%
resolve + then chain (10 deep) 10,768 ops/sec [10,615..10,833] → 11,763 ops/sec [11,320..11,878] 🟢 +9.2% 13,393 ops/sec [13,218..13,815] → 14,323 ops/sec [14,288..14,404] 🟢 +6.9%
reject + catch + then 46,583 ops/sec [46,368..46,938] → 49,805 ops/sec [49,080..49,828] 🟢 +6.9% 55,640 ops/sec [54,262..56,563] → 59,716 ops/sec [58,973..59,775] 🟢 +7.3%
resolve + finally + then 39,294 ops/sec [38,201..40,669] → 43,448 ops/sec [42,394..43,671] 🟢 +10.6% 48,182 ops/sec [47,296..48,676] → 48,032 ops/sec [47,706..48,190] ~ overlap (-0.3%)
Promise.all (5 resolved) 15,958 ops/sec [15,717..16,394] → 17,435 ops/sec [17,176..17,652] 🟢 +9.3% 16,506 ops/sec [16,469..16,545] → 16,808 ops/sec [16,644..16,961] 🟢 +1.8%
Promise.race (5 resolved) 16,895 ops/sec [16,365..17,123] → 18,546 ops/sec [17,827..19,121] 🟢 +9.8% 16,925 ops/sec [16,667..17,203] → 17,363 ops/sec [17,059..17,791] ~ overlap (+2.6%)
Promise.allSettled (5 mixed) 13,625 ops/sec [13,433..13,746] → 14,838 ops/sec [14,541..15,079] 🟢 +8.9% 13,683 ops/sec [13,593..13,731] → 14,303 ops/sec [14,137..14,458] 🟢 +4.5%
Promise.any (5 mixed) 16,013 ops/sec [15,590..16,168] → 17,258 ops/sec [17,019..17,343] 🟢 +7.8% 16,081 ops/sec [15,993..16,138] → 16,698 ops/sec [16,263..17,106] 🟢 +3.8%
regexp.js — Interp: 🟢 11 · avg +13.0% · Bytecode: 🟢 1, 🔴 4, 6 unch. · avg -0.5%
Benchmark Interpreted Δ Bytecode Δ
regex literal creation 74,643 ops/sec [74,047..75,333] → 80,915 ops/sec [80,330..81,839] 🟢 +8.4% 64,846 ops/sec [64,766..65,186] → 64,312 ops/sec [64,126..64,462] 🔴 -0.8%
new RegExp(pattern, flags) 64,510 ops/sec [62,484..65,350] → 70,243 ops/sec [69,698..70,605] 🟢 +8.9% 63,700 ops/sec [62,842..64,279] → 63,106 ops/sec [62,333..63,605] ~ overlap (-0.9%)
RegExp(existingRegex) returns the same regex 277,947 ops/sec [276,448..278,297] → 293,239 ops/sec [287,265..299,421] 🟢 +5.5% 414,362 ops/sec [406,843..419,141] → 395,579 ops/sec [389,674..399,140] 🔴 -4.5%
test() on a global regex 68,597 ops/sec [67,850..68,725] → 78,623 ops/sec [74,684..80,264] 🟢 +14.6% 77,470 ops/sec [77,076..78,034] → 76,556 ops/sec [76,246..76,732] 🔴 -1.2%
exec() with capture groups 57,103 ops/sec [54,797..60,989] → 67,408 ops/sec [67,220..67,775] 🟢 +18.0% 65,907 ops/sec [65,881..66,138] → 64,976 ops/sec [64,781..65,284] 🔴 -1.4%
toString() 198,131 ops/sec [197,192..198,670] → 229,009 ops/sec [228,076..231,293] 🟢 +15.6% 286,158 ops/sec [283,629..291,885] → 283,421 ops/sec [275,766..288,567] ~ overlap (-1.0%)
match() with global regex 19,708 ops/sec [19,473..19,989] → 22,599 ops/sec [22,046..23,089] 🟢 +14.7% 19,074 ops/sec [18,727..19,356] → 19,332 ops/sec [18,713..20,042] ~ overlap (+1.4%)
matchAll() with capture groups 10,011 ops/sec [9,964..10,203] → 12,424 ops/sec [11,548..12,549] 🟢 +24.1% 12,079 ops/sec [11,863..12,181] → 12,493 ops/sec [12,222..12,667] 🟢 +3.4%
replace() with global regex 19,058 ops/sec [18,993..19,294] → 21,559 ops/sec [21,218..21,867] 🟢 +13.1% 19,023 ops/sec [18,863..19,166] → 18,948 ops/sec [18,622..19,586] ~ overlap (-0.4%)
search() with regex 39,246 ops/sec [38,693..39,522] → 43,651 ops/sec [42,788..44,316] 🟢 +11.2% 37,584 ops/sec [37,406..37,661] → 37,693 ops/sec [36,931..38,886] ~ overlap (+0.3%)
split() with regex separator 20,159 ops/sec [19,988..20,267] → 21,885 ops/sec [21,522..22,120] 🟢 +8.6% 19,499 ops/sec [19,278..19,583] → 19,462 ops/sec [19,220..19,752] ~ overlap (-0.2%)
strings.js — Interp: 🟢 11, 🔴 3, 5 unch. · avg -1.8% · Bytecode: 🟢 16, 🔴 1, 2 unch. · avg +13.4%
Benchmark Interpreted Δ Bytecode Δ
string concatenation 174,723 ops/sec [169,903..175,901] → 175,669 ops/sec [171,926..178,698] ~ overlap (+0.5%) 109,789 ops/sec [108,962..110,386] → 114,186 ops/sec [111,617..115,989] 🟢 +4.0%
template literal 316,605 ops/sec [309,671..325,137] → 317,429 ops/sec [311,564..327,047] ~ overlap (+0.3%) 195,757 ops/sec [194,790..197,049] → 202,895 ops/sec [197,716..205,740] 🟢 +3.6%
string repeat 182,673 ops/sec [178,421..183,604] → 187,727 ops/sec [185,894..190,970] 🟢 +2.8% 209,860 ops/sec [207,813..210,708] → 223,535 ops/sec [218,074..226,317] 🟢 +6.5%
split and join 65,568 ops/sec [63,763..66,619] → 66,848 ops/sec [65,957..67,241] ~ overlap (+2.0%) 68,441 ops/sec [67,692..68,838] → 73,290 ops/sec [71,005..74,422] 🟢 +7.1%
indexOf and includes 77,944 ops/sec [76,653..80,414] → 78,543 ops/sec [77,146..81,703] ~ overlap (+0.8%) 81,899 ops/sec [81,422..81,952] → 86,932 ops/sec [86,051..89,248] 🟢 +6.1%
toUpperCase and toLowerCase 115,874 ops/sec [114,976..117,279] → 117,179 ops/sec [115,226..119,052] ~ overlap (+1.1%) 144,972 ops/sec [144,226..146,224] → 155,393 ops/sec [152,716..157,779] 🟢 +7.2%
slice and substring 72,263 ops/sec [71,878..72,785] → 74,424 ops/sec [73,774..75,871] 🟢 +3.0% 87,095 ops/sec [86,172..87,486] → 94,022 ops/sec [91,177..98,035] 🟢 +8.0%
trim operations 86,861 ops/sec [84,590..88,800] → 91,435 ops/sec [90,892..91,794] 🟢 +5.3% 104,690 ops/sec [103,487..105,449] → 112,543 ops/sec [111,416..116,261] 🟢 +7.5%
replace and replaceAll 94,817 ops/sec [94,106..95,559] → 100,226 ops/sec [99,647..102,543] 🟢 +5.7% 98,427 ops/sec [97,538..99,029] → 105,738 ops/sec [102,281..107,665] 🟢 +7.4%
startsWith and endsWith 62,394 ops/sec [61,213..63,575] → 65,848 ops/sec [64,732..67,076] 🟢 +5.5% 64,133 ops/sec [63,119..66,532] → 73,522 ops/sec [72,680..73,960] 🟢 +14.6%
padStart and padEnd 91,629 ops/sec [90,106..92,934] → 96,958 ops/sec [96,537..98,012] 🟢 +5.8% 100,429 ops/sec [97,072..101,348] → 111,016 ops/sec [110,926..111,199] 🟢 +10.5%
identity tag, no substitutions 179,840 ops/sec [178,292..180,876] → 189,491 ops/sec [186,608..194,029] 🟢 +5.4% 566,185 ops/sec [560,191..571,096] → 569,117 ops/sec [556,715..582,427] ~ overlap (+0.5%)
tag with 1 substitution 38,196 ops/sec [37,440..39,175] → 40,525 ops/sec [39,942..40,872] 🟢 +6.1% 50,809 ops/sec [50,261..50,996] → 53,173 ops/sec [52,141..53,480] 🟢 +4.7%
tag with 3 substitutions 20,128 ops/sec [20,125..20,171] → 22,322 ops/sec [21,963..23,114] 🟢 +10.9% 27,627 ops/sec [27,478..27,939] → 52,131 ops/sec [31,074..52,440] 🟢 +88.7%
tag with 6 substitutions 12,236 ops/sec [12,160..12,370] → 12,997 ops/sec [12,885..13,551] 🟢 +6.2% 17,159 ops/sec [16,820..17,313] → 30,205 ops/sec [30,094..30,392] 🟢 +76.0%
String.raw, no substitutions 246,743 ops/sec [240,209..249,571] → 260,507 ops/sec [257,804..267,965] 🟢 +5.6% 251,115 ops/sec [246,922..252,180] → 261,239 ops/sec [259,433..264,819] 🟢 +4.0%
String.raw, 2 substitutions 293,357 ops/sec [290,462..298,531] → 188,764 ops/sec [184,535..190,547] 🔴 -35.7% 186,925 ops/sec [184,997..188,039] → 183,264 ops/sec [178,747..184,920] 🔴 -2.0%
tag accessing .raw array 115,861 ops/sec [115,416..116,719] → 77,984 ops/sec [76,813..79,312] 🔴 -32.7% 97,567 ops/sec [95,250..98,243] → 95,750 ops/sec [94,430..97,862] ~ overlap (-1.9%)
method as tag (this binding) 43,816 ops/sec [43,239..44,446] → 29,818 ops/sec [29,502..30,154] 🔴 -31.9% 39,696 ops/sec [39,506..40,129] → 40,652 ops/sec [40,472..40,898] 🟢 +2.4%
tsv.js — Interp: 🟢 9 · avg +11.1% · Bytecode: 🟢 1, 🔴 4, 4 unch. · avg -3.2%
Benchmark Interpreted Δ Bytecode Δ
parse simple 3-column TSV 48,782 ops/sec [48,688..48,968] → 53,215 ops/sec [52,561..54,743] 🟢 +9.1% 50,975 ops/sec [49,797..51,452] → 49,129 ops/sec [48,897..49,241] 🔴 -3.6%
parse 10-row TSV 13,227 ops/sec [13,096..13,539] → 14,980 ops/sec [14,446..15,451] 🟢 +13.3% 13,286 ops/sec [12,844..13,708] → 13,130 ops/sec [13,088..13,164] ~ overlap (-1.2%)
parse 100-row TSV 2,066 ops/sec [2,017..2,170] → 2,358 ops/sec [2,339..2,432] 🟢 +14.2% 2,091 ops/sec [2,051..2,143] → 2,073 ops/sec [2,061..2,081] ~ overlap (-0.8%)
parse TSV with backslash-escaped fields 9,493 ops/sec [9,360..9,796] → 10,715 ops/sec [10,573..11,460] 🟢 +12.9% 9,912 ops/sec [9,767..9,955] → 9,889 ops/sec [9,759..9,900] ~ overlap (-0.2%)
parse without headers (array of arrays) 6,030 ops/sec [5,828..6,087] → 6,443 ops/sec [6,405..6,495] 🟢 +6.8% 5,695 ops/sec [5,613..5,759] → 5,957 ops/sec [5,933..6,129] 🟢 +4.6%
stringify array of objects 40,932 ops/sec [39,783..41,183] → 44,203 ops/sec [44,136..44,261] 🟢 +8.0% 44,693 ops/sec [44,162..45,233] → 40,436 ops/sec [40,029..41,352] 🔴 -9.5%
stringify array of arrays 11,563 ops/sec [11,512..11,885] → 13,013 ops/sec [12,960..13,095] 🟢 +12.5% 12,518 ops/sec [12,228..12,630] → 10,897 ops/sec [10,669..11,016] 🔴 -12.9%
stringify with values needing escaping 31,691 ops/sec [31,001..32,708] → 35,795 ops/sec [35,425..36,112] 🟢 +13.0% 33,969 ops/sec [33,814..34,023] → 32,938 ops/sec [32,620..33,123] 🔴 -3.0%
parse then stringify 7,495 ops/sec [7,221..7,579] → 8,289 ops/sec [8,222..8,490] 🟢 +10.6% 7,425 ops/sec [7,393..7,442] → 7,294 ops/sec [7,220..7,466] ~ overlap (-1.8%)
typed-arrays.js — Interp: 🟢 18, 🔴 3, 1 unch. · avg +6.8% · Bytecode: 🟢 22 · avg +10.7%
Benchmark Interpreted Δ Bytecode Δ
new Int32Array(0) 215,586 ops/sec [215,398..216,081] → 238,427 ops/sec [236,949..239,717] 🟢 +10.6% 263,075 ops/sec [262,244..263,844] → 292,784 ops/sec [292,519..293,183] 🟢 +11.3%
new Int32Array(100) 200,154 ops/sec [199,385..201,075] → 223,288 ops/sec [218,568..225,130] 🟢 +11.6% 243,069 ops/sec [241,200..243,375] → 263,632 ops/sec [262,716..264,861] 🟢 +8.5%
new Int32Array(1000) 137,925 ops/sec [136,939..138,226] → 139,069 ops/sec [138,443..139,159] 🟢 +0.8% 157,894 ops/sec [156,771..159,271] → 184,366 ops/sec [183,834..184,882] 🟢 +16.8%
new Float64Array(100) 188,549 ops/sec [187,439..190,320] → 203,858 ops/sec [200,904..204,846] 🟢 +8.1% 227,345 ops/sec [225,391..228,748] → 246,943 ops/sec [245,839..247,014] 🟢 +8.6%
Int32Array.from([...]) 145,084 ops/sec [144,445..145,385] → 150,011 ops/sec [149,293..150,894] 🟢 +3.4% 163,684 ops/sec [161,610..165,541] → 187,438 ops/sec [186,078..188,577] 🟢 +14.5%
Int32Array.of(1, 2, 3, 4, 5) 217,098 ops/sec [215,177..217,708] → 232,741 ops/sec [232,079..233,702] 🟢 +7.2% 265,793 ops/sec [264,123..267,583] → 282,270 ops/sec [280,128..283,235] 🟢 +6.2%
sequential write 100 elements 2,713 ops/sec [2,702..2,725] → 2,854 ops/sec [2,818..2,878] 🟢 +5.2% 9,599 ops/sec [9,560..9,664] → 10,205 ops/sec [10,090..10,272] 🟢 +6.3%
sequential read 100 elements 2,734 ops/sec [2,706..2,735] → 2,881 ops/sec [2,870..2,882] 🟢 +5.4% 9,352 ops/sec [9,247..9,489] → 9,735 ops/sec [9,589..10,066] 🟢 +4.1%
Float64Array write 100 elements 2,504 ops/sec [2,486..2,515] → 2,662 ops/sec [2,650..2,665] 🟢 +6.3% 5,822 ops/sec [5,758..5,853] → 7,413 ops/sec [7,199..7,518] 🟢 +27.3%
fill(42) 45,651 ops/sec [45,519..45,719] → 44,116 ops/sec [43,793..45,232] 🔴 -3.4% 47,263 ops/sec [47,131..47,310] → 58,705 ops/sec [58,584..58,758] 🟢 +24.2%
slice() 164,626 ops/sec [164,387..165,493] → 163,159 ops/sec [162,566..163,967] 🔴 -0.9% 197,043 ops/sec [195,868..197,421] → 222,454 ops/sec [221,681..222,885] 🟢 +12.9%
map(x => x * 2) 4,653 ops/sec [4,641..4,670] → 5,432 ops/sec [5,394..5,436] 🟢 +16.7% 7,013 ops/sec [6,882..7,087] → 7,594 ops/sec [7,538..7,631] 🟢 +8.3%
filter(x => x > 50) 5,042 ops/sec [5,018..5,045] → 5,682 ops/sec [5,642..5,692] 🟢 +12.7% 7,864 ops/sec [7,806..7,896] → 8,442 ops/sec [8,405..8,482] 🟢 +7.4%
reduce (sum) 4,777 ops/sec [4,758..4,787] → 5,573 ops/sec [5,535..5,585] 🟢 +16.7% 6,700 ops/sec [6,667..6,731] → 7,214 ops/sec [7,195..7,223] 🟢 +7.7%
sort() 145,479 ops/sec [144,500..146,220] → 141,830 ops/sec [141,012..142,548] 🔴 -2.5% 171,248 ops/sec [156,574..171,716] → 199,244 ops/sec [198,719..199,305] 🟢 +16.3%
indexOf() 308,637 ops/sec [307,558..309,171] → 335,408 ops/sec [332,435..337,432] 🟢 +8.7% 420,364 ops/sec [419,632..420,904] → 468,618 ops/sec [467,860..470,142] 🟢 +11.5%
reverse() 255,748 ops/sec [254,855..256,816] → 257,454 ops/sec [255,803..258,454] ~ overlap (+0.7%) 328,701 ops/sec [328,361..329,154] → 367,638 ops/sec [366,951..368,600] 🟢 +11.8%
create view over existing buffer 249,745 ops/sec [249,115..251,281] → 277,949 ops/sec [276,908..280,332] 🟢 +11.3% 315,992 ops/sec [315,748..317,766] → 348,444 ops/sec [347,202..349,118] 🟢 +10.3%
subarray() 291,158 ops/sec [289,599..293,247] → 320,983 ops/sec [316,878..323,950] 🟢 +10.2% 408,692 ops/sec [406,289..413,727] → 424,684 ops/sec [422,920..427,618] 🟢 +3.9%
set() from array 375,417 ops/sec [374,482..375,860] → 414,976 ops/sec [412,359..415,922] 🟢 +10.5% 504,275 ops/sec [501,542..504,895] → 537,975 ops/sec [536,753..539,928] 🟢 +6.7%
for-of loop 4,034 ops/sec [4,011..4,056] → 4,325 ops/sec [4,311..4,335] 🟢 +7.2% 13,939 ops/sec [13,650..14,115] → 15,019 ops/sec [14,909..15,080] 🟢 +7.7%
spread into array 14,387 ops/sec [14,195..14,573] → 14,802 ops/sec [14,699..15,155] 🟢 +2.9% 62,174 ops/sec [62,111..62,357] → 64,722 ops/sec [64,521..65,166] 🟢 +4.1%
uint8array-encoding.js — Interp: 🟢 16, 2 unch. · avg +38.9% · Bytecode: 🟢 8, 🔴 9, 1 unch. · avg -10.9%
Benchmark Interpreted Δ Bytecode Δ
short (5 bytes) 281,280 ops/sec [278,330..282,875] → 305,688 ops/sec [302,553..311,076] 🟢 +8.7% 469,763 ops/sec [462,606..471,927] → 485,372 ops/sec [482,982..491,138] 🟢 +3.3%
medium (450 bytes) 151,107 ops/sec [149,287..151,936] → 170,144 ops/sec [166,970..171,521] 🟢 +12.6% 192,968 ops/sec [188,324..194,653] → 208,040 ops/sec [204,745..211,416] 🟢 +7.8%
large (4096 bytes) 31,425 ops/sec [31,147..31,690] → 34,753 ops/sec [32,565..35,346] 🟢 +10.6% 33,829 ops/sec [33,363..34,226] → 35,604 ops/sec [34,721..36,628] 🟢 +5.2%
base64url alphabet 105,954 ops/sec [104,384..107,039] → 118,987 ops/sec [117,700..119,421] 🟢 +12.3% 119,040 ops/sec [117,315..119,595] → 124,440 ops/sec [122,262..127,034] 🟢 +4.5%
omitPadding 163,939 ops/sec [160,992..164,788] → 176,670 ops/sec [173,339..277,312] 🟢 +7.8% 209,422 ops/sec [208,581..210,452] → 218,197 ops/sec [217,896..218,353] 🟢 +4.2%
short (8 chars) 145,267 ops/sec [143,715..145,950] → 245,855 ops/sec [243,477..249,606] 🟢 +69.2% 274,846 ops/sec [272,963..275,792] → 175,821 ops/sec [173,431..178,364] 🔴 -36.0%
medium (600 chars) 70,039 ops/sec [69,707..70,241] → 121,894 ops/sec [119,519..123,409] 🟢 +74.0% 129,565 ops/sec [128,428..130,797] → 127,252 ops/sec [77,454..128,196] 🔴 -1.8%
large (5464 chars) 13,331 ops/sec [12,822..13,510] → 23,550 ops/sec [22,283..24,581] 🟢 +76.7% 24,640 ops/sec [24,113..24,937] → 23,029 ops/sec [22,816..23,156] 🔴 -6.5%
short (5 bytes) 287,405 ops/sec [286,643..288,521] → 527,606 ops/sec [521,747..528,839] 🟢 +83.6% 852,882 ops/sec [849,838..860,181] → 523,630 ops/sec [481,849..525,405] 🔴 -38.6%
medium (450 bytes) 132,917 ops/sec [130,934..133,981] → 212,961 ops/sec [212,448..213,718] 🟢 +60.2% 275,392 ops/sec [274,671..277,229] → 171,162 ops/sec [170,448..172,405] 🔴 -37.8%
large (4096 bytes) 24,266 ops/sec [23,762..25,036] → 37,247 ops/sec [35,283..37,477] 🟢 +53.5% 42,811 ops/sec [42,431..43,481] → 26,907 ops/sec [26,670..28,184] 🔴 -37.1%
short (10 chars) 169,788 ops/sec [162,945..170,066] → 262,900 ops/sec [260,979..264,331] 🟢 +54.8% 297,397 ops/sec [296,242..299,165] → 187,887 ops/sec [186,536..190,489] 🔴 -36.8%
medium (900 chars) 104,727 ops/sec [104,531..106,830] → 179,425 ops/sec [176,134..181,670] 🟢 +71.3% 200,552 ops/sec [200,282..202,785] → 122,774 ops/sec [122,095..123,746] 🔴 -38.8%
large (8192 chars) 25,768 ops/sec [25,119..26,260] → 50,255 ops/sec [49,055..50,637] 🟢 +95.0% 51,862 ops/sec [51,735..52,706] → 48,160 ops/sec [32,277..60,501] ~ overlap (-7.1%)
setFromBase64 (450 bytes) 116,055 ops/sec [101,959..116,994] → 120,280 ops/sec [119,293..123,342] 🟢 +3.6% 129,008 ops/sec [127,964..131,579] → 125,503 ops/sec [125,376..125,571] 🔴 -2.7%
setFromHex (450 bytes) 166,018 ops/sec [165,733..166,712] → 168,089 ops/sec [164,545..169,772] ~ overlap (+1.2%) 191,559 ops/sec [190,935..192,217] → 210,182 ops/sec [207,264..213,332] 🟢 +9.7%
toBase64 → fromBase64 (450 bytes) 86,137 ops/sec [85,068..86,421] → 87,309 ops/sec [86,304..87,576] ~ overlap (+1.4%) 91,723 ops/sec [91,004..92,405] → 96,351 ops/sec [95,090..96,587] 🟢 +5.0%
toHex → fromHex (450 bytes) 109,576 ops/sec [109,337..110,451] → 112,671 ops/sec [110,829..112,982] 🟢 +2.8% 121,897 ops/sec [121,449..122,885] → 131,693 ops/sec [130,797..132,493] 🟢 +8.0%

Measured on ubuntu-latest x64. Benchmark ranges compare cached main-branch min/max ops/sec with the PR run; overlapping ranges are treated as unchanged noise. Percentage deltas are secondary context.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 27, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 8024 8024
Tests Passed 7983 ✅ 8024 ✅
Tests Skipped 41 0
Tests Workers 4 4
Tests Test Duration 1.60s 1.80s
Tests Lex (cumulative) 192.5ms 133.3ms
Tests Parse (cumulative) 277.9ms 296.2ms
Tests Compile (cumulative) 197.1ms
Tests Execute (cumulative) 1.30s 1.44s
Tests Engine Total (cumulative) 1.77s 2.07s
Tests Lex (avg/worker) 48.1ms 33.3ms
Tests Parse (avg/worker) 69.5ms 74.1ms
Tests Compile (avg/worker) 49.3ms
Tests Execute (avg/worker) 325.1ms 360.0ms
Tests Engine Total (avg/worker) 442.7ms 516.6ms
Benchmarks Total 386 386
Benchmarks Workers 4 4
Benchmarks Duration 3.01min 2.85min

Measured on ubuntu-latest x64.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@scripts/test-cli-apps.ts`:
- Around line 547-560: The HTTPS smoke test spawns LOADER with Bun.spawnSync and
lacks a timeout, so network stalls can hang the test matrix; update the
Bun.spawnSync call in the HTTPS fetch block to include a timeout (e.g., timeout:
10_000) and then check proc.exitedDueToTimeout after the call, throwing an
appropriate error if true (matching the existing timeout-handling pattern used
elsewhere in this file) before validating proc.exitCode, json.ok, and
json.value.

In `@source/shared/TransportSecurity.pas`:
- Around line 491-507: ReadOpenSSL and WriteOpenSSL must not return raw
SslRead/SslWrite values; replicate the SSL_get_error handling from
SecureTransport (the block around SecureTransport lines ~300–325) so
non-positive results are mapped: call SSL_get_error(Data.SSL, rc) and treat
SSL_ERROR_ZERO_RETURN as a graceful EOF (return 0),
SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE as a non-fatal retry condition
(preserve the same retry indication used by SecureTransport), and raise
ETransportSecurityError for SSL_ERROR_SSL and other fatal errors; update
ReadOpenSSL and WriteOpenSSL (using TOpenSSLData and Data.SSL) to implement this
mapping instead of returning SslRead/SslWrite directly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: cc78e3b0-cd41-4599-a9df-fc3440047407

📥 Commits

Reviewing files that changed from the base of the PR and between fb7ccd9 and 0fed280.

📒 Files selected for processing (5)
  • .github/workflows/ci.yml
  • docs/built-ins.md
  • scripts/test-cli-apps.ts
  • source/shared/HTTPClient.pas
  • source/shared/TransportSecurity.pas

Comment thread scripts/test-cli-apps.ts
Comment thread source/shared/TransportSecurity.pas
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@source/shared/TransportSecurity.pas`:
- Around line 697-706: The function ReceiveIntoBuffer currently returns Boolean
and collapses recv==0 and recv==-1; change ReceiveIntoBuffer to return an
Integer (signed byte count) and return the raw Count from SocketReceive so
callers can see negative error codes, keep the local Temporary buffer and only
call AppendBytes(ABuffer, ...) when Count > 0; update all callers (notably
ReadSChannel) to check for Count < 0 as a transport error, Count = 0 as clean
EOF, and Count > 0 as data read. Ensure the function signature and any variable
types are updated accordingly so SocketReceive's signed result is preserved.
- Around line 414-421: The code currently skips hostname verification if the
SSL_set1_host symbol is missing; modify the logic around TSSLSetHostName
(SetHostName) lookup so that if GetProcedureAddress(SSLLibHandle,
'SSL_set1_host') returns nil you treat it as a fatal error: raise
ETransportSecurityError with a clear message (e.g., "OpenSSL library does not
provide SSL_set1_host; hostname verification unavailable") instead of silently
proceeding; keep the existing path that calls SetHostName(ASSL,
PAnsiChar(HostName)) and raises on non-1 return, and ensure HostName/ASSL are
prepared before the check so failure happens early when SetHostName is not
assigned.
- Line 440: Replace the version-locked call Data.Context :=
SslCtxNew(SslMethodTLSV1_2) with a version-flexible client method (e.g.
SslCtxNew(SslMethodTLS_CLIENT) or SslCtxNew(SslMethodTLS)) and then explicitly
set the minimum protocol to TLS1.2 on the context (use the binding for
SSL_CTX_set_min_proto_version or the equivalent wrapper) so the client
negotiates the highest supported TLS version but enforces >= TLS1.2; update
references to SslCtxNew, SslMethodTLSV1_2, and Data.Context accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0ec715bf-7cfc-4424-a2a8-a7da9febbf83

📥 Commits

Reviewing files that changed from the base of the PR and between 0fed280 and 05818ff.

📒 Files selected for processing (2)
  • scripts/test-cli-apps.ts
  • source/shared/TransportSecurity.pas
🚧 Files skipped from review as they are similar to previous changes (1)
  • scripts/test-cli-apps.ts

Comment thread source/shared/TransportSecurity.pas
Comment thread source/shared/TransportSecurity.pas Outdated
Comment thread source/shared/TransportSecurity.pas Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@source/shared/TransportSecurity.pas`:
- Around line 1096-1140: TransportSecurityRead and TransportSecurityWrite must
early-return when ALength is zero (or negative) to avoid backends dereferencing
ABuffer[0]; add a guard at the start of both functions (checking if ALength <=
0) and immediately set Result := 0 and exit, so the dispatcher never forwards
zero-length operations into ReadSecureTransport/ReadSChannel/ReadOpenSSL or the
corresponding Write* functions.
- Around line 877-887: The current shutdown only calls ApplyControlToken with
SCHANNEL_SHUTDOWN and immediately DeleteSecurityContext, which prevents sending
the TLS close_notify; implement the full Schannel shutdown handshake: after
setting up ShutdownToken/ShutdownBuffer/ShutdownDesc and calling
ApplyControlToken on Data.Context, enter a loop that calls
InitializeSecurityContext (or AcceptSecurityContext on server side) with empty
input buffers and the Data.Context as the existing context, send any output
token produced to the peer, and repeat until the call returns
SEC_I_CONTEXT_EXPIRED or SEC_E_OK, then call DeleteSecurityContext; update the
code around Data.HasContext, ShutdownBuffer/ShutdownDesc, ApplyControlToken,
InitializeSecurityContext/AcceptSecurityContext and DeleteSecurityContext to
perform this sequence and ensure final output tokens are transmitted before
deleting the context.
- Around line 802-806: Add the ISC_REQ_USE_SUPPLIED_CREDS flag to the
InitializeSecurityContextW calls (e.g., the call using
Data.Credential/ExistingContext/TargetName and the second similar call around
lines 830-841) so Schannel will not implicitly select and send a client
certificate; include ISC_REQ_USE_SUPPLIED_CREDS alongside the existing ISC_REQ_*
flags. Also update the handshake-result handling that examines the Status from
InitializeSecurityContextW to treat SEC_I_INCOMPLETE_CREDENTIALS as a hard
failure (return/error) instead of mapping it into the
SEC_I_CONTINUE_NEEDED/continue path so the handshake loop does not wait for
client-cert progress that cannot occur.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e3f8c38f-8451-42f6-ae7e-809ebaa6ac9c

📥 Commits

Reviewing files that changed from the base of the PR and between 05818ff and cdd52d9.

📒 Files selected for processing (1)
  • source/shared/TransportSecurity.pas

Comment thread source/shared/TransportSecurity.pas Outdated
Comment thread source/shared/TransportSecurity.pas
Comment thread source/shared/TransportSecurity.pas
@frostney
Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 27, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@frostney
Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 27, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 706-715: The CI step "Check Windows TLS dependencies" currently
uses Write-Error which is non-terminating; update the PowerShell block that
reads build/GocciaScriptLoader.exe (variables $path, $bytes, $text) to fail the
step when OpenSSL symbols are found by replacing the Write-Error call with a
terminating action (e.g., use throw "GocciaScriptLoader.exe must not depend on
OpenSSL DLLs for HTTPS on Windows" or call exit 1) so the job returns a non-zero
exit code when the regex match detects libssl|libcrypto.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b5e56393-c731-434d-80c0-73ba7f12898a

📥 Commits

Reviewing files that changed from the base of the PR and between ad9b9da and 29ba23b.

📒 Files selected for processing (1)
  • .github/workflows/ci.yml

Comment thread .github/workflows/ci.yml
@frostney frostney merged commit 6e02757 into main Apr 27, 2026
58 checks passed
@frostney frostney deleted the t3code/verify-openssl-linux-sandbox branch April 27, 2026 20:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation new feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Use Network.framework on macOS for TLS instead of OpenSSL

1 participant