Skip to content

perry

v0.5.293 Breaking

This release includes breaking changes for platform teams planning a safe upgrade.

Published 1mo Build & Package
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

android compile harmonyos ios llvm macos
+5 more
native smc typescript watchos windows

Summary

AI summary

Broad release touches Runtime / Codegen Fixes, Highlights, Documentation & Benchmarks, and Escape Hatches.

Full changelog

First tagged release since v0.5.178 — 115 commits of accumulated work. Headline changes: generational mark-sweep GC and SSO are now default ON, JSON parsing went tape-based + lazy by default, Windows toolchain dropped its Visual Studio dependency, and Native UI grew end-to-end notification support on iOS + Android.

Highlights

  • Generational mark-sweep GC default ON — Phases A-D land the shadow stack, write barriers, nursery/old-gen split, non-moving tenuring, copying evacuation pass, and per-cycle idle-block return-to-OS. PERRY_GEN_GC=0 reverts (bisection only). (v0.5.217 → v0.5.239)
  • SSO (Small String Optimization) default ON — runtime infrastructure + codegen three-way PropertyGet branch + consumer arms behind PERRY_SSO_FORCE while baking, then default-flipped at v0.5.216. (v0.5.213 → v0.5.216)
  • JSON parsing rebuilt — schema-directed JSON.parse<T>(blob), tape-based parse foundation, lazy parse + lazy stringify (default ON), per-element sparse materialization, walk-cursor + adaptive materialize threshold. (v0.5.200 → v0.5.210)
  • Windows lightweight toolchain — winget LLVM + xwin, no Visual Studio needed (#176, v0.5.199); plus actionable clang-missing / link.exe error messages and perry doctor LLVM checks.
  • visionOS simulator support--target visionos-simulator (v0.5.185).

Performance

  • JSON: lazy parse default ON (v0.5.210), per-element sparse materialization (v0.5.208), NEON/SSE2 string scanner (v0.5.197).
  • GC: arena block size 8 MB → 1 MB (v0.5.196), trigger threshold 128 MB → 64 MB (v0.5.198), idle nursery blocks returned to OS (v0.5.235).
  • Buffer.alloc fast-path via per-thread bump slab (#92, v0.5.190); BigInt arena alloc + BigInt(str) === fix (#92, v0.5.187); parseFloat zero-alloc + Infinity fix (#92).

Runtime / Codegen Fixes

  • JSON: JSON.stringify of plain f64 segfaulted (v0.5.286); restore #[no_mangle] on js_json_stringify (v0.5.211).
  • NaN: NaN==NaN + ECMAScript number formatting (v0.5.281); NaN/Infinity ToInt32 in (x) | 0 (v0.5.280); SSO + property-read NaN bug (v0.5.279).
  • Promises: microtask FIFO + thrown-handler propagation (v0.5.284); Promise.all/race/any non-promise discrimination (v0.5.263); Promise.allSettled non-Promise values; queueMicrotask never running + performance.now() always 0 (#156, v0.5.180).
  • Codegen: cross-module class getters/setters returned undefined (twice — c4739341, 2a088551); inline pass remaps closure captures (v0.5.273); don't inline functions with rest params (v0.5.278); i32 loop counter for number-typed bounds (#168, v0.5.188); js_try_end on return inside try body; FFI manifest consumption for native-library ABI; for-loop continue skipping update on --target web (#137).
  • fs.readFileSync(path) returns Buffer when no encoding (v0.5.277); BigInt fromTwos/toTwos two's complement (v0.5.255); console.time resolution (#155, v0.5.181); Int32Array length=0 + Uint8ClampedArray no-clamp + negative NaN (#157, v0.5.184); isWellFormed/toWellFormed lone-surrogate detection (#29).
  • WASM: drop excess args at WASM call sites (#183, v0.5.205).
  • Type predicates + lazy audit (v0.5.212); HIR silent fall-throughs in lowerer + monomorph (v0.5.249).

Stdlib & Node Compat (#187 follow-ups)

  • Redis (ioredis) end-to-end + dispatch-table-symbol-mismatch fix (v0.5.270); pg + mongo async-factory pattern (v0.5.275); AsyncLocalStorage end-to-end (v0.5.261); decimal.js (v0.5.259); commander runtime + codegen .action() invocation (v0.5.250); new T() bug on EE/LRU/WSS (v0.5.252); Buffer numeric reads intrinsified (#92, v0.5.183).
  • Fastify end-to-end integration test + two dispatch fixes (#174, v0.5.189); mysql2 + pg connection.execute() param binding (#143, v0.5.182).

Native UI

  • Apple (iOS / macOS): notificationSend (#94, ui-ios v0.5.193), client-side remote-push token + receive (#95, v0.5.243), scheduled + cancellable local notifications (#96, v0.5.244), notification tap callback (#97, v0.5.254).
  • Android: notificationSend (#94, v0.5.256), schedule + cancel notifications (#96, v0.5.260), notification tap callback (#97, v0.5.258), FCM register + receive (#95, v0.5.262).

Platform / Toolchain

  • Windows: lightweight toolchain (#176, v0.5.199); find_lld_link/find_perry_windows_sdk cfg gate hotfix (v0.5.201); /SUBSYSTEM:CONSOLE for non-UI PE builds (#120, v0.5.179); actionable clang/link.exe error messages (#176 follow-ups, v0.5.191/.192).
  • npm: libc:glibc field on linux-x64 and linux-arm64 packages (#116/#161).

Documentation & Benchmarks

  • Polyglot benchmark suite expansions: Kotlin + JSON polyglot (v0.5.241/.242), simdjson + AssemblyScript+json-as peers (v0.5.274), loop_data_dependent + bench_field_access landed (v0.5.272).
  • Methodology hardening: RUNS=11 median + p95 + σ + macOS pinning (v0.5.248); 04_array_read 211 MB peak RSS explained (v0.5.276); FP-contract caveat (FMA-contract vs no-contract clustering) on bench_loop_data_dependent (v0.5.293).
  • Node TS-strip leveling: json_polyglot/run.sh precompiles Node TS to .mjs as untimed setup so Node isn't charged for --experimental-strip-types runtime parse (v0.5.293).
  • GC academic + industry lineage appendix; Phase D roadmap closeout (v0.5.239/.240).
  • CLAUDE.md condense — 124 verbose Recent Changes entries (~242 KB) migrated to CHANGELOG.md, file went 254 KB → 12 KB (v0.5.292).

Repo & CI Hygiene

  • chore(repo) v0.5.293: untrack 465 Android Gradle cache files, gitignore android-build/.gradle//build//app/build/, docs/examples/_reports/, external demo assets/, and stray repro binaries.
  • CI macos-14 jobs no longer OOM on disk space (v0.5.289-.291).
  • Memory stability suite for RSS-leak + GC-aggression regressions (v0.5.233).
  • Stub-audit cleanups: test_json, test_gap_console_methods, test_gap_class_advanced removed from known_failures.json.

Escape Hatches

  • PERRY_GEN_GC=0 — revert generational GC to full mark-sweep.
  • PERRY_SHADOW_STACK=0 — disable shadow-stack precise roots.
  • PERRY_GEN_GC_EVACUATE=1 — opt into copying evacuation (default OFF, work-saving on workloads where nothing tenures).
  • PERRY_WRITE_BARRIERS=1 — opt into codegen-emitted write barriers (runtime barrier always exists).
  • PERRY_GC_DIAG=1 — per-cycle GC diagnostics.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track perry

Get notified when new releases ship.

Sign up free

About perry

A native TypeScript compiler written in Rust. Compiles TypeScript directly to executables using SWC and LLVM.

All releases →

Beta — feedback welcome: [email protected]