Releases: PerryTS/perry
v0.5.1116
Highlights
42 commits since v0.5.1112 — a broad Node.js + TypeScript parity push: language-correctness fixes (assignment evaluation order, arrow binding, default-param TDZ, new.target), more Node built-in surface (Atomics, Intl, X509, child_process options, web stream adapters), and runtime prototype/reflection fixes.
Features
- Atomics: basic operations + bitwise operations (#4247, #4253)
- Expose core
Intlconstructors (#4254) X509Certificate:publicKey, name checks, and extension metadata (#4249, #4252, #4241)- node stream → web stream adapters (#4237)
- Complete
Array.fromAsyncmapFn semantics (#4238)
Fixes — runtime & Node compat
node:eventsmodule-level static helpers (once/on/listenerCount/…) now dispatch (#850)- Dispatch uncurried
hasOwnPropertydirectly (#4279) Uint8Array.of/frombuild the buffer-backed representationisPrototypeOf+Reflect.set/getPrototypeOf/deletePropertythrow on non-object (#4265)- Install
DataView.prototypeaccessors + get/set methods (#4256) - Convert asymmetric
KeyObjects toCryptoKey(#4245) - Expose HTTP request abort signals (#4248)
- Invoke registered loader hooks for dynamic imports (#4225)
String.matchAlliterator semantics (#4223)- Preserve CommonJS
requirefunction name (#4220) - Materialize array-like receivers for
Array.prototype.*.call(#4231) child_process: honor async buffered limits,argv0, andstdio: inherit(#4250, #4246, #4240)- Honor closure accessor properties (#4243)
- Respect symbol enumerability in
Object.assign(#4239) - Skip sparse array holes in iteration methods (#4236)
Fixes — codegen & language parity
- Restore scalar method inlining for PutValueSet constructors (#945)
- Cap pointer local type growth in codegen (#4235)
- Cache tagged-template objects per call site (#4234)
- Prototype & super assignment parity (#4233)
- Assignment evaluation order (#4229)
- Arrow special binding semantics (#4228)
- Preserve
withreferences fordelete(#4227) - Default-parameter TDZ for later bindings (#4226)
- Preserve lexical
new.targetfor arrows (#4224) - Use generator closure prototypes for instances (#4222)
- Avoid recursive constructor inlining (#4221)
- Preserve CommonJS require name / honor well-known archives in no-auto links (#4242)
- Native instance walk for fluent chains (#4219)
Infrastructure / tests
v0.5.1112
First tagged distribution release since v0.5.1028 — folds in 1198 commits (852 fixes, 42 features, plus tests/docs/refactors). This tag is a clean version-bump checkpoint over a fully CI-green main.
Highlights
- Broad Node.js builtin parity push:
crypto/webcrypto,http/http2/Agent socket pooling,zlib(sync + streaming + Brotli),child_process(streaming spawn, fork + V8-IPC,promisify),util,process,punycode,url,worker_threads,stream(web codec constructors, iterator helpers),dgram,cluster,path,vm. - Reflective builtin-prototype brand checks (#3662 family):
Function.prototype.apply/call/bind/toString, primitive prototypes (Number/Boolean/Symbol/BigInt), collection prototype methods, namespace member reflection. - Typed-array prototype + constructor coverage (join/slice/reverse/fill/subarray,
RangeErrorvalidation, proto accessors). - Generational-GC evacuation + async-resume fixes.
Features (selected)
compile: module-graph tree-shaking / DCE forcompilePackages.- Self-hosted build-time
precompile()— Perry runs its own codegen with no node/V8. node:zlibcomplete sync codec parity + Transform-stream objects + Brotli.node:child_processasync spawn reactor, fork + IPC, exec error/encoding parity.node:httpAgent socket pooling +createConnection/createSocketon the request path.- Generator function expressions,
yield*operand iteration, class[Symbol.iterator]/[Symbol.asyncIterator]via member access. perry/ui: continuous pointer/key events,onFrame/cancelFramedisplay-link callbacks;perry/audiocross-platform sound; GTK4 live CameraView.Object.getOwnPropertyDescriptors, dynamic-import directory-glob template specifiers.
Fixes
- 852 fixes across codegen, HIR lowering, runtime, and stdlib — Node export hygiene, dispatch correctness, stream construction paths, handle-deref segfaults, and large swaths of the TypeScript/Node compatibility roadmap (#793).
See CHANGELOG.md for the full per-version detail.
v0.5.1028
First tag in the v0.5.1025 → HEAD window — also implicitly ships the v0.5.1026 and v0.5.1027 work that never got their own tags. See CHANGELOG.md for the full per-PR history.
Highlights (v0.5.1025 → v0.5.1028):
- node:timers epic (#1213, 6 PRs in v0.5.1026):
node:timers/promises, numeric-id clear*, namespace import, ref() typeof,Symbol.dispose, global setImmediate/clearImmediate - node:perf_hooks fan-out (10 PRs in v0.5.1026): typeof methods,
globalThis.performanceidentity,nodeTiming,toJSON,clearResourceTimings, structured-clone detail, observer-arg + buffered + throw cases - Windows fixes (v0.5.1027): #1542 black areas after
Appwindow resize; restored Windows source build (cp.rsset_path_timescfg-gating) - Compile / lockdown / dynamic-import (this batch):
--trace/--focusflags (#1738); lockdown #503 allowsns[dynamicKey].staticMember(#1741); literalnode:builtinimport()(#1742); Blob/URL globals trigger http-client (#1747); win32path.normalize/basename/toNamespacedPathedges (#1749) - Major parallel streams: v0.5.1026 closes #1424 (lazy-tape reviver SIGSEGV); #1429 GC unsafe-zone guards for fastify/hyper; v0.5.1027 + this batch include lockdown #503 polish; #1718-era HTTP trailers + WebSocket upgrades + Buffer encodings (#1709); native .js/.cjs +
require()compile (#1711); URLSearchParams iteration (#1668); Web Streams inline property reads (#1670); fetch Request.text()/.json()/.arrayBuffer() (#1688);--debug-symbolsretention (#1663); GC barrier on Promise pointer stores (#1715); regex dynamic dispatch (#1731); …
test_async_local_storage_context (#1423) remains skip-listed (.enterWith/.exit pending, sibling slice of #788/#789).
v0.5.1025
Hotfix on top of v0.5.1024, unblocking the gate failures from that release.
simctl iOS: find_geisterhand_lib no longer falls back to host target/release/<lib>.a when a cross-compile target is set — that fallback was producing macOS .a archives in iOS-simulator link commands AND masking the geisterhand auto-build trigger so the cross-target libs never got built.
Parity gate (2 new failures triaged):
- #1423
test_async_local_storage_context—AsyncLocalStorage.enterWith/.exitaren't implemented end-to-end (sibling slice of #788 #789). Skip-listed. - #1424
test_json_lazy_reviver—JSON.parse(blob, reviver)on a lazy-tape top-level array exits before any output. Skip-listed.
compile-smoke memory ceiling restore — PR #1422 (dec43e27) put the 290/315 MB test_memory_json_churn ceiling back after #1324 reverted it.
Also folds in the post-v0.5.1024 work that landed on main: #1365 crypto.generateKeyPairSync (RSA + EC) (#1418).
See CHANGELOG.md.
v0.5.1024
Release sweep — 26 PRs rolled up post-v0.5.1023.
Highlights:
- node:crypto gap-fixes —
randomInt,timingSafeEqual,getHashes/getCiphers,sha224/sha384, base64 digest, Buffer hash input, no-argdigest()typed as Buffer,pbkdf2Syncdigest argument,scryptSync(PRs #1386 #1393 #1394 #1402 #1405) - node:perf_hooks native impl —
performance+ User Timing +PerformanceObserver+ granular node-suite (#1321 #1328 #1342) - #1090 GC checkpoint runtime work (#1324)
- #1311 geisterhand on iOS —
--target iosbuilds + links inspector; SecureField registered; perry-stdlib auto-included (#1316 #1383 #1384 #1385) - #1323 wasm timer dispatch through mem_call bridge (#1329)
- #1317 node:timers/promises segfault on global
setTimeoutshadow (#1326) - #1322 exact-head GC evidence packet diagnostics
- #1330 node:process suite (#1331)
- #1292 bcrypt.hash() returns real String (#1307)
- #1293 fastify
.json()/.bodyexternal-handle dispatch (#1308) - #1296 app-pattern performance gaps
- #1297 diagnostics_channel parity
- #1301 iOS App Groups capability (#1313)
- #1318 #1325
os/methods/modern-methodsstatic dispatch - #1315 expanded Node parity test coverage
- #1382 ui-ios stdlib pump drain for async
fetch - #1392 ui-wasm reactive state +
setTexton web/wasm target (#1404) - #1319 runtime thread-safety hardening for cross-thread statics
- #1312
process.env.X(unset) is nullish (#1314)
See CHANGELOG.md for the full per-PR rollup.
v0.5.1022
Sequel to v0.5.1021 + binary-size baseline refresh.
- #1246 follow-up: perry-ui-gtk4
image.rsnow reachesresolve_asset_pathat its new homecrate::ffi::layout::resolve_asset_path(left private when #1246 split the file). Surfaced on the v0.5.1020 release-packageslinux-aarch64-gnubuild witherror[E0425]: cannot find functionresolve_asset_pathin the crate root— that failure fail-fast-cancelled four other matrix builds and skipped every publish job (winget / homebrew / npm / apt / apt-repo). - binary-size baseline refresh: 566 patches of intentional product delta since the v0.5.455 (
7fd1c8b3) baseline pushed perry +22.6% / libperry_runtime +34.0% / libperry_stdlib +6.5%. Same shape as the v0.5.455 refresh — the 15% per-release threshold is for incremental drift, not multi-release catch-up. New baseline captured fromf7aaed1aRegression Check macos-14 run. Production binaries are stripped by the linker; the .a / .bin sizes the job measures are unstripped release-build artefacts used as a regression-trend signal, not a deployment-size measurement.
Closes the v0.5.1020 release-packages regression. See CHANGELOG.md.
v0.5.1021
Hotfix on top of v0.5.1020: restore perry-ui-gtk4 image.rs resolve_asset_path access after #1246's file-split refactor moved the function into ffi::layout and left it private. The v0.5.1020 release-packages run (#26249481496) failed on linux-aarch64-gnu with E0425 and fail-fast cancelled the publish pipeline.
Two-line fix in #1298. Local cargo check + PR CI green. See CHANGELOG.md.
v0.5.1020
Pre-release tag of current main. Closes the 5 parity failures + memory-ceiling regression from v0.5.1019:
- #1273 Buffer.from(str, encodingVar) HIR routing (#1282)
- #1274 EventEmitter numeric/object payload args returned
NaN— perry-ext-events still had the legacy(arg: f64)ABI from before PR #1186'sNA_VARARGSswitch (#1289) - #1275 TextEncoder mojibake (#1282)
- #1276 console.table spurious
Valuescolumn on array-of-arrays (#1282) - #1277 Closed as misdiagnosis (Perry's
Instant::now()is correct; the apparent timer divergence is AOT-vs-interpreted speedup on a DCE-able loop) - #1278 console.trace stack-format kept as tracked categorical, skip-listed
- memory
test_memory_json_churnUbuntu RSS budget widened to 290/315 MB to cover #1090 GC rework grace (#1286)
Plus #1088 host-embed staticlib linkdeps sidecar, #1122 iOS UIButton layer.backgroundColor, #1129/#1136 iOS heap-pointer guards, #1162 node:path.win32, #1193 cheerio chains, #1205/#1206/#1210/#1211 node:buffer parity, #1225 Buffer.from shared identity, #1280 App windowState, #1288 jsonwebtoken rust_crypto for ios setup, #1291 android setup keystore validation, plus granular tty + events parity suites.
See CHANGELOG.md for the full rollup.
v0.5.1019
Pre-release tag of current main. Highlights since v0.5.1011: #1088 host-embed --output-type staticlib + Event Loop FFI, #1248/#1249 inspect.custom + nested multi-line break, #1236 aws-lc-sys 0.41 (Linux poly_Rq_mul fix), and the http options-object regression from #1123/#1124 should be addressed in this batch.