Skip to content

Releases: PerryTS/perry

v0.5.1220

Choose a tag to compare

@proggeramlug proggeramlug released this 04 Jul 01:31

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:

  • fix(link): dedup wrapper-bundled perry-runtime in wrappers-first links (#5920, #5921)
  • fix(transform): keep comma-sequence operands ahead of hoisted awaits (#5925, #5926)
  • ci: auto-opt archive cache eviction in the test gate (#5892) and release-packages workflow_dispatch tag-fallback repo pinning

v0.5.1219

Choose a tag to compare

@proggeramlug proggeramlug released this 03 Jul 23:29

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_threads Workers from inline source (#5799)
  • Promise spec-compliance batch — then/finally SpeciesConstructor + error propagation (#5767), user-defined own then honored (#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.stdin as a functional raw-mode Readable (#5733); gc() exposed on globalThis (#5712); old-gen arena included in process.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:vm runInContext 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)
  • switch inside async/generator state machines no longer miscompiles (#5885)
  • Intl additions: Intl.DisplayNames (#5512), Intl.DurationFormat (#5405), NumberFormat.formatRange (#5771), Locale info methods (#5602), BigInt toLocaleString (#5879)
  • WeakMap/WeakSet are now actually weak (#5468); Symbol.hasInstance honored in instanceof (#5667); new.target in 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_64 target triple (#5743)
  • BloomView embedding with live-render plumbing on every backend (#5518, #5538); perry/ads end-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-3 feature 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.setPrototypeOf cycle-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-undefined tag preservation (#5648)

v0.5.1182

Choose a tag to compare

@proggeramlug proggeramlug released this 18 Jun 07:05
2b30f9f

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

Choose a tag to compare

@proggeramlug proggeramlug released this 18 Jun 05:38
cdbb488

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

Choose a tag to compare

@proggeramlug proggeramlug released this 17 Jun 20:04
4a82bd5

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

Choose a tag to compare

@proggeramlug proggeramlug released this 14 Jun 11:10

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

Choose a tag to compare

@proggeramlug proggeramlug released this 14 Jun 09:04

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

Choose a tag to compare

@proggeramlug proggeramlug released this 11 Jun 10:23
0334a93

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

Choose a tag to compare

@proggeramlug proggeramlug released this 11 Jun 10:00
eabf8e7

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

Choose a tag to compare

@proggeramlug proggeramlug released this 09 Jun 22:24
933da45

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.