Releases: PerryTS/perry
Release list
v0.5.1220
Distribution follow-up to v0.5.1219 (see its notes for the full 394-commit changelog since v0.5.1182 — NestJS, current-thread async runtime, type lowering, the test262 waves, and more). The v0.5.1219 brew/apt/winget/workers channels never published due to a release-packaging dispatch bug; this release ships those channels plus:
v0.5.1219
394 commits since v0.5.1182.
Highlights
- Native NestJS support — express adapter, DI container, decorators + reflect-metadata, rxjs interceptor interop, guards/pipes/filters (#5739, #5758–#5760, #5721)
- New current-thread async runtime — JS-loop-driven runtime with wait-driver and gated fast-native-drive; native I/O and JS interleave on one thread, Node's model, eliminating the cross-thread lost-wakeup family (#5831, supersedes #5779). A link-order bug that could strand the new runtime (test-only perry_ffi shims shadowing the real bridge) was found and fixed in the same release (#5892, #5911)
- CPS async lowering for async class methods, capturing-closure functions, and nested async closures (#5854)
- Representation-aware type lowering with a native-ABI material-evidence gate in CI (#5466)
- Embed static assets into standalone executables (#5754) and eval-mode
worker_threadsWorkers from inline source (#5799) - Promise spec-compliance batch — then/finally SpeciesConstructor + error propagation (#5767), user-defined own
thenhonored (#5748), own-property dispatch fixes (#5865), reaction-slot clobber fix for the webpack/Turbopack shared-chunk-promise hang (#5867)
Node.js compatibility
fetch: AbortSignal cancel/timeout (#5690), byte-exact binary request/response bodies (#5661, #5778, #5660), Request-init header merge (#5704)http: IncomingMessage.pipe() so node-fetch/gaxios bodies flow (#5787), streamed-body chunks carried as Bytes (#5419), requestTimeout validation (#5670)process.stdinas a functional raw-mode Readable (#5733);gc()exposed on globalThis (#5712); old-gen arena included inprocess.memoryUsage()(#5713)net/tls: TCP_NODELAY by default +socket.setNoDelay(#5658), zero-copy socket reads (#5623), SSO short-string value conversion (#5638)- zlib late-attaching stream consumers (#5809), truly-async live Readable consumption (#5810),
node:vmrunInContext against the context global (#5722) - fastify performance batch: O(1) static-route lookup, per-request context caching, SIMD WebSocket frame unmasking, SO_REUSEPORT for cluster workers (#5691–#5699, #5644, #5646)
Language & conformance (test262)
- Large conformance waves across Object, String, JSON, Function, Promise, Proxy, WeakMap/WeakSet, RegExp, Temporal, Intl, annexB, and eval/global-scope semantics (#5579–#5592 clusters, #5824, #5842–#5849, #5876–#5883)
switchinside async/generator state machines no longer miscompiles (#5885)- Intl additions:
Intl.DisplayNames(#5512),Intl.DurationFormat(#5405),NumberFormat.formatRange(#5771), Locale info methods (#5602), BigInttoLocaleString(#5879) - WeakMap/WeakSet are now actually weak (#5468);
Symbol.hasInstancehonored ininstanceof(#5667);new.targetin registered-class constructors (#2768/#5656) - Regex: Unicode 16 scripts, lone surrogates, quantified lookaround, Annex B.1.4 under
/u, cached-pattern revalidation skips (#5781, #5629, #5749, #5808)
Performance
- Typed-array element access fast path (~2× bcrypt) (#5525 cluster)
- O(1) wide-object property insertion and lookup (#5528, #5738)
- Oversized-module codegen: full-outlined dispatch towers and IC diamonds, -Os instead of -O0 for oversized IR units (#5674–#5682)
Platforms, UI, packaging
- Windows plugin support (#5409) + wgpu-on-win64 link/ABI fixes (#5814); arm64_32 watchOS startup crash fix (#5801);
android-x86_64target triple (#5743) - BloomView embedding with live-render plumbing on every backend (#5518, #5538);
perry/adsend-to-end (#5578); window-less menu-bar app launch (#5813) - sharp: AVIF encode, EXIF auto-orient, extend/trim/composite, SIMD resize (#5448–#5456)
- Configurable compile cache dir, defaulting to
node_modules/.cache/perry(#5416) - Dependencies: bson 3.1 (with the mongodb
bson-3feature migration, #5887), cairo-rs 0.22, sha3 0.12, sqlite stack on libsqlite3-sys 0.35 (#5802)
Stability
- CI/test-infra hardening: production ext archives no longer carry test-only perry_ffi shims that could shadow the real async bridge at link time and strand the event loop (#5892, #5911)
- Segfault/SIGBUS fixes: JSON.stringify on handle-band values (#5723),
class extends <Proxy>(#5634), string-coercing a class method (#5633),new C(...spread)(#5710), dayjs timestamp computed-member get (#5465) Object.setPrototypeOfcycle-detection walked past the chain end, making every set on a ≥2-deep prototype chain throw (#5866)- GC: dead old-gen block reclamation under pressure (#5734), full collection on explicit
gc()(#5714) - Next.js/webpack bundle correctness cluster (#5437): capture snapshots for cross-module member-
new, class/local shadowing, boxing analysis descending into labeled blocks (#5871), captured-undefinedtag preservation (#5648)
v0.5.1182
Native TypeScript compiler. This is the release that restores full package distribution — v0.5.1180/1181 were blocked at the publish step (a Windows build break, then a merge-skew test regression). v0.5.1182 clears both and re-publishes all channels, including npm and Windows.
Highlights
- Windows build + publish restored.
perry-ui-windowsmigrated towindows/windows-core0.62 — thewebview2-com0.39 bump had skewed the WebView2 COM type versions, failing the Windows leg and causing every publish job to be skipped (#5382). - Native-
requiredestructuring fixed.const { x } = require("<native-builtin>")no longer resolves the bound leaf toundefined— a merge-skew interaction between native-require aliasing (#5216) and module-level destructuring-leaf pre-registration (#5364) (#5383).
Fixes
- fix(perry-ui-windows): migrate to windows / windows-core 0.62 — unblock Windows release publish (#5382)
- fix(hir): native-builtin require destructuring stranded on a pre-registered module-var slot — #5364 × #5216 merge skew (#5383)
(Carries everything from the unpublished v0.5.1181 tag: winston native-compile #5368, bluebird/execa read-of-undefined #5348, stream-shim ctor routing #5357, module-scope destructuring hoist #5364, AnnexB B.3.3 fixes #5356, Symbol argArray rejection #5360, Intl.Locale #5359, and codegen perf levers #5350/#5351/#5381.)
v0.5.1181
Native TypeScript compiler. This release restores full package distribution — v0.5.1180's publish step was blocked by a Windows build break, so npm + Windows assets did not update. v0.5.1181 fixes that and re-publishes all channels.
Highlights
- Windows build + publish restored.
perry-ui-windowsmigrated towindows/windows-core0.62 (thewebview2-com0.39 bump had skewed the WebView2 COM type versions, failing the Windows leg and skipping every publish job). npm + Windows binaries update again with this release (#5382).
Fixes
- fix(perry-ui-windows): migrate to windows / windows-core 0.62 — unblock Windows release publish (#5382)
- fix: native-compile winston — ES5
.call(this)super-chain, 59/59 corpus (#5368) - fix(compile,runtime): read-of-undefined cluster — bluebird/execa native-compile (#5348)
- fix(hir,codegen): route class-extends userland stream-shim ctor through its real constructor (#5357)
- fix(hir): hoist module-level destructuring binding (bottom-of-file require) into module scope (#5364)
- fix(hir): skip AnnexB B.3.3 legacy var on for-head/destructuring-catch early errors (#5356)
- fix(runtime): reject Symbol argArray in Function.prototype.apply (#5360)
- codegen: enforce derived-ctor this-TDZ on the standalone constructor-symbol path (#5362)
Features
- feat(intl): implement Intl.Locale constructor (#5359)
Performance
v0.5.1180
Native TypeScript compiler — 130 commits since v0.5.1167. Highlights below; full diff: v0.5.1167...v0.5.1180.
Highlights
- npm packages compile natively at much higher fidelity — extensive CJS-wrap and resolution fixes for ajv, pino, commander, execa, hono, semver/joi/winston, uuid, dayjs.
- Intl support expanded —
getCanonicalLocales,supportedValuesOf,formatToParts, plusListFormat/RelativeTimeFormat/PluralRules(#5320). - Codegen & lowering perf — outlined inline allocator (~17% faster), shared constructor symbol (~2.5x), O(1) HIR registry/scope/closure-capture analysis, smaller IR.
- Binary size — per-app feature gating (regex/Temporal/URL/normalize/segmenter), devirtualized native-module dispatch (−20% hello-world __text), gated dgram/diagnostics.
Features
- feat(intl): getCanonicalLocales, supportedValuesOf, formatToParts + ListFormat/RelativeTimeFormat/PluralRules (#5320)
- feat(hir): Annex B B.3.3 sloppy block-level function hoisting (#5319); emit nested namespaces (#5167)
- feat(error): source location on construct + ReferenceError throws (#5274); on dynamic call-dispatch TypeErrors (#5250)
- feat(compile): defer unimplemented node/stdlib APIs, dynamic import(), eval/new Function, and .wasm imports to throw-on-reach (#5246, #5233, #5209, #5236); text-asset imports as string (#5224)
- feat(cluster): primary-coordinated shared port for listen(0) + SCHED_RR fd-passing (#5193)
- feat(wearos): full Wear OS app target — `--target wearos` / `perry run wearos` (#5173)
- feat(resolve): honor tsconfig compilerOptions.paths/baseUrl (#5215); lower require("") to module namespace (#5220)
- feat(plugin): unregister/off methods for hooks, tools, services, routes, events (#5279)
- feat(compile): per-app feature gating for regex/Temporal/URL/normalize/segmenter (#5153)
- feat(ui-windows-winui): render-backend dispatch seam + startup probe (#4897)
Fixes
- CJS/compile-package: alias-vs-named-export collisions, chain-aware class hoist, function-nested class exports, commander real-source compile (#5337, #5328, #5325, #5212)
- resolve: honor 'node' exports condition above 'default' (execa) (#5339); symlinked relative imports (#5210)
- proxy/reflect: Array.prototype on proxy arrays (#5208), Reflect.set/construct receiver segfaults (#5164, #5184)
- http/net: res.setHeaders SIGSEGV (#5175), 100-continue handshake (#5123), web-fetch/node:http pump split (#5189), socket.write from data handler (#5120)
- runtime/object: getPrototypeOf identity (#5192), symbol keys + accessor descriptors (#5177), TypedArray @@toStringTag (#5318), Promise expando props (#5188)
- gc: register per-class keys-array global as GC root (#5162); root source string across slice (#5160)
- regex: stop false-rejecting valid char classes & bounded quantifiers (#5277)
- Next.js standalone walls 36-46 (#5125, #5152, #5178)
Performance
- perf(codegen): outline per-new-site inline allocator (#5294); shared constructor symbol (#5304); inline class-field shape guard (#5198); guarded numeric array index reads (#5132)
- perf(hir): O(1) registry/scope/closure-capture lookups, fix exponential native-fluent re-lowering (#5267, #5270)
- perf(transform): inline small this-using methods on exact receivers (#5092)
- perf(size): devirtualize native-module dispatch tables (#5256)
Infrastructure
- ci: move sccache onto persisted disk cache (#5324); cache-warm workflow (#5326); bound cargo-test timeout (#5221)
- test262: un-skip eval/intl402/property-escapes; honest parity numbers (#5300, #5327)
- npm: ship static archives zstd-compressed to clear E413 size limit (#5145)
- test(node-suite): ratchet baseline to clean 98.1% (#5166)
v0.5.1167
v0.5.1167 — fix(runtime): relink node:http/net — restore js_node_system_error_value (#5124)
Release-blocking regression fix folded in via #5124. PR #5112 (Next.js
standalone walls) refactored crates/perry-runtime/src/error.rs and dropped the
#[no_mangle] pub unsafe extern "C" fn js_node_system_error_value definition
and its #[used] KEEP_JS_NODE_SYSTEM_ERROR_VALUE anchor, while perry-ffi's
error::system_error_value still calls that symbol. The result: compiling any
program that links the http/net extension archive failed at the link step with
undefined reference to 'js_node_system_error_value' (collect2: ld returned 1).
It went unseen because perry-runtime's own cargo test builds with the full
feature set, so the symbol was present there — only the auto-optimize compile
path (minimal feature set, extension archives linked after LTO) hit it. The
issue_4903_listen_callback_deferred integration tests, which actually run
perry compile on a net program, are what surfaced it on the v0.5.1166 release
tag (whose cargo-test gate failed for this reason). The symbol + keepalive anchor
are restored verbatim (same construct as the three sibling KEEP_JS_* FFI
entries). Added in #5078, dropped by #5112, restored by #5124.
v0.5.1166
v0.5.1166 — Node-parity & robustness sweep (10 fixes)
Rolls up the issue-fix batch merged on top of 0.5.1165. Per-PR detail lives on
each GitHub PR; the headline changes:
- fix(http):
res.headers['set-cookie']is now an array, and repeated
headers fold per Node'smatchKnownFieldsrules (set-cookie → array, cookie →
"; ", others →", ", single-value keeps first). (#5079 / #5102) - fix(runtime): over-large
TypedArray/Buffer/Map/Set/array
allocations now throw a catchableRangeErrorinstead of aborting the
process. (#5067 / #5103) - fix(reflect):
Reflect.constructerror-message wording matches Node.
(#2768 / #5105) - fix(util):
util.format%o/%Oquote top-level strings, and
util.inspectrenders the[Object: null prototype]prefix. (#5106, #5107) - perf(compile): oversized modules compile at
-O0to fix the
wide-object-literal codegen blowup (env override
PERRY_LL_O0_THRESHOLD_BYTES). (#4880 / #5109) - fix(url):
String(), template interpolation, and+-concat ofURL/
URLSearchParamsyieldhref/ query string (Node parity). (#5108) - fix(hir): in-function classes now run their static field initializers and
static blocks. (#5110) - fix(fs):
fsPromises.watch()re-baselines its snapshot at the first
.next()so writes after the call are delivered (#5099 regression). (#5117) - fix(runtime,codegen,hir): Next.js standalone compile walls 31–35. (#5112)
v0.5.1159
Security release
Fixes a path traversal / arbitrary file write in perry publish — GHSA-x55v-q459-68ch (CVSS 4.0 8.6, High, CWE-22).
perry publish trusted the build server's ArtifactReady.artifact_name and download_path verbatim when constructing the local destination path. A malicious or compromised hub could deliver a traversal payload (e.g. ../../.ssh/authorized_keys) to write downloaded content outside the chosen output directory (arbitrary file write), and in the self-hosted-hub local-copy path could copy out arbitrary local files (arbitrary read). The primary multi-victim vector is a malicious PR setting [publish] server = "…" in a repo's perry.toml; CI runs receive no confirmation prompt.
All versions through v0.5.1158 are affected. Upgrade to v0.5.1159.
- fix(publish): sanitize server-controlled artifact path — reduce
artifact_nameto a bare, traversal-free filename and gate thedownload_pathlocal-copy shortcut to loopback hubs (#4989)
Reported by @wsparks-vc.
v0.5.1158
Highlights
- Stub-elimination epic (#4919) substantially landed. The manifest
stubflag is now actually populated, stubbed APIs warn on first call, andPERRY_STRICT_STUBS=1turns any stub hit into a hard error (#4929). On top of that floor, formerly-fake APIs became real:node:dns/node:dgramdo real network I/O (#4911),child_process.exec/execFileare truly async with realChildProcesshandle semantics (#4912, #2130/#1934),Atomics.wait/notify/waitAsyncblock and wake for real acrossperry/threadagents over a sharedSharedArrayBuffer(#4913), streams gained BYOB readers + realByteLengthQueuingStrategyaccounting (#4915), andv8.writeHeapSnapshotemits a real snapshot from a GC heap walk (#4916). - Real
AsyncLocalStorage+async_hookscontext propagation (#788/#789) — context tracked acrossawait, microtasks, timers, andprocess.nextTick, with Node-v26-exact run/exit/enterWith semantics. - React render-time walls cleared (#4950) — JSX createElement mode gated on react import, nested-function branch-var hoisting, timers/AbortController as values, surrogate-range regex classes; plus
export default classbodies lower correctly (#4976) and synthesized capture ctors on derived classes callsuper()(#4972). - node:http/https parity batch (#4903–#4910) — deferred
'listening'emit, constructableAgent/ClientRequest/IncomingMessage/ServerResponse, server/socket lifecycle methods, client TLS options honored (rejectUnauthorized/ca/checkServerIdentity), ERR_*-coded argument/header validation, write/end callbacks + backpressure + real client timeouts,tls.connectNode overloads. clusterworkers share a listening port (#4914) — SO_REUSEPORT + fork-IPC'listening'round-trip + lifecycle events.- test262 parity gains across the board — Temporal → 98.3%, built-ins/Function → 93.7%, Promise async-resolution/capability, Array iteration/mutation v4+v5, Object v3, class/expression/statement language-semantics remnants, Date setters/parse, BigInt
++/--. - Intl.Segmenter (grapheme/word/sentence, #4882), regex
dflag/hasIndices (#4930),\p{RGI_Emoji}& friends (#4889). - GC/codegen hardening — unregistered box-pointer rejection fixes the react-reconciler SIGBUS-on-import (#4898), boxed slots are entry-initialized so skipped-Let paths can't leak undef pointers (#4926), closure side-table GC deadlock fixed (#4956), automated write-barrier store-site audit (#4886).
fetch()sends dynamically-built request headers (#4932) — headers from variables, spreads,Object.assign, ornew Headersno longer silently dropped.
Fixes
- test(codegen): unbreak typed_shape_descriptors after #4957 bulk-fill lowering (#4984)
- fix(net,ext-http): tls.connect Node overloads + https idle-connection close path (#4971) (#4983)
- fix(hir): lower inline
export default classbodies — methods/fields survive (#4976) (#4981) - fix(hir): synthesized capture ctor on a derived class must call super() (#4972) (#4980)
- feat(diagnostics): real v8 heap snapshot from GC heap walk + inspector/repl honesty (#4916) (#4979)
- fix(http): falsy ClientRequest method defaults to GET instead of throwing (#4970) (#4978)
- fix(hir,codegen,runtime): clear the #4950 React render-time walls (#4969)
- feat(runtime): real child_process spawn/exec ChildProcess handle semantics (#2130/#1934) (#4968)
- feat(runtime): real AsyncLocalStorage + async_hooks context propagation (#788/#789) (#4967)
- feat(streams): BYOB readers + real ByteLengthQueuingStrategy accounting (#4915) (#4966)
- fix(http): client write/end callbacks + backpressure, real client timeouts, dynamic listener registration (#4909) (#4964)
- feat(cluster): workers share a listening port — SO_REUSEPORT + IPC 'listening' round-trip (#4914) (#4963)
- fix(compile): support package createRequire interop (#4960)
- perf(runtime): optimize numeric array raw payload helpers (#4957)
- fix(hir): self-named native member base no longer OOM-loops codegen (#4908) (#4955)
- fix(http): wire res.write/res.end callbacks + backpressure boolean into static dispatch (#4909) (#4954)
- feat(atomics): real cross-agent Atomics.wait/notify/waitAsync over a shared SAB (#4913) (#4952)
- fix(runtime): expose prototype for class expression values (#4953)
- fix(http): TimeoutOverflowWarning on req.setTimeout overflow + pid-canonical parity (#4910) (#4951)
- fix(gc): avoid closure side-table GC deadlock (#4956)
- fix(http,assert): node:http argument/header/URL validation throws ERR_* (#4907) (#4948)
- fix(cjs_wrap): flat-emit
module.exports = <Class>that closes over a top-level binding (#4933) (#4947) - fix(child_process): make exec/execFile async — off-thread, callback on a later tick (#4912) (#4941)
- fix: Discord BigInt and root import reducers (#4946)
- fix(runtime): hide private names from Reflect.has/in inherited probe (#4945)
- fix(runtime): built-ins/Array mutation/iterator/array-like test262 parity (v5) (#4944)
- fix(hir): non-class language-semantics remnant test262 parity (#4943)
- fix(runtime): built-ins/Promise async-resolution + capability test262 parity (#4942)
- feat(runtime): real node:dns + node:dgram network I/O (#4911) (#4940)
- fix(fetch): send dynamically-built request headers (#4932) (#4939)
- fix(http,net,hir): server/timer/socket lifecycle methods (#4905) (#4938)
- fix(http): make Agent/ClientRequest/IncomingMessage/ServerResponse constructable via new (#4904) (#4936)
- feat(runtime): implement regex
dflag (hasIndices) (#4930) - fix(https): honor client TLS options + accept v1 server certs (#4906) (#4935)
- test: process stdio write regression (#4934)
- fix(codegen,runtime): entry-initialize boxed slots — eliminate undef box-pointer operands (#4926) (#4931)
- feat(stubs): stub-elimination keystone — manifest stub flag, warn on first call, PERRY_STRICT_STUBS (#4918/#4919) (#4929)
- fix(ext-http-server): defer 'listening' emit + listen callback to event-loop tick (#4903) (#4924)
- chore(runtime): split date.rs under the 2000-line CI cap (#4925)
- fix(runtime): Temporal PlainDate/YearMonth/MonthDay/Time/Instant/Now tail → 98.3% (#4923)
- fix(hir,runtime): non-class expression-semantics remnant test262 parity (#4922)
- fix(hir): non-class statement-semantics test262 remnant (#4920)
- fix(runtime,codegen): built-ins tails v2 — TypedArray toString, String 0-arg methods, JSON array cycles, Proxy symbol args (#4900)
- fix(runtime): reject unregistered box pointers in js_box_set/get (#4898) (#4902)
- fix(runtime): small built-ins tails — Date setters/parse, BigInt ++/-- (#4901)
- refactor(runtime): centralize handle-vs-pointer address classification (#4899)
- fix(runtime): route string primitives through real String iterator (#4892) (#4893)
- feat(ui-windows-winui): real Windows App SDK bootstrap probe (#4680 step 2) (#4896)
- fix(runtime): built-ins/Array callback-iteration methods test262 parity (v4) (#4895)
- fix(runtime): Temporal ZonedDateTime/PlainDateTime/Duration tail → ~96.7% (#4894)
- fix(regex): expand \p{RGI_Emoji} & friends to supported emoji primitives (#4889) (#4891)
- fix(hir): class test262 remnant — eval-in-class early errors, ctor return-override, static-field this (#4888)
- fix(regex): rewrite \p{Surrogate} to a never-matching class (#4884) (#4887)
- feat(gc): automate write-barrier store-site audit; barrier structuredClone object fields (#4886)
- fix(compile): resolve barrel/type-only default-import link wall (nestjs) (#4872) (#4885)
- fix(runtime): keep js_promise_report_unhandled_rejections alive through auto-optimize LTO (#4876) (#4883)
- feat(intl): implement Intl.Segmenter — grapheme/word/sentence (#4882)
- fix(codegen): provenance-based transitive disqualification for integer locals (#4785 bug class) (#4881)
- fix(hir): route global new MessageChannel()/BroadcastChannel() to runtime constructors (#4873) (#4875)
- fix(compile): namespace import of CJS default re-export resolves member value (#4841) (#4874)
- fix(runtime,hir): built-ins/Function test262 parity (v2) — 67.4% → 93.7% (#4868)
- feat: install.sh download/extraction progress + per-distro toolchain docs (#4869)
- deps: bump indicatif 0.17.11 → 0.18.4 (#4865); cargo minor/patch group (#4864)
- fix(runtime): built-ins/Object test262 parity (v3) (#4863)
- fix(hir): statement-semantics test262 tail (v2) (#4861)
- fix(ci): make npm-publish idempotent — skip already-published versions (#4870)
- fix(ci): raise perf-gate noise floors to match observed runner variance (#4867)
- chore(release): v0.5.1158 — roll-up changelog + version bump (#4990)
Full Changelog: v0.5.1151...v0.5.1158
v0.5.1151
Highlights
- Release pipeline is green end-to-end again. v0.5.1150 shipped with 5 of 19 platform build jobs red (so npm/homebrew/apt/winget publish never ran) and a Regression Check that had hung at the 6-hour timeout on every run since v0.5.1129. All root causes fixed (#4857).
- Android builds fixed — borrow-lifetime error (E0597) in
perry-ui-androiddrag & drop broke bothaarch64-andx86_64-linux-androidjobs. - Windows builds fixed —
windows-coredirect dependency for#[implement]COM authoring (#4837) ships in a release for the first time. - Dense-array growth no longer quadratic — #4648's absolute 1M dense cap routed sequential large-array fills through string-keyed sparse properties (linear scan per insert). A 10M-element fill went from never finishing (6h CI timeouts) to ~3.3s. Sparse storage is now gated on the jump a write makes past the current length (engine-style dictionary-mode heuristic); reads consult sparse storage only past capacity.
- Performance regression gate actually works now —
compare.sh --json-outresolved relative to the wrong directory, so the comparison had silently crashed (and| teeswallowed the exit) on every run since at least v0.5.1122; release-mode "hard-fail" gates were comparing nothing. Fixed, pluspipefail, a 100-minute job timeout, and both the performance and binary-size baselines refreshed from current measured runs.
Fixes
- fix(ci): unbreak release platform builds + lint gates (#4857)
- fix(codegen): String.match no-match returns null, not a boxed null pointer (#4858, #4860)
- fix(codegen,ci): keep stale Apple cross runtimes from breaking iOS/tvOS links (#4856, #4859)
- fix(transform): generator id scans must see closures in every Expr variant (#4851, #4854)
- fix(runtime): class subclass + async-method + definition test262 tail (#4853)
- test(#4841): Stripe protoExtend regression + readable unhandled rejections + handled-rejection false-positive fix (#4852)
- fix(hir): operator-expression semantics test262 tail — inc/dec ToNumber, != bigint/object, instanceof (#4850)
- fix(http): expose OutgoingMessage and server defaults (#4503)
- fix(codegen): non-arrow function expressions get fresh identity (#4831 follow-up, #4849)
- fix(tvos/watchos): CFBundleVersion from perry.toml + emit GM DT* SDK keys (#4848)
- fix(hir): private-member brand-check on access + class-element tail v3 (#4847)
- fix(hir): class destructuring (dstr) test262 tail v2 (#4846)
- fix(codegen): guard cyclic inheritance walks against non-termination (#4845)
- fix(runtime): new WeakMap()/Map/Set from a constructor value no longer throws "requires 'new'" (#4844)
- fix(runtime): honor JSON reviver prototype lookups (#4665)
- fix(runtime): low-hanging test262 tails — URI/parse/Number/collections/Reflect (#4843)
- fix(hir): expression-semantics test262 tail — object-literal NamedEval/gen-method dstr, delete, interleaved spread (#4842)
- fix(runtime): built-ins/Array iteration/mutation methods test262 parity v3 (#4839)
- fix(runtime): Promise static-method receiver + combinator/reflection/unhandled-rejection parity (#4838)
- fix(windows): WebView2 COM init + dropped-init-result so WebView renders (#4835, #4837)
- fix(codegen): dispatch Stripe-style cross-module
extendthrough runtime method call (#4831, #4836) - fix(stdlib): emit one header line per array-valued header in node:http (#4826, #4829)
- style/refactor: unbreak the lint gate on main — cargo fmt after #4853 + body_stmt.rs file-size split (#4855)
Known issues
date::tests::test_full_year_setters_revive_invalid_date_onlyfails when run in a non-UTC local timezone (CI is UTC): local-time revive of an invalid Date viasetFullYearreturns NaN.