Releases: PerryTS/perry
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.
v0.5.1150
Highlights
- Massive TC39 test262 parity push across the spec surface — Temporal (Duration/Instant 29.8%→88.5%, ZonedDateTime 34%→84%, PlainDate/PlainDateTime/PlainTime/YearMonth/MonthDay/Now), async generators 57.7%→93.0%, plus broad Array/String/Function/Object/Proxy/Promise/RegExp/class/iteration/expression-semantics work.
- Explicit Resource Management —
using/await using/Symbol.dispose/Symbol.asyncDispose/DisposableStack(#4795, #4812). - SharedArrayBuffer + non-agent Atomics spec parity (#4794, #4803).
- Annex B web-compat — String HTML methods, Object accessor methods,
RegExp.prototype.compile,escape/unescape(#4796, #4813). - Lone-surrogate round-tripping via WTF-8 (#4793, #4806) and fancy-regex fallback wired through every RegExp op (#4797, #4801).
- Cross-platform UI: DatePicker widget (#4772), drag & drop across all platforms (#4773), WinUI 3 backend scaffold +
--target windows-winui(#4680). - Fully-static musl Linux target (
--libc musl/[linux] libc) (#4834).
Features
- feat(linux): fully-static musl target —
--libc musl/[linux] libc(#4834) - feat(runtime): explicit-resource-management — using / await using / Symbol.dispose (#4795, #4812)
- feat(runtime): SharedArrayBuffer + non-agent Atomics spec parity (#4794, #4803)
- feat(annexb): String HTML methods, Object accessor methods, RegExp.compile, escape/unescape ToString (#4796, #4813)
- feat(runtime): async-from-sync iterator adapter (#4590)
- feat(ui): cross-platform DatePicker widget (#4772, #4790)
- feat(ui): drag & drop across all platforms (#4773, #4791)
- feat(ui-windows): WinUI 3 backend scaffold + --target windows-winui (#4680, #4780)
- feat(codegen): default Windows output extension by type (#4771, #4782)
- feat(publish): [android] version_code override (#4814)
Fixes — spec parity (test262)
- fix(runtime): Temporal Duration + Instant parity 29.8%→88.5% (#4819)
- fix(runtime): Temporal.ZonedDateTime parity 34%→84% (#4820)
- fix(runtime): Temporal PlainDate/PlainDateTime parity + object-method arg-cap fix (#4821)
- fix(runtime): Temporal PlainTime/YearMonth/MonthDay/Now parity + shared infra (#4818)
- fix: standalone async-generator parity 57.7%→93.0% (#4777)
- fix(runtime): built-ins/RegExp (non-lookbehind) parity (#4809)
- fix: eval-code / function-code / arguments-object parity (#4808)
- fix(runtime): Date/Number/JSON/Math/NativeErrors test262 tails (#4807)
- fix(runtime): typed-array & exotic-descriptor crashes in built-ins tails (#4817)
- fix(hir): expression-semantics parity (new/delete/call/spread/compound-assign) (#4802)
- fix(hir): statement-semantics parity (for-of iterator protocol, with, eval completion-values) (#4786)
- fix(runtime): built-ins/Object parity v2 (#4784)
- fix(runtime): built-ins/Array parity v2 (#4778)
- fix(runtime): built-ins/String boxed-receiver methods + arg coercion (#4754, #4755)
- fix(runtime): built-ins/Function parity — instanceof Function, fn.constructor, prototype length/name (#4752, #4758, #4761)
- fix(runtime): built-ins/Proxy parity (#4748)
- fix(hir): class field/element initializer parity v2 (#4779)
- fix: class accessor-name / super / subclass / method parity (#4770)
- fix: class async / async-generator method parity (#4768)
- fix(class): static & computed accessors on class expressions (#4747)
- fix(class): method-as-value identity + injective private-symbol mangling (#4764)
- fix(hir): class destructuring + default-parameter parity (#4766)
- fix(hir): object-literal semantics parity (#4751)
- fix(hir): iteration-statement protocol parity (#4750)
- fix(operators): abstract relational comparison + logical-assignment NamedEvaluation (#4753)
- fix(transform,runtime): yield* delegation next-capture + object-literal thenable await (#4783)
- fix(runtime): TypedArray @@species (SpeciesCreate) for slice/subarray/map/filter (#4762)
- fix(runtime): TypedArray dynamic buffer-view construction + from/of/new validation (#4763)
- fix(runtime): TypedArray.prototype.set offset validation + array-like coercion (#4757)
- fix(runtime): TypedArray element-store coercion (ToUint32 modular) + f16 rounding (#4746)
- fix(runtime): Promise resolving-functions guard + combinator semantics (#4745)
- fix(runtime): Promise static methods preserve receiver brand checks when borrowed (#4603)
- fix(runtime): generic Array.prototype.reverse/fill over array-like receivers (#4620, #4640)
Fixes — runtime / codegen / crashes
- fix(runtime): adopt returned promise state on async tail-return (#4832)
- fix(runtime): honor dangerouslySetInnerHTML in hono/jsx rendering (#4827, #4830)
- fix(runtime): nested-Proxy Object.getPrototypeOf no longer segfaults on Linux (#4824)
- fix(runtime): round-trip lone surrogates via WTF-8 (#4793, #4806)
- fix(runtime): wire fancy-regex fallback through every RegExp operation (#4797, #4801)
- fix(hir): obj?.method(args) on builtins no longer short-circuits to undefined (#4816)
- fix(runtime): for-of/spread over a Headers handle no longer segfaults (#4800)
- fix(runtime): bind this=iterable when calling Symbol.iterator (#4788)
- fix(runtime): function-object descriptors + proxy SetIntegrityLevel parity (#4789)
- fix(runtime): frozen-array pop/shift/push/unshift throw TypeError (#4781)
- fix(codegen): destructured-value copies no longer truncate to i32 (#4785)
- fix(runtime): symbol-keyed property write on a native handle no longer throws (#4749)
- fix(codegen):
new <imported-function>()runs the constructor body (#4769) - fix: zod v4 safeParse on invalid input — crash + readable error (#4699, #4774)
Fixes — platform / stdlib / build
- fix(macos): chdir to Contents/Resources on .app launch so assets resolve (#4833)
- fix(hir): resolve CJS worker path joins (#4815)
- fix(cjs): prune dead platform-guarded requires (#4822)
- fix(publish): anchor bare-name [publish].exclude entries to the project root (#4811)
- fix(android): make perry-ui-android resilient to a shadowed JNI_OnLoad (#4804)
- fix(watchos/visionos): find the entry object by symbol, not filename (#4799)
- fix(tvos): copy project resource dirs into the .app bundle (#4787)
- fix(ui-windows): Mica-by-default + WM_DPICHANGED relayout (#4681, #4776)
- fix(link): link libc++/libc++abi in cross-Apple branches (#4759)
- fix(runtime): @hono/node-server c.req.text()/.json()/.formData() on POST/PUT (#4765)
- fix(runtime): subclassing native Request/Response exposes working body methods (#4756)
- fix(stream): honor emitClose/autoDestroy close-lifecycle options (#4386)
- fix(net): native-handle instanceof net.Socket + explicit Tokio runtimes (#4525)
- fix(http): Agent drops the bogus close method to match Node (#4628)
- fix(zlib): expose external Transform stream handles + validate async one-shot callback (#4506, #4514)
- fix(webcrypto): algorithm.length for KMAC128/256 (#4515)
- fix(globals): spec .length for legacy/global function values (#4545)
See CHANGELOG.md for full detail.
v0.5.1129
Highlights
- Native TC39 Temporal API via
temporal_rs— 8 Temporal types plusTemporal.Now, and the full options-/fields-object method surface (round/total,with*, conversions) (#4716, #4727). - Major test262 parity gains across built-ins: String 60%→79%, Number 86%→97%, plus broad Array/Promise/Object/BigInt/TypedArray spec-compliance work.
- New compile target: aarch64-linux (linux-arm64) (#4737).
Features
- feat(compile): aarch64-linux target (#4737)
- feat(class): static accessors, JS-canonical numeric keys, default-aware method
.length(#4736) - feat(class): public class-element semantics — accessor keys, prototype-ref setters, static-method descriptors, grammar early errors (#4730)
- feat(temporal): native TC39 Temporal API — 8 types +
Temporal.Now(#4716) - feat(temporal): options-/fields-object methods — round/total, with*, conversions (#4727)
- feat(compile): embed comctl32 v6 manifest so Windows UI apps get themed controls (#4683)
Fixes
- fix(class): computed-key evaluation order + ToPropertyKey TypeError on null-proto key (#4744)
- fix(class): computed-key accessor setter + empty-string static accessor (#4738)
- fix(class): hide private members from reflection + exotic-private-name symbol collision (#4719)
- fix(runtime): built-ins/Object ToPropertyDescriptor field presence is HasProperty (#4743)
- fix(runtime): built-ins/Array generic array-like + stored-method semantics (#4742)
- fix(runtime): stop dereferencing Web-Fetch/native handles as heap objects — Hono response SIGSEGV (#4739)
- fix(object): ValidateAndApplyPropertyDescriptor for non-configurable redefines (#4722)
- fix(object): retain existing-property attributes in Object.defineProperty (#4697)
- fix(runtime): dispatch Reflect proxy descriptors (#4621)
- fix(string): generic-
thisfor all String.prototype methods + slice/substring index coercion — 60%→79% (#4720, #4713) - fix(number): boxed-method identity, toExponential rounding/Infinity, parseInt identity — 86%→97% (#4712)
- fix(bigint): brand check + radix coercion on toString, mixed BigInt/Number compare, ++/-- (#4714)
- fix(array): callback thisArg, array-like ToLength, op-order + 0-arg validation (#4721)
- fix(array): exotic length [[DefineOwnProperty]] (ArraySetLength) + OOB prototype reads (#4709)
- fix(array): spec-complete Array.of (#4708), Array.from (#4700), Array.isArray Proxy unwrap (#4707)
- fix(promise): spec-compliant all/allSettled/race/any combinators (#4521, #4701)
- fix(promise): thread
thisthrough Promise.{resolve,reject}.call + var-redeclare codegen (#4706) - fix(promise): assimilate object-literal thenables via own
thendata property (#4705) - fix(typedarray): brand-check %TypedArray%.prototype iterators + array-like/iterable constructor (#4702)
- fix(map): instance prototype-member reflection, live forEach, symbol-key delete (#4710)
- fix(json): JSON.stringify substantially closer to ECMA-262 (#4718)
- fix(async-generator): await .return() value, brand-check prototype this, wrap function-expression async generators (#4723)
- fix(codegen): zero-fill inline-allocated object field slots (#4717, #4726)
- fix(http): park async request handlers instead of synthesizing a premature empty response (#4728)
- fix(init): default tsconfig targets ES2023 for non-mutating array methods (#4731)
- fix(windows):
perry updateextracts the .zip artifact (#4715) - fix: eliminate test262 segfaults in Proxy / String / Object.create / Array (#4724)
Infrastructure
- test(runtime): regression unit test for is_closure_ptr small-handle floor (#4740)
- ci(test262): parallel --jobs, --shard i/N, and full failure reporting (#4711)
- fix(publish): never exit 0 without a build result when the hub WS drops (#4732)
- fix(link): make tier-3 (tvOS/watchOS) std-dedup actually work (#4725)