Skip to content

Reject unescaped line terminators in string literals#623

Merged
frostney merged 5 commits into
mainfrom
t3code/issue-619-fix
May 10, 2026
Merged

Reject unescaped line terminators in string literals#623
frostney merged 5 commits into
mainfrom
t3code/issue-619-fix

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented May 10, 2026

Summary

  • Reject unescaped LF and CR in single/double-quoted string literals per ES2026 §12.9.4. LS (U+2028) and PS (U+2029) remain valid per ES2019 (proposal-json-superset). The lexer now raises a distinct SyntaxError with a suggestion to use template literals or \n/\r.
  • LineContinuation (\ before a line terminator) remains valid and produces the empty string, matching spec behavior.
  • Fix TGocciaLexerError not being recognized as SyntaxError by user-level try/catch (evaluator + VM) and the toThrow(SyntaxError) test matcher — both previously fell through to generic Error.
  • Update tests/built-ins/RegExp/unicode.js to use \n escapes instead of raw newline bytes in string literals.
  • Closes String literals should reject unescaped line terminators per ES spec #619

Testing

  • Verified no regressions and confirmed the new feature or bugfix in end-to-end JavaScript/TypeScript tests
  • Updated documentation
  • Optional: Verified no regressions and confirmed the new feature or bugfix in native Pascal tests (if AST, scope, evaluator, or value types changed)
  • Optional: Verified no benchmark regressions or confirmed benchmark coverage for the change

The lexer now raises SyntaxError when a raw LF, CR, LS (U+2028), or
PS (U+2029) appears inside a single- or double-quoted string literal.
LineContinuation (backslash before line terminator) remains valid.

Also fixes TGocciaLexerError not being recognized as SyntaxError by
try/catch in user code and the toThrow() test matcher.

Closes #619

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented May 10, 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 May 10, 2026 2:58pm

Request Review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 10, 2026

Review Change Stack
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: 4c995af1-a59e-4759-adfb-6a86611c5047

📥 Commits

Reviewing files that changed from the base of the PR and between 810fa44 and 7e6843d.

📒 Files selected for processing (1)
  • scripts/test-cli-lexer.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • scripts/test-cli-lexer.ts

📝 Walkthrough

Walkthrough

This PR enforces ES2026 compliance by rejecting unescaped line terminators (LF, CR) inside single- and double-quoted string literals. The lexer now raises TGocciaLexerError for this violation, while Unicode line (U+2028) and paragraph (U+2029) separators remain permitted. Exception handling and test infrastructure are updated to propagate and validate the error correctly.

Changes

String Literal Line Terminator Validation

Layer / File(s) Summary
Lexer Implementation
source/units/Goccia.Lexer.pas
ScanString now raises TGocciaLexerError when encountering unescaped LF or CR inside string literals instead of allowing them.
Error Messages
source/units/Goccia.Error.Suggestions.pas
Adds new resourcestring SSuggestStringLineTerminator with guidance to use template literals or escape sequences for multi-line strings.
Exception Mapping
source/units/Goccia.Evaluator.pas, source/units/Goccia.VM.pas, source/units/Goccia.Builtins.TestingLibrary.pas
TGocciaLexerError is mapped to SYNTAX_ERROR_NAME alongside TGocciaSyntaxError in PascalExceptionToErrorObject, OP_USING_DISPOSE, and test exception matching.
CLI Tests
scripts/test-cli-lexer.ts
Three new test blocks verify: (1) LF/CR/CRLF rejection with SyntaxError, (2) LS/PS Unicode separator acceptance, (3) backslash-based line continuation preservation.
Language Tests
tests/built-ins/RegExp/unicode.js, tests/language/expressions/string-literals.js
RegExp multiline tests are updated to use escaped \n instead of raw newlines; new test validates LS/PS characters are preserved in string literals.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

documentation

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Reject unescaped line terminators in string literals' accurately summarizes the main change, clearly describing the primary modification to lexer behavior.
Description check ✅ Passed The description provides a clear summary of changes, links the related issue (#619), and documents the testing status with most checkboxes completed appropriately.
Linked Issues check ✅ Passed The PR implementation directly addresses issue #619 by rejecting unescaped LF/CR in string literals, preserving LineContinuation, fixing TGocciaLexerError recognition, and updating affected tests.
Out of Scope Changes check ✅ Passed All changes directly relate to implementing the string literal line terminator rejection requirement: lexer modifications, error handling updates, test framework adjustments, and test file updates are all in scope.
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.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 10, 2026

Suite Timing

Test Runner (interpreted: 9,215 passed; bytecode: 9,215 passed)
Metric Interpreted Bytecode
Total 9215 9215
Passed 9215 ✅ 9215 ✅
Workers 4 4
Test Duration 2.11s 2.21s
Lex (cumulative) 255.7ms 175.0ms
Parse (cumulative) 275.9ms 277.2ms
Compile (cumulative) 607.9ms
Execute (cumulative) 2.25s 2.12s
Engine Total (cumulative) 2.78s 3.18s
Lex (avg/worker) 63.9ms 43.7ms
Parse (avg/worker) 69.0ms 69.3ms
Compile (avg/worker) 152.0ms
Execute (avg/worker) 562.0ms 530.0ms
Engine Total (avg/worker) 694.9ms 795.0ms

Memory

GC rows aggregate the main thread plus all worker thread-local GCs. Test runner worker shutdown frees thread-local heaps in bulk; that shutdown reclamation is not counted as GC collections or collected objects.

Metric Interpreted Bytecode
GC Live 244.30 MiB 238.74 MiB
GC Peak Live 244.30 MiB 238.74 MiB
GC Allocated During Run 248.20 MiB 242.63 MiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 1 1
GC Collected Objects 88 88
Heap Start Allocated 149.3 KiB 149.3 KiB
Heap End Allocated 2.54 MiB 2.54 MiB
Heap Delta Allocated 2.39 MiB 2.39 MiB
Heap Delta Free 140.1 KiB 140.1 KiB
Benchmarks (interpreted: 407; bytecode: 407)
Metric Interpreted Bytecode
Total 407 407
Workers 4 4
Duration 2.46min 2.35min

Memory

GC rows aggregate the main thread plus all worker thread-local GCs. Benchmark runner performs explicit between-file collections, so collection and collected-object counts can be much higher than the test runner.

Metric Interpreted Bytecode
GC Live 3.65 MiB 3.64 MiB
GC Peak Live 111.01 MiB 78.86 MiB
GC Allocated During Run 14.08 GiB 9.88 GiB
GC Limit 7.81 GiB 7.81 GiB
GC Collections 2,819 2,628
GC Collected Objects 260,336,376 233,363,105
Heap Start Allocated 2.29 MiB 2.29 MiB
Heap End Allocated 2.29 MiB 2.29 MiB
Heap Delta Allocated 128 B 128 B

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 10, 2026

Benchmark Results

407 benchmarks

Interpreted: 🟢 34 improved · 🔴 179 regressed · 194 unchanged · avg -1.9%
Bytecode: 🟢 169 improved · 🔴 94 regressed · 144 unchanged · avg +1.3%

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

Deterministic profile diff

Deterministic profile diff: no significant changes.

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 May 10, 2026

test262 Conformance

Category Run Passed Δ Pass Failed Pass-rate Δ Rate
built-ins 23,449 14,608 +2 8,837 62.3% ±0pp
harness 116 71 ±0 45 61.2% ±0pp
intl402 3,324 691 +524 2,633 20.8% +15.8pp
language 23,635 12,575 ±0 11,060 53.2% ±0pp
staging 1,484 485 +1 997 32.7% +0.1pp
total 52,008 28,430 +527 23,572 54.7% +1.0pp

Areas closest to 100%

Area Pass rate Δ vs main Passing
built-ins/WeakSet 98.8% ±0pp 84 / 85
built-ins/WeakMap 98.6% ±0pp 139 / 141
language/asi 97.1% ±0pp 99 / 102
Per-test deltas (+527 / -0)

Newly passing (527):

  • built-ins/Array/prototype/toLocaleString/invoke-element-tolocalestring.js
  • built-ins/Number/prototype/toExponential/undefined-fractiondigits.js
  • intl402/BigInt/prototype/toLocaleString/taint-Intl-NumberFormat.js
  • intl402/Collator/builtin.js
  • intl402/Collator/default-options-object-prototype.js
  • intl402/Collator/instance-proto-and-extensible.js
  • intl402/Collator/legacy-regexp-statics-not-modified.js
  • intl402/Collator/length.js
  • intl402/Collator/name.js
  • intl402/Collator/prop-desc.js
  • intl402/Collator/prototype/compare/bound-to-collator-instance.js
  • intl402/Collator/prototype/compare/compare-function-builtin.js
  • intl402/Collator/prototype/compare/compare-function-length.js
  • intl402/Collator/prototype/compare/non-normative-basic.js
  • intl402/Collator/prototype/compare/non-normative-phonebook.js
  • intl402/Collator/prototype/compare/non-normative-sensitivity.js
  • intl402/Collator/prototype/constructor/prop-desc.js
  • intl402/Collator/prototype/constructor/value.js
  • intl402/Collator/prototype/resolvedOptions/builtin.js
  • intl402/Collator/prototype/resolvedOptions/ignorePunctuation-not-default.js
  • intl402/Collator/prototype/resolvedOptions/length.js
  • intl402/Collator/prototype/resolvedOptions/name.js
  • intl402/Collator/prototype/resolvedOptions/prop-desc.js
  • intl402/Collator/prototype/this-value-collator-prototype.js
  • intl402/Collator/prototype/this-value-not-collator.js
  • intl402/Collator/prototype/toStringTag/toString-changed-tag.js
  • intl402/Collator/prototype/toStringTag/toString.js
  • intl402/Collator/prototype/toStringTag/toStringTag.js
  • intl402/Collator/supportedLocalesOf/builtin.js
  • intl402/Collator/supportedLocalesOf/length.js
  • intl402/Collator/supportedLocalesOf/name.js
  • intl402/Collator/supportedLocalesOf/prop-desc.js
  • intl402/Collator/supportedLocalesOf/taint-Object-prototype.js
  • intl402/Collator/test-option-ignorePunctuation.js
  • intl402/Collator/this-value-ignored.js
  • intl402/Collator/unicode-ext-seq-in-private-tag.js
  • intl402/constructors-string-and-single-element-array.js
  • intl402/Date/prototype/toLocaleString/default-options-object-prototype.js
  • intl402/DateTimeFormat/builtin.js
  • intl402/DateTimeFormat/canonicalize-timezone.js
  • intl402/DateTimeFormat/canonicalize-utc-timezone.js
  • intl402/DateTimeFormat/casing-numbering-system-calendar-options.js
  • intl402/DateTimeFormat/constructor-calendar-numberingSystem-order.js
  • intl402/DateTimeFormat/constructor-default-value.js
  • intl402/DateTimeFormat/constructor-no-instanceof.js
  • intl402/DateTimeFormat/constructor-options-dateStyle-valid.js
  • intl402/DateTimeFormat/constructor-options-dayPeriod-valid.js
  • intl402/DateTimeFormat/constructor-options-fractionalSecondDigits-valid.js
  • intl402/DateTimeFormat/constructor-options-order-dayPeriod.js
  • intl402/DateTimeFormat/constructor-options-timeStyle-valid.js
  • intl402/DateTimeFormat/constructor-options-timeZoneName-valid.js
  • intl402/DateTimeFormat/instance-proto-and-extensible.js
  • intl402/DateTimeFormat/intl-legacy-constructed-symbol-on-unwrap.js
  • intl402/DateTimeFormat/intl-legacy-constructed-symbol.js
  • intl402/DateTimeFormat/legacy-regexp-statics-not-modified.js
  • intl402/DateTimeFormat/length.js
  • intl402/DateTimeFormat/name.js
  • intl402/DateTimeFormat/numbering-system-calendar-options.js
  • intl402/DateTimeFormat/prop-desc.js
  • intl402/DateTimeFormat/prototype/constructor/prop-desc.js
  • intl402/DateTimeFormat/prototype/constructor/value.js
  • intl402/DateTimeFormat/prototype/format/format-function-builtin.js
  • intl402/DateTimeFormat/prototype/format/format-function-length.js
  • intl402/DateTimeFormat/prototype/format/offset-timezone-gmt-same.js
  • intl402/DateTimeFormat/prototype/format/temporal-zoneddatetime-not-supported.js
  • intl402/DateTimeFormat/prototype/formatRange/argument-tonumber-throws.js
  • intl402/DateTimeFormat/prototype/formatRange/builtin.js
  • intl402/DateTimeFormat/prototype/formatRange/fails-on-distinct-temporal-types.js
  • intl402/DateTimeFormat/prototype/formatRange/length.js
  • intl402/DateTimeFormat/prototype/formatRange/name.js
  • intl402/DateTimeFormat/prototype/formatRange/prop-desc.js
  • intl402/DateTimeFormat/prototype/formatRange/temporal-objects-throws-with-different-calendars.js
  • intl402/DateTimeFormat/prototype/formatRange/temporal-zoneddatetime-not-supported.js
  • intl402/DateTimeFormat/prototype/formatRange/this-bad-object.js
  • intl402/DateTimeFormat/prototype/formatRange/this-is-not-object-throws.js
  • intl402/DateTimeFormat/prototype/formatRangeToParts/date-undefined-throws.js
  • intl402/DateTimeFormat/prototype/formatRangeToParts/fails-on-distinct-temporal-types.js
  • intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-objects-throws-typeerror-with-dissimilar-types.js
  • intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-objects-throws-with-different-calendars.js
  • intl402/DateTimeFormat/prototype/formatRangeToParts/temporal-zoneddatetime-not-supported.js
  • intl402/DateTimeFormat/prototype/formatRangeToParts/this-bad-object.js
  • intl402/DateTimeFormat/prototype/formatRangeToParts/this-is-not-object-throws.js
  • intl402/DateTimeFormat/prototype/formatToParts/formatToParts.js
  • intl402/DateTimeFormat/prototype/formatToParts/length.js
  • intl402/DateTimeFormat/prototype/formatToParts/name.js
  • intl402/DateTimeFormat/prototype/formatToParts/related-year-zh.js
  • intl402/DateTimeFormat/prototype/formatToParts/return-abrupt-tonumber-date.js
  • intl402/DateTimeFormat/prototype/formatToParts/temporal-zoneddatetime-not-supported.js
  • intl402/DateTimeFormat/prototype/formatToParts/this-has-not-internal-throws.js
  • intl402/DateTimeFormat/prototype/formatToParts/this-is-not-object-throws.js
  • intl402/DateTimeFormat/prototype/formatToParts/time-clip-to-integer.js
  • intl402/DateTimeFormat/prototype/resolvedOptions/builtin.js
  • intl402/DateTimeFormat/prototype/resolvedOptions/length.js
  • intl402/DateTimeFormat/prototype/resolvedOptions/name.js
  • intl402/DateTimeFormat/prototype/resolvedOptions/no-instanceof.js
  • intl402/DateTimeFormat/prototype/resolvedOptions/offset-timezone-basic.js
  • intl402/DateTimeFormat/prototype/resolvedOptions/prop-desc.js
  • intl402/DateTimeFormat/prototype/this-value-datetimeformat-prototype.js
  • intl402/DateTimeFormat/prototype/this-value-not-datetimeformat.js
  • intl402/DateTimeFormat/prototype/toStringTag/toString-changed-tag.js
  • … 427 more

Steady-state failures are non-blocking; regressions vs the cached main baseline (lower total pass count, or any PASS → non-PASS transition) fail the conformance gate. Measured on ubuntu-latest x64, bytecode mode. Areas grouped by the first two test262 path components; minimum 25 attempted tests, areas already at 100% excluded. Δ vs main compares against the most recent cached main baseline.

frostney and others added 3 commits May 10, 2026 14:39
Remove the JS test directory that used new Function() and add proper
Pascal unit tests to Goccia.Lexer.Test.pas instead — covers all four
line terminators (LF, CR, LS, PS) and verifies LineContinuation still
produces the expected value.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… tests

ES2019 (proposal-json-superset) allows U+2028 and U+2029 in string
literals. Only LF and CR remain forbidden. Corrects the lexer check
from IsLineTerminator (which includes LS/PS) to Peek = #10 or #13.

Moves tests from Pascal unit layer to CLI CI layer
(scripts/test-cli-lexer.ts) — the correct home for lexer error
verification. Adds positive LS/PS test to string-literals.js. Restores
raw LS/PS bytes in RegExp/unicode.js that were incorrectly escaped.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@frostney frostney marked this pull request as ready for review May 10, 2026 14:50
@coderabbitai coderabbitai Bot added bug Something isn't working spec compliance Mismatch against official JavaScript/TypeScript specification internal Refactoring, CI, tooling, cleanup labels May 10, 2026
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 current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scripts/test-cli-lexer.ts`:
- Around line 46-52: The test cases array named "cases" is missing the
single-quoted CRLF scenario; add an entry for the single-quoted CRLF rejection
(i.e., the string containing '\r\n' wrapped in single quotes) with the same
description "CRLF in single-quoted string" so both quote styles cover LF, CR,
and CRLF (update the const cases: [string, string][] to include the new
['\'hello\r\nworld\'', "CRLF in single-quoted string"] entry).
🪄 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: 9330ac34-80fd-4fd7-a155-be6dae4249f8

📥 Commits

Reviewing files that changed from the base of the PR and between ccce182 and 810fa44.

📒 Files selected for processing (8)
  • scripts/test-cli-lexer.ts
  • source/units/Goccia.Builtins.TestingLibrary.pas
  • source/units/Goccia.Error.Suggestions.pas
  • source/units/Goccia.Evaluator.pas
  • source/units/Goccia.Lexer.pas
  • source/units/Goccia.VM.pas
  • tests/built-ins/RegExp/unicode.js
  • tests/language/expressions/string-literals.js

Comment thread scripts/test-cli-lexer.ts
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai coderabbitai Bot added the documentation Improvements or additions to documentation label May 10, 2026
@frostney frostney merged commit 05f0826 into main May 10, 2026
14 checks passed
@frostney frostney deleted the t3code/issue-619-fix branch May 10, 2026 20:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working documentation Improvements or additions to documentation internal Refactoring, CI, tooling, cleanup spec compliance Mismatch against official JavaScript/TypeScript specification

Projects

None yet

Development

Successfully merging this pull request may close these issues.

String literals should reject unescaped line terminators per ES spec

1 participant