Skip to content

Releases: PerryTS/perry

v0.5.1182

18 Jun 07:05
2b30f9f

Choose a tag to compare

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-windows migrated to windows/windows-core 0.62 — the webview2-com 0.39 bump had skewed the WebView2 COM type versions, failing the Windows leg and causing every publish job to be skipped (#5382).
  • Native-require destructuring fixed. const { x } = require("<native-builtin>") no longer resolves the bound leaf to undefined — 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

18 Jun 05:38
cdbb488

Choose a tag to compare

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-windows migrated to windows/windows-core 0.62 (the webview2-com 0.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

  • perf(codegen): elide GC write barrier for non-pointer class-field stores (#5381)
  • perf(codegen): outline class-field-SET guard-miss arm to one call (#5351)
  • perf(codegen): fold nan-box bitcast round-trips at emit time (#5350)

v0.5.1180

17 Jun 20:04
4a82bd5

Choose a tag to compare

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 expandedgetCanonicalLocales, supportedValuesOf, formatToParts, plus ListFormat/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

14 Jun 11:10

Choose a tag to compare

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

14 Jun 09:04

Choose a tag to compare

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's matchKnownFields rules (set-cookie → array, cookie →
    "; ", others → ", ", single-value keeps first). (#5079 / #5102)
  • fix(runtime): over-large TypedArray/Buffer/Map/Set/array
    allocations now throw a catchable RangeError instead of aborting the
    process. (#5067 / #5103)
  • fix(reflect): Reflect.construct error-message wording matches Node.
    (#2768 / #5105)
  • fix(util): util.format %o/%O quote top-level strings, and
    util.inspect renders the [Object: null prototype] prefix. (#5106, #5107)
  • perf(compile): oversized modules compile at -O0 to fix the
    wide-object-literal codegen blowup (env override
    PERRY_LL_O0_THRESHOLD_BYTES). (#4880 / #5109)
  • fix(url): String(), template interpolation, and +-concat of URL /
    URLSearchParams yield href / 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

11 Jun 10:23
0334a93

Choose a tag to compare

Security release

Fixes a path traversal / arbitrary file write in perry publishGHSA-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_name to a bare, traversal-free filename and gate the download_path local-copy shortcut to loopback hubs (#4989)

Reported by @wsparks-vc.

v0.5.1158

11 Jun 10:00
eabf8e7

Choose a tag to compare

Highlights

  • Stub-elimination epic (#4919) substantially landed. The manifest stub flag is now actually populated, stubbed APIs warn on first call, and PERRY_STRICT_STUBS=1 turns any stub hit into a hard error (#4929). On top of that floor, formerly-fake APIs became real: node:dns/node:dgram do real network I/O (#4911), child_process.exec/execFile are truly async with real ChildProcess handle semantics (#4912, #2130/#1934), Atomics.wait/notify/waitAsync block and wake for real across perry/thread agents over a shared SharedArrayBuffer (#4913), streams gained BYOB readers + real ByteLengthQueuingStrategy accounting (#4915), and v8.writeHeapSnapshot emits a real snapshot from a GC heap walk (#4916).
  • Real AsyncLocalStorage + async_hooks context propagation (#788/#789) — context tracked across await, microtasks, timers, and process.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 class bodies lower correctly (#4976) and synthesized capture ctors on derived classes call super() (#4972).
  • node:http/https parity batch (#4903#4910) — deferred 'listening' emit, constructable Agent/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.connect Node overloads.
  • cluster workers 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 d flag/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, or new Headers no 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 class bodies — 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 d flag (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

09 Jun 22:24
933da45

Choose a tag to compare

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-android drag & drop broke both aarch64- and x86_64-linux-android jobs.
  • Windows builds fixedwindows-core direct 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 nowcompare.sh --json-out resolved relative to the wrong directory, so the comparison had silently crashed (and | tee swallowed the exit) on every run since at least v0.5.1122; release-mode "hard-fail" gates were comparing nothing. Fixed, plus pipefail, 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 extend through 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_only fails when run in a non-UTC local timezone (CI is UTC): local-time revive of an invalid Date via setFullYear returns NaN.

v0.5.1150

09 Jun 10:36

Choose a tag to compare

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 Managementusing / 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

07 Jun 06:01
25ccfbb

Choose a tag to compare

Highlights

  • Native TC39 Temporal API via temporal_rs — 8 Temporal types plus Temporal.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-this for 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 this through Promise.{resolve,reject}.call + var-redeclare codegen (#4706)
  • fix(promise): assimilate object-literal thenables via own then data 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 update extracts 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)