Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## v0.5.1236 — P0: compiled programs never GC'd on nursery pressure; copied-minor weak-slot semantics

**P0.** Since the budgeted-GC slicing (897f50c8b, 2026-05-30), `gc_check_trigger` routed ArenaBytes/MallocCount pressure exclusively through the budgeted mutator-assist stepper — which `registered_root_scanners_block_budgeted_gc` permanently blocks in every compiled program (codegen registers synchronous-only root scanners at startup). The stepper never started, the assist step no-op'd, and allocation pressure accumulated forever: a 4M-small-allocation probe ran ZERO collection cycles and grew to 1.93 GB RSS. #5476 had patched the identical hole for the OldReclaim trigger only. Fix mirrors that arm: when a nursery-churn trigger is due and the budgeted machinery is structurally unavailable, run the direct synchronous minor under `force_full_scan` (conservative retention at the allocation point; copied-minor ineligible for that cycle, so the non-moving minor runs). After: 14 cycles, 539 MB RSS. New compiled-binary e2e (`gc_nursery_trigger_compiled`) pins the contract.

**Copied-minor weak slots.** The scan evacuated THROUGH weak target slots (WeakRef referent / WeakMap-WeakSet entry key / FinalizationRegistry record target) — strengthening the weak edge — and the fast path bypasses the WeakProcessing subphase, so nothing ever tombstoned. The scan now records weak slots without evacuating, repairs forwarded targets after the final drain, and runs `process_weak_targets_after_mark` before the from-space flip, gated on a weak-holder latch so weak-free programs skip the arena walk. Three unit tests with a negative control.

## v0.5.1235 — renamed colliding classes: static calls + static field get/set resolve `class_renames`

Follow-up to v0.5.1230's capture-snapshot work, fixing its own acceptance test (`same_class_name_across_factories_keeps_snapshots_separate`, red on main — invisible to PR CI per the #5960 blind spot): a body-local `class X` colliding with an outer/prior `class X` registers under a scope-local rename, and bare-ident references + `new X()` already resolve it — but the static-method-call arm (Ident + #private) and the static-field get/set arms looked up the raw name, binding the FIRST same-named registrant. Factory B's `e.who()` dispatched to factory A's static and read A's snapshot. All four arms now resolve the rename before the class lookups; imports keep the raw name. Adds `renamed_class_statics_dispatch_to_renamed_registrant` (statics + construction across two factories); full class/static/capture/5437/w6 e2e sweep green.
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co

Perry is a native TypeScript compiler written in Rust that compiles TypeScript source code directly to native executables. It uses SWC for TypeScript parsing and LLVM for code generation.

**Current Version:** 0.5.1235
**Current Version:** 0.5.1236


## TypeScript Parity Status
Expand Down
Loading
Loading