Skip to content

Allow Windows CRLF in ScriptLoader CLI checks#143

Merged
frostney merged 1 commit into
mainfrom
fix/windows-cli-output-newlines
Mar 30, 2026
Merged

Allow Windows CRLF in ScriptLoader CLI checks#143
frostney merged 1 commit into
mainfrom
fix/windows-cli-output-newlines

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Mar 30, 2026

Summary

  • make the ScriptLoader CLI behaviour checks accept both and in the JSON output field
  • keep the existing command-level assertions otherwise unchanged
  • apply the fix in both and

Verification

  • ./format.pas --check
  • local ScriptLoader JSON output checks with the updated regex

Summary by CodeRabbit

  • Tests
    • Improved test reliability across Windows and Unix-like systems by updating workflow assertions to handle different line ending formats in test output validation.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 30, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1e3ff5b0-68db-4a29-952b-9f193aa2919a

📥 Commits

Reviewing files that changed from the base of the PR and between 450adec and 3d61e11.

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

📝 Walkthrough

Walkthrough

CI workflows in .github/workflows/ci.yml and .github/workflows/pr.yml were updated to handle cross-platform line endings in ScriptLoader JSON output assertions. String matching for "output":"hi\\n" was replaced with regex pattern matching via grep -Eq '"output":"hi(\\r)?\\n"' to accept both Unix and Windows line endings.

Changes

Cohort / File(s) Summary
CI Workflow Updates
.github/workflows/ci.yml, .github/workflows/pr.yml
Updated ScriptLoader JSON output assertions in both interpreted and bytecode test modes to use regex matching grep -Eq '"output":"hi(\\r)?\\n"' instead of exact string matching, enabling detection of both \n and \r\n line endings.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

Poem

🐰 From Windows to Unix, the line endings dance,
With regex magic, we give tests a chance!
Carriage returns vanquished, assertions now free,
Cross-platform harmony—just wait and see! ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly and accurately describes the main change: updating CLI checks to accept Windows-style CRLF line endings in ScriptLoader output.
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.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/windows-cli-output-newlines

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions
Copy link
Copy Markdown
Contributor

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 3523 3523
Tests Passed 3482 ✅ 3523 ✅
Tests Skipped 41 0
Tests Execution 156.1ms 150.8ms
Tests Engine 313.0ms 550.0ms
Benchmarks Total 263 263
Benchmarks Duration 7.04min 6.27min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

Benchmark Results

263 benchmarks

Interpreted: 🟢 81 improved · 🔴 3 regressed · 179 unchanged · avg +4.6%
Bytecode: 🔴 243 regressed · 20 unchanged · avg -14.1%

arraybuffer.js — Interp: 🟢 9, 5 unch. · avg +7.8% · Bytecode: 🔴 12, 2 unch. · avg -11.8%
Benchmark Interpreted Δ Bytecode Δ
create ArrayBuffer(0) 464,418 → 507,678 🟢 +9.3% 563,910 → 481,830 🔴 -14.6%
create ArrayBuffer(64) 446,690 → 486,881 🟢 +9.0% 532,744 → 459,030 🔴 -13.8%
create ArrayBuffer(1024) 343,585 → 386,214 🟢 +12.4% 426,692 → 351,525 🔴 -17.6%
create ArrayBuffer(8192) 153,087 → 177,017 🟢 +15.6% 179,425 → 150,185 🔴 -16.3%
slice full buffer (64 bytes) 518,570 → 548,181 +5.7% 657,620 → 598,996 🔴 -8.9%
slice half buffer (512 of 1024 bytes) 443,076 → 489,289 🟢 +10.4% 565,654 → 498,973 🔴 -11.8%
slice with negative indices 437,493 → 471,920 🟢 +7.9% 607,382 → 553,113 🔴 -8.9%
slice empty range 497,669 → 545,132 🟢 +9.5% 641,816 → 587,445 🔴 -8.5%
byteLength access 1,376,515 → 1,400,770 +1.8% 1,718,183 → 1,604,722 -6.6%
Symbol.toStringTag access 1,029,711 → 990,213 -3.8% 1,148,520 → 1,076,761 -6.2%
ArrayBuffer.isView 767,637 → 789,415 +2.8% 937,361 → 847,681 🔴 -9.6%
clone ArrayBuffer(64) 432,842 → 453,844 +4.9% 509,069 → 464,418 🔴 -8.8%
clone ArrayBuffer(1024) 333,459 → 366,712 🟢 +10.0% 411,483 → 345,642 🔴 -16.0%
clone ArrayBuffer inside object 264,294 → 299,575 🟢 +13.3% 328,705 → 270,395 🔴 -17.7%
arrays.js — Interp: 🟢 10, 9 unch. · avg +7.1% · Bytecode: 🔴 19 · avg -15.4%
Benchmark Interpreted Δ Bytecode Δ
Array.from length 100 13,208 → 13,914 +5.3% 15,774 → 13,853 🔴 -12.2%
Array.from 10 elements 223,112 → 244,954 🟢 +9.8% 269,371 → 227,187 🔴 -15.7%
Array.of 10 elements 280,062 → 307,891 🟢 +9.9% 332,226 → 303,083 🔴 -8.8%
spread into new array 331,604 → 357,625 🟢 +7.8% 212,001 → 185,189 🔴 -12.6%
map over 50 elements 24,941 → 26,304 +5.5% 29,484 → 25,138 🔴 -14.7%
filter over 50 elements 22,467 → 23,970 +6.7% 26,742 → 21,487 🔴 -19.7%
reduce sum 50 elements 26,785 → 27,129 +1.3% 21,148 → 18,457 🔴 -12.7%
forEach over 50 elements 23,012 → 23,690 +2.9% 30,833 → 27,093 🔴 -12.1%
find in 50 elements 32,158 → 34,519 🟢 +7.3% 33,328 → 29,250 🔴 -12.2%
sort 20 elements 12,544 → 13,085 +4.3% 14,605 → 12,986 🔴 -11.1%
flat nested array 115,543 → 123,610 +7.0% 141,161 → 120,444 🔴 -14.7%
flatMap 72,111 → 79,850 🟢 +10.7% 89,968 → 74,724 🔴 -16.9%
map inside map (5x5) 20,147 → 22,218 🟢 +10.3% 24,881 → 20,397 🔴 -18.0%
filter inside map (5x10) 15,387 → 16,557 🟢 +7.6% 18,581 → 14,742 🔴 -20.7%
reduce inside map (5x10) 19,103 → 20,176 +5.6% 17,812 → 15,103 🔴 -15.2%
forEach inside forEach (5x10) 16,353 → 17,118 +4.7% 18,730 → 16,215 🔴 -13.4%
find inside some (10x10) 13,143 → 14,384 🟢 +9.4% 14,479 → 11,745 🔴 -18.9%
map+filter chain nested (5x20) 5,086 → 5,548 🟢 +9.1% 6,048 → 4,970 🔴 -17.8%
reduce flatten (10x5) 37,996 → 41,971 🟢 +10.5% 19,789 → 14,927 🔴 -24.6%
async-await.js — Interp: 🟢 3, 3 unch. · avg +6.9% · Bytecode: 🔴 6 · avg -14.2%
Benchmark Interpreted Δ Bytecode Δ
single await 382,497 → 404,933 +5.9% 447,584 → 363,519 🔴 -18.8%
multiple awaits 169,806 → 182,883 🟢 +7.7% 196,046 → 168,426 🔴 -14.1%
await non-Promise value 839,782 → 909,759 🟢 +8.3% 1,178,926 → 1,025,093 🔴 -13.0%
await with try/catch 369,240 → 390,544 +5.8% 440,786 → 377,962 🔴 -14.3%
await Promise.all 50,808 → 55,140 🟢 +8.5% 56,129 → 48,712 🔴 -13.2%
nested async function call 194,712 → 204,674 +5.1% 251,309 → 222,325 🔴 -11.5%
classes.js — Interp: 🟢 29, 2 unch. · avg +10.4% · Bytecode: 🔴 31 · avg -20.5%
Benchmark Interpreted Δ Bytecode Δ
simple class new 141,377 → 149,800 +6.0% 221,896 → 190,287 🔴 -14.2%
class with defaults 110,900 → 120,339 🟢 +8.5% 153,053 → 134,453 🔴 -12.2%
50 instances via Array.from 5,679 → 6,257 🟢 +10.2% 8,636 → 7,713 🔴 -10.7%
instance method call 71,165 → 77,271 🟢 +8.6% 103,126 → 87,488 🔴 -15.2%
static method call 115,274 → 123,009 +6.7% 200,134 → 172,385 🔴 -13.9%
single-level inheritance 56,757 → 61,128 🟢 +7.7% 82,417 → 71,145 🔴 -13.7%
two-level inheritance 48,567 → 53,095 🟢 +9.3% 66,257 → 55,356 🔴 -16.5%
private field access 71,311 → 78,997 🟢 +10.8% 105,022 → 87,679 🔴 -16.5%
private methods 79,101 → 85,222 🟢 +7.7% 114,945 → 92,432 🔴 -19.6%
getter/setter access 75,889 → 82,408 🟢 +8.6% 116,078 → 95,996 🔴 -17.3%
class decorator (identity) 93,004 → 102,587 🟢 +10.3% 117,064 → 92,680 🔴 -20.8%
class decorator (wrapping) 54,305 → 60,507 🟢 +11.4% 63,046 → 52,684 🔴 -16.4%
identity method decorator 65,291 → 73,008 🟢 +11.8% 97,743 → 73,263 🔴 -25.0%
wrapping method decorator 52,624 → 57,661 🟢 +9.6% 67,660 → 54,636 🔴 -19.2%
stacked method decorators (x3) 34,648 → 38,525 🟢 +11.2% 45,961 → 33,045 🔴 -28.1%
identity field decorator 71,062 → 78,336 🟢 +10.2% 83,318 → 59,606 🔴 -28.5%
field initializer decorator 59,925 → 65,842 🟢 +9.9% 70,605 → 51,291 🔴 -27.4%
getter decorator (identity) 64,809 → 72,863 🟢 +12.4% 84,120 → 59,676 🔴 -29.1%
setter decorator (identity) 54,603 → 61,416 🟢 +12.5% 66,980 → 46,543 🔴 -30.5%
static method decorator 70,873 → 77,831 🟢 +9.8% 89,020 → 63,281 🔴 -28.9%
static field decorator 81,497 → 90,456 🟢 +11.0% 89,705 → 64,600 🔴 -28.0%
private method decorator 53,150 → 58,802 🟢 +10.6% 77,582 → 57,846 🔴 -25.4%
private field decorator 58,656 → 65,486 🟢 +11.6% 64,469 → 46,614 🔴 -27.7%
plain auto-accessor (no decorator) 101,260 → 111,824 🟢 +10.4% 103,613 → 76,540 🔴 -26.1%
auto-accessor with decorator 53,860 → 60,381 🟢 +12.1% 57,984 → 47,775 🔴 -17.6%
decorator writing metadata 42,929 → 48,849 🟢 +13.8% 52,312 → 44,658 🔴 -14.6%
static getter read 122,007 → 138,284 🟢 +13.3% 169,531 → 130,363 🔴 -23.1%
static getter/setter pair 95,306 → 106,468 🟢 +11.7% 120,891 → 108,967 🔴 -9.9%
inherited static getter 75,452 → 85,561 🟢 +13.4% 105,771 → 80,195 🔴 -24.2%
inherited static setter 81,008 → 89,849 🟢 +10.9% 103,189 → 87,131 🔴 -15.6%
inherited static getter with this binding 69,347 → 77,280 🟢 +11.4% 90,052 → 73,522 🔴 -18.4%
closures.js — Interp: 🟢 3, 8 unch. · avg +6.3% · Bytecode: 🔴 11 · avg -14.0%
Benchmark Interpreted Δ Bytecode Δ
closure over single variable 131,172 → 137,142 +4.6% 287,173 → 243,412 🔴 -15.2%
closure over multiple variables 116,067 → 124,811 🟢 +7.5% 205,263 → 177,187 🔴 -13.7%
nested closures 124,626 → 132,765 +6.5% 228,695 → 197,067 🔴 -13.8%
function as argument 92,733 → 98,184 +5.9% 272,271 → 237,146 🔴 -12.9%
function returning function 117,114 → 125,647 🟢 +7.3% 300,259 → 253,623 🔴 -15.5%
compose two functions 70,610 → 75,248 +6.6% 162,473 → 135,434 🔴 -16.6%
fn.call 149,988 → 159,671 +6.5% 233,721 → 213,197 🔴 -8.8%
fn.apply 110,599 → 116,851 +5.7% 172,188 → 139,450 🔴 -19.0%
fn.bind 145,068 → 153,294 +5.7% 300,964 → 262,072 🔴 -12.9%
recursive sum to 50 11,987 → 12,630 +5.4% 27,082 → 23,305 🔴 -13.9%
recursive tree traversal 20,374 → 21,897 🟢 +7.5% 37,824 → 33,406 🔴 -11.7%
collections.js — Interp: 🟢 4, 8 unch. · avg +4.4% · Bytecode: 🔴 4, 8 unch. · avg -6.5%
Benchmark Interpreted Δ Bytecode Δ
add 50 elements 7,022 → 7,223 +2.9% 7,481 → 7,197 -3.8%
has lookup (50 elements) 90,287 → 91,685 +1.5% 102,051 → 99,017 -3.0%
delete elements 47,803 → 48,558 +1.6% 50,649 → 48,821 -3.6%
forEach iteration 15,319 → 16,416 🟢 +7.2% 16,334 → 15,066 🔴 -7.8%
spread to array 27,549 → 29,971 🟢 +8.8% 229,245 → 200,841 🔴 -12.4%
deduplicate array 36,966 → 40,255 🟢 +8.9% 72,177 → 68,130 -5.6%
set 50 entries 5,118 → 5,265 +2.9% 5,756 → 5,379 -6.5%
get lookup (50 entries) 86,523 → 87,356 +1.0% 92,784 → 92,537 -0.3%
has check 129,075 → 132,412 +2.6% 144,110 → 141,023 -2.1%
delete entries 45,680 → 45,998 +0.7% 47,535 → 46,923 -1.3%
forEach iteration 15,329 → 16,251 +6.0% 17,243 → 15,163 🔴 -12.1%
keys/values/entries 7,625 → 8,281 🟢 +8.6% 27,245 → 21,988 🔴 -19.3%
destructuring.js — Interp: 🟢 8, 14 unch. · avg +5.7% · Bytecode: 🔴 21, 1 unch. · avg -13.0%
Benchmark Interpreted Δ Bytecode Δ
simple array destructuring 364,711 → 382,700 +4.9% 283,421 → 224,725 🔴 -20.7%
with rest element 238,904 → 249,731 +4.5% 214,525 → 182,259 🔴 -15.0%
with defaults 369,560 → 399,025 🟢 +8.0% 318,284 → 263,625 🔴 -17.2%
skip elements 390,850 → 408,416 +4.5% 304,694 → 254,398 🔴 -16.5%
nested array destructuring 169,853 → 169,523 -0.2% 90,975 → 76,704 🔴 -15.7%
swap variables 495,643 → 519,828 +4.9% 339,668 → 278,975 🔴 -17.9%
simple object destructuring 299,982 → 312,879 +4.3% 423,178 → 377,607 🔴 -10.8%
with defaults 326,885 → 365,770 🟢 +11.9% 575,248 → 512,810 🔴 -10.9%
with renaming 315,084 → 346,120 🟢 +9.9% 464,940 → 418,367 🔴 -10.0%
nested object destructuring 147,546 → 154,801 +4.9% 197,148 → 183,753 -6.8%
rest properties 181,799 → 194,905 🟢 +7.2% 193,574 → 169,292 🔴 -12.5%
object parameter 93,793 → 100,286 +6.9% 154,230 → 140,686 🔴 -8.8%
array parameter 121,758 → 126,557 +3.9% 114,841 → 97,171 🔴 -15.4%
mixed destructuring in map 32,921 → 35,326 🟢 +7.3% 37,388 → 32,258 🔴 -13.7%
forEach with array destructuring 63,017 → 63,420 +0.6% 44,345 → 39,406 🔴 -11.1%
map with array destructuring 62,574 → 65,579 +4.8% 43,416 → 38,358 🔴 -11.7%
filter with array destructuring 65,335 → 68,003 +4.1% 50,217 → 43,890 🔴 -12.6%
reduce with array destructuring 71,656 → 73,718 +2.9% 47,176 → 41,974 🔴 -11.0%
map with object destructuring 71,896 → 77,872 🟢 +8.3% 98,048 → 85,155 🔴 -13.1%
map with nested destructuring 60,689 → 65,016 🟢 +7.1% 91,413 → 79,640 🔴 -12.9%
map with rest in destructuring 41,343 → 43,174 +4.4% 25,250 → 22,419 🔴 -11.2%
map with defaults in destructuring 54,950 → 60,723 🟢 +10.5% 69,240 → 61,268 🔴 -11.5%
fibonacci.js — Interp: 8 unch. · avg +2.6% · Bytecode: 🔴 7, 1 unch. · avg -13.4%
Benchmark Interpreted Δ Bytecode Δ
recursive fib(15) 317 → 332 +4.9% 954 → 803 🔴 -15.9%
recursive fib(20) 29 → 31 +5.8% 86 → 74 🔴 -13.7%
recursive fib(15) typed 324 → 328 +1.4% 994 → 849 🔴 -14.6%
recursive fib(20) typed 29 → 30 +4.3% 89 → 78 🔴 -12.5%
iterative fib(20) via reduce 11,674 → 11,790 +1.0% 18,737 → 16,135 🔴 -13.9%
iterator fib(20) 9,337 → 9,712 +4.0% 18,637 → 17,548 -5.8%
iterator fib(20) via Iterator.from + take 15,303 → 15,235 -0.4% 22,698 → 18,429 🔴 -18.8%
iterator fib(20) last value via reduce 11,522 → 11,539 +0.1% 15,922 → 13,954 🔴 -12.4%
for-of.js — Interp: 7 unch. · avg +1.7% · Bytecode: 🔴 7 · avg -11.4%
Benchmark Interpreted Δ Bytecode Δ
for...of with 10-element array 44,270 → 45,050 +1.8% 179,986 → 155,249 🔴 -13.7%
for...of with 100-element array 5,086 → 5,172 +1.7% 18,754 → 16,774 🔴 -10.6%
for...of with string (10 chars) 32,804 → 33,360 +1.7% 90,233 → 82,240 🔴 -8.9%
for...of with Set (10 elements) 44,111 → 45,165 +2.4% 169,624 → 144,898 🔴 -14.6%
for...of with Map entries (10 entries) 28,779 → 28,890 +0.4% 28,807 → 25,925 🔴 -10.0%
for...of with destructuring 37,929 → 38,505 +1.5% 39,455 → 34,191 🔴 -13.3%
for-await-of with sync array 42,032 → 43,022 +2.4% 130,877 → 119,086 🔴 -9.0%
helpers/bench-module.js — Interp: 0 · Bytecode: 0
Benchmark Interpreted Δ Bytecode Δ
iterators.js — Interp: 20 unch. · avg +1.2% · Bytecode: 🔴 20 · avg -15.8%
Benchmark Interpreted Δ Bytecode Δ
Iterator.from({next}).toArray() — 20 elements 15,095 → 15,187 +0.6% 21,998 → 18,990 🔴 -13.7%
Iterator.from({next}).toArray() — 50 elements 6,515 → 6,655 +2.2% 10,122 → 8,767 🔴 -13.4%
spread pre-wrapped iterator — 20 elements 11,104 → 11,350 +2.2% 21,547 → 18,316 🔴 -15.0%
Iterator.from({next}).forEach — 50 elements 4,485 → 4,544 +1.3% 6,300 → 5,608 🔴 -11.0%
Iterator.from({next}).reduce — 50 elements 4,635 → 4,639 +0.1% 6,047 → 5,049 🔴 -16.5%
wrap array iterator 154,668 → 164,210 +6.2% 195,771 → 167,526 🔴 -14.4%
wrap plain {next()} object 10,338 → 10,536 +1.9% 15,568 → 13,412 🔴 -13.8%
map + toArray (50 elements) 4,438 → 4,625 +4.2% 6,897 → 5,367 🔴 -22.2%
filter + toArray (50 elements) 4,350 → 4,443 +2.2% 6,712 → 5,354 🔴 -20.2%
take(10) + toArray (50 element source) 27,011 → 27,044 +0.1% 41,103 → 32,699 🔴 -20.4%
drop(40) + toArray (50 element source) 6,343 → 6,541 +3.1% 9,638 → 8,017 🔴 -16.8%
chained map + filter + take (100 element source) 7,924 → 8,064 +1.8% 12,086 → 9,879 🔴 -18.3%
some + every (50 elements) 2,532 → 2,613 +3.2% 3,884 → 3,265 🔴 -15.9%
find (50 elements) 5,612 → 5,593 -0.3% 7,996 → 6,677 🔴 -16.5%
array.values().map().filter().toArray() 7,941 → 7,870 -0.9% 10,909 → 8,809 🔴 -19.2%
array.values().take(5).toArray() 205,682 → 206,289 +0.3% 248,228 → 218,948 🔴 -11.8%
array.values().drop(45).toArray() 189,959 → 190,879 +0.5% 228,388 → 203,019 🔴 -11.1%
map.entries() chained helpers 9,635 → 9,810 +1.8% 6,354 → 5,586 🔴 -12.1%
set.values() chained helpers 16,353 → 16,412 +0.4% 22,195 → 18,854 🔴 -15.1%
string iterator map + toArray 13,379 → 12,561 -6.1% 15,751 → 12,738 🔴 -19.1%
json.js — Interp: 🟢 10, 10 unch. · avg +6.0% · Bytecode: 🔴 19, 1 unch. · avg -13.1%
Benchmark Interpreted Δ Bytecode Δ
parse simple object 168,059 → 169,135 +0.6% 192,774 → 165,482 🔴 -14.2%
parse nested object 101,355 → 101,069 -0.3% 113,279 → 99,368 🔴 -12.3%
parse array of objects 58,558 → 63,623 🟢 +8.6% 69,240 → 57,377 🔴 -17.1%
parse large flat object 65,674 → 68,449 +4.2% 76,752 → 64,945 🔴 -15.4%
parse mixed types 74,909 → 78,250 +4.5% 88,023 → 76,454 🔴 -13.1%
stringify simple object 189,998 → 206,076 🟢 +8.5% 218,387 → 198,726 🔴 -9.0%
stringify nested object 105,847 → 111,194 +5.1% 118,338 → 107,092 🔴 -9.5%
stringify array of objects 60,039 → 59,469 -0.9% 61,456 → 62,485 +1.7%
stringify mixed types 84,569 → 89,147 +5.4% 94,433 → 85,478 🔴 -9.5%
reviver doubles numbers 47,204 → 51,286 🟢 +8.6% 60,670 → 49,121 🔴 -19.0%
reviver filters properties 40,363 → 43,857 🟢 +8.7% 48,745 → 40,425 🔴 -17.1%
reviver on nested object 51,093 → 53,805 +5.3% 61,749 → 51,354 🔴 -16.8%
reviver on array 31,024 → 33,429 🟢 +7.8% 37,435 → 31,096 🔴 -16.9%
replacer function doubles numbers 46,929 → 49,450 +5.4% 58,143 → 48,550 🔴 -16.5%
replacer function excludes properties 60,179 → 62,985 +4.7% 69,414 → 58,369 🔴 -15.9%
array replacer (allowlist) 110,272 → 119,017 🟢 +7.9% 127,783 → 110,279 🔴 -13.7%
stringify with 2-space indent 94,496 → 101,616 🟢 +7.5% 108,880 → 95,784 🔴 -12.0%
stringify with tab indent 93,861 → 103,187 🟢 +9.9% 110,071 → 96,946 🔴 -11.9%
parse then stringify 53,870 → 58,863 🟢 +9.3% 64,537 → 56,555 🔴 -12.4%
stringify then parse 33,271 → 36,335 🟢 +9.2% 39,795 → 34,968 🔴 -12.1%
jsx.jsx — Interp: 🟢 2, 19 unch. · avg +4.5% · Bytecode: 🔴 18, 3 unch. · avg -12.5%
Benchmark Interpreted Δ Bytecode Δ
simple element 206,208 → 215,861 +4.7% 343,142 → 288,583 🔴 -15.9%
self-closing element 218,823 → 226,230 +3.4% 355,111 → 331,554 -6.6%
element with string attribute 174,310 → 180,501 +3.6% 264,576 → 234,285 🔴 -11.4%
element with multiple attributes 153,244 → 160,742 +4.9% 209,362 → 195,982 -6.4%
element with expression attribute 161,592 → 168,484 +4.3% 266,160 → 232,843 🔴 -12.5%
text child 206,860 → 215,243 +4.1% 326,166 → 305,710 -6.3%
expression child 203,462 → 214,155 +5.3% 342,291 → 294,701 🔴 -13.9%
mixed text and expression 192,375 → 196,646 +2.2% 297,751 → 268,150 🔴 -9.9%
nested elements (3 levels) 81,097 → 84,783 +4.5% 127,769 → 110,225 🔴 -13.7%
sibling children 58,513 → 64,537 🟢 +10.3% 92,324 → 83,908 🔴 -9.1%
component element 149,455 → 156,723 +4.9% 236,210 → 200,295 🔴 -15.2%
component with children 92,876 → 98,111 +5.6% 144,727 → 129,656 🔴 -10.4%
dotted component 125,133 → 131,409 +5.0% 184,698 → 159,967 🔴 -13.4%
empty fragment 215,664 → 229,195 +6.3% 377,376 → 331,941 🔴 -12.0%
fragment with children 59,278 → 63,359 +6.9% 95,163 → 81,547 🔴 -14.3%
spread attributes 109,036 → 116,954 🟢 +7.3% 140,510 → 124,366 🔴 -11.5%
spread with overrides 95,108 → 98,569 +3.6% 123,604 → 102,056 🔴 -17.4%
shorthand props 161,195 → 167,248 +3.8% 239,202 → 219,919 🔴 -8.1%
nav bar structure 27,852 → 28,478 +2.3% 42,113 → 33,797 🔴 -19.7%
card component tree 32,061 → 32,470 +1.3% 48,460 → 41,717 🔴 -13.9%
10 list items via Array.from 14,783 → 14,816 +0.2% 20,054 → 15,785 🔴 -21.3%
modules.js — Interp: 9 unch. · avg +0.1% · Bytecode: 🔴 9 · avg -15.6%
Benchmark Interpreted Δ Bytecode Δ
call imported function 471,729 → 471,860 +0.0% 653,594 → 592,568 🔴 -9.3%
call two imported functions 260,528 → 266,004 +2.1% 378,096 → 341,325 🔴 -9.7%
read imported constant 1,659,221 → 1,577,938 -4.9% 4,137,596 → 3,440,052 🔴 -16.9%
read imported string 1,605,958 → 1,579,605 -1.6% 4,136,826 → 3,398,285 🔴 -17.9%
read JSON string property 1,607,236 → 1,626,222 +1.2% 4,130,520 → 3,403,015 🔴 -17.6%
read JSON number property 1,584,921 → 1,585,988 +0.1% 4,133,907 → 3,383,280 🔴 -18.2%
read JSON boolean property 1,585,201 → 1,602,542 +1.1% 4,115,276 → 3,430,747 🔴 -16.6%
read JSON array property 1,580,314 → 1,582,126 +0.1% 4,138,930 → 3,383,973 🔴 -18.2%
read multiple JSON properties 916,723 → 938,892 +2.4% 3,714,982 → 3,105,671 🔴 -16.4%
numbers.js — Interp: 11 unch. · avg +2.6% · Bytecode: 🔴 11 · avg -13.4%
Benchmark Interpreted Δ Bytecode Δ
integer arithmetic 521,020 → 498,383 -4.3% 1,770,123 → 1,442,183 🔴 -18.5%
floating point arithmetic 569,238 → 584,501 +2.7% 1,304,799 → 912,934 🔴 -30.0%
number coercion 190,782 → 194,410 +1.9% 248,679 → 221,771 🔴 -10.8%
toFixed 99,539 → 105,213 +5.7% 118,325 → 105,414 🔴 -10.9%
toString 150,704 → 156,956 +4.1% 197,671 → 179,641 🔴 -9.1%
valueOf 225,492 → 239,084 +6.0% 282,349 → 248,980 🔴 -11.8%
toPrecision 140,053 → 141,701 +1.2% 170,110 → 150,975 🔴 -11.2%
Number.isNaN 317,907 → 328,451 +3.3% 366,100 → 331,759 🔴 -9.4%
Number.isFinite 318,693 → 322,142 +1.1% 349,624 → 315,280 🔴 -9.8%
Number.isInteger 322,029 → 330,010 +2.5% 387,515 → 341,638 🔴 -11.8%
Number.parseInt and parseFloat 248,802 → 259,005 +4.1% 290,791 → 251,429 🔴 -13.5%
objects.js — Interp: 7 unch. · avg +1.4% · Bytecode: 🔴 6, 1 unch. · avg -13.0%
Benchmark Interpreted Δ Bytecode Δ
create simple object 475,705 → 470,498 -1.1% 598,786 → 503,459 🔴 -15.9%
create nested object 222,653 → 234,880 +5.5% 262,512 → 226,426 🔴 -13.7%
create 50 objects via Array.from 9,076 → 9,338 +2.9% 10,485 → 8,842 🔴 -15.7%
property read 547,212 → 526,451 -3.8% 448,296 → 430,221 -4.0%
Object.keys 278,897 → 278,781 -0.0% 333,949 → 290,989 🔴 -12.9%
Object.entries 101,587 → 102,555 +1.0% 117,816 → 98,198 🔴 -16.7%
spread operator 172,161 → 181,266 +5.3% 216,032 → 189,372 🔴 -12.3%
promises.js — Interp: 🔴 2, 10 unch. · avg -2.1% · Bytecode: 🔴 11, 1 unch. · avg -12.7%
Benchmark Interpreted Δ Bytecode Δ
Promise.resolve(value) 538,360 → 507,659 -5.7% 594,694 → 542,866 🔴 -8.7%
new Promise(resolve => resolve(value)) 187,558 → 186,020 -0.8% 242,253 → 211,963 🔴 -12.5%
Promise.reject(reason) 548,099 → 509,286 🔴 -7.1% 581,915 → 545,210 -6.3%
resolve + then (1 handler) 172,341 → 164,833 -4.4% 214,578 → 187,906 🔴 -12.4%
resolve + then chain (3 deep) 68,164 → 67,808 -0.5% 84,810 → 73,278 🔴 -13.6%
resolve + then chain (10 deep) 21,098 → 19,612 🔴 -7.0% 27,723 → 23,732 🔴 -14.4%
reject + catch + then 97,535 → 97,539 +0.0% 122,505 → 103,943 🔴 -15.2%
resolve + finally + then 80,083 → 82,406 +2.9% 101,516 → 85,605 🔴 -15.7%
Promise.all (5 resolved) 30,719 → 30,255 -1.5% 35,656 → 31,167 🔴 -12.6%
Promise.race (5 resolved) 32,663 → 32,526 -0.4% 37,639 → 32,694 🔴 -13.1%
Promise.allSettled (5 mixed) 25,541 → 25,727 +0.7% 30,523 → 25,907 🔴 -15.1%
Promise.any (5 mixed) 30,161 → 29,886 -0.9% 35,103 → 30,514 🔴 -13.1%
strings.js — Interp: 🟢 1, 10 unch. · avg +3.3% · Bytecode: 🔴 10, 1 unch. · avg -11.7%
Benchmark Interpreted Δ Bytecode Δ
string concatenation 387,300 → 365,941 -5.5% 310,890 → 300,529 -3.3%
template literal 599,341 → 618,076 +3.1% 658,381 → 593,767 🔴 -9.8%
string repeat 390,088 → 402,609 +3.2% 510,960 → 432,212 🔴 -15.4%
split and join 126,803 → 136,840 🟢 +7.9% 159,595 → 140,413 🔴 -12.0%
indexOf and includes 161,423 → 170,932 +5.9% 207,837 → 184,571 🔴 -11.2%
toUpperCase and toLowerCase 246,886 → 253,577 +2.7% 341,391 → 305,131 🔴 -10.6%
slice and substring 145,275 → 154,071 +6.1% 209,434 → 176,306 🔴 -15.8%
trim operations 180,866 → 189,537 +4.8% 252,134 → 219,479 🔴 -13.0%
replace and replaceAll 199,952 → 201,568 +0.8% 256,864 → 220,981 🔴 -14.0%
startsWith and endsWith 129,593 → 136,616 +5.4% 166,201 → 147,815 🔴 -11.1%
padStart and padEnd 186,024 → 190,448 +2.4% 244,561 → 212,944 🔴 -12.9%
typed-arrays.js — Interp: 🟢 2, 🔴 1, 19 unch. · avg +1.8% · Bytecode: 🔴 21, 1 unch. · avg -15.0%
Benchmark Interpreted Δ Bytecode Δ
new Int32Array(0) 324,986 → 316,473 -2.6% 400,240 → 340,334 🔴 -15.0%
new Int32Array(100) 299,451 → 287,005 -4.2% 363,719 → 307,021 🔴 -15.6%
new Int32Array(1000) 183,173 → 189,977 +3.7% 225,425 → 190,077 🔴 -15.7%
new Float64Array(100) 269,887 → 260,248 -3.6% 332,895 → 297,823 🔴 -10.5%
Int32Array.from([...]) 178,576 → 190,005 +6.4% 215,578 → 183,645 🔴 -14.8%
Int32Array.of(1, 2, 3, 4, 5) 300,169 → 278,623 🔴 -7.2% 366,416 → 334,029 🔴 -8.8%
sequential write 100 elements 3,420 → 3,449 +0.8% 17,726 → 14,041 🔴 -20.8%
sequential read 100 elements 3,510 → 3,418 -2.6% 12,090 → 9,761 🔴 -19.3%
Float64Array write 100 elements 3,251 → 3,215 -1.1% 13,320 → 10,105 🔴 -24.1%
fill(42) 45,425 → 59,110 🟢 +30.1% 58,184 → 46,885 🔴 -19.4%
slice() 201,412 → 207,900 +3.2% 245,604 → 206,615 🔴 -15.9%
map(x => x * 2) 7,902 → 7,828 -0.9% 9,597 → 8,021 🔴 -16.4%
filter(x => x > 50) 8,057 → 7,958 -1.2% 10,689 → 9,206 🔴 -13.9%
reduce (sum) 7,790 → 7,433 -4.6% 8,093 → 6,771 🔴 -16.3%
sort() 165,329 → 197,385 🟢 +19.4% 208,811 → 171,696 🔴 -17.8%
indexOf() 417,732 → 444,855 +6.5% 555,157 → 470,083 🔴 -15.3%
reverse() 324,346 → 345,798 +6.6% 399,823 → 357,616 🔴 -10.6%
create view over existing buffer 392,940 → 388,743 -1.1% 484,525 → 429,452 🔴 -11.4%
subarray() 415,174 → 409,461 -1.4% 547,508 → 458,984 🔴 -16.2%
set() from array 566,864 → 572,266 +1.0% 682,710 → 636,643 -6.7%
for-of loop 4,990 → 4,747 -4.9% 19,361 → 16,445 🔴 -15.1%
spread into array 17,182 → 16,622 -3.3% 99,782 → 89,722 🔴 -10.1%

Measured on ubuntu-latest x64. Changes within ±7% are considered insignificant.

@frostney frostney merged commit 294f134 into main Mar 30, 2026
9 checks passed
@frostney frostney deleted the fix/windows-cli-output-newlines branch March 30, 2026 14:47
@frostney frostney added the bug Something isn't working label Apr 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant