0.4.8
Highlights
- Faster programs:
- Counted loops run two iterations at a time where the iterations are independent: a single-file mandelbrot port is 39% faster.
- A class whose instances form a tree, each node owned by one parent, keeps its nodes in the group arena that holds the rest of the tree, at 16 bytes per node instead of 24: a class-based binary-trees program is 20% faster and uses 33% less peak memory.
- A dictionary update fuses its second hash probe into the write that follows (4.5% faster on dictionary walks), and number and identity-word map keys hash with one multiply instead of two (6.9% faster on number-key maps).
- A run of dynamic property reads on one object shares one guard, untyped code calls typed records' dynamic parameters through specialized calls, and dynamic class tables dispatch on an indexed class key.
- Compact class fields store 32-bit references to arrays, maps, sets and instances, so programs that keep many objects use less memory.
- musl executables use an allocator built for the program they link into: across the runtime benchmarks they are 2.9% faster, line-by-line reading is 39% faster, and an HTTP server's peak memory falls from 34.6 MiB to 2.4 MiB. musl executables also use musl's string comparison and a faster
getenv. - x86-64-v3 builds keep baseline copies of the program's functions.
- Faster builds:
- The thin-LTO pre-link runs at the build's optimization level: a cold build of a large program is 2.4% faster, with the LLVM stage 10% faster and the same runtime speed.
- The partition cache also covers builds that name their LLVM helper with
SCRIPTC_LLVM_HELPER: a warm one-function edit of a large program rebuilds 13% faster in that setup. - A build shares one frontend services scope across its loads, memoizes type mappings per generic binding context, shares type-memo entries that read no type-parameter binding, and computes its preflight diagnostics once. Island rounds share their program facts across lowering passes.
- LLVM partitions are sized from the host's threads as well as the module, the emission passes read their node scans from one recorded walk, and IR functions decode without a whole-document number reviver.
- The LLVM helper's identity is checked once per install, the installed compiler package digest is reused, and edit builds keep less per-build bookkeeping. The native compiler's optimization profile is refreshed.
- Node.js parity:
- node:path, node:url and node:os match Node 24. node:buffer matches Node 24's Buffer members, encodings and module surface. node:zlib adds the zstd API.
util.inspectsupportsshowHidden,numericSeparator,maxStringLength,maxArrayLengthand thegettersoption,console.dirsupportsshowHidden, and errors print from their stack inutil.format,util.inspectandconsole.log.- child_process lowers the shell forms, typed
spawnSyncoptions includingcwdandinput, thecwdoption of the exec and execFile callback forms, and child stdio pipes typed as node:stream streams. - node:http applies Node's HTTP/1 parser checks, answers ClientRequest listeners, reports late Transfer-Encoding errors, and lowers the server
'clientError'event and the URL-plus-options request form withprotocoland shorthandheaders. process.stdinhas its readable surface, readline acceptsprocess.stderroutput and runtime question options, andgetEventListenersanswers for EventTarget receivers.- ArrayBuffer transfer, detach and resizable or growable buffers compile. A cgroup CPU quota below one CPU is floored at one.
- Node.js is pinned to 24.22.1.
- JavaScript semantics (Test262):
- More early errors are reported,
RegExpcoerces its constructor arguments, and the async-generatoryield*delegation protocol is implemented. - Class values honor
Symbol.hasInstance. Promise statics accept a foreign constructor. Iterator helpers run on a liveIterator.prototype. - BigInt typed arrays work in the checked-dynamic tier, and builtin global functions and classes have values in JavaScript sources.
- Generator parameters bind at the call, higher-order functions honor
thisArg, pattern defaults take their binding's name, and object literals accept__proto__with any prototype value.
- More early errors are reported,
- Node islands: coverage lowers once with the islands the build proves, packages that are not opted in keep their JavaScript out of the inferred surface, and npm-static packages are classified only from real loads.
- Correctness: a record reached through an alias keeps writes made through either name when its shape widens under the shape overlay.
- TypeScript: more record, union and generic patterns compile, among them overload sets held as values, class overload declarations, unions of a class and its subclasses,
Object.assignover a narrowed record arm, and partial record views that gain keys through dynamic writes.