Skip to content

Merge train: #9918, #9950, #9957, #9958, #9976, #9977 - #9981

Merged
proggeramlug merged 27 commits into
mainfrom
train144
Sep 7, 2026
Merged

Merge train: #9918, #9950, #9957, #9958, #9976, #9977#9981
proggeramlug merged 27 commits into
mainfrom
train144

Conversation

@proggeramlug

Copy link
Copy Markdown
Contributor

Merge train: #9918, #9950, #9957, #9958, #9976, #9977 — the two stacks (#9918#9958#9977 regex, #9950#9957#9976 GC), kept out of #9978 so a failure in ~8k lines of GC and regex work stayed attributable.

The conflict worth recording

In copying.rs, #9976's side of a hunk was empty, which reads as "theirs has nothing to add" and is wrong: it meant #9976 deleted that region, having relocated finalize_dead_copied_minor_from_space_side_allocations into copying_phase.rs with a new return type. Keeping ours produced a duplicate definition and a type error. The correct resolution splits the hunk — keep #9861's LAST_COHORT_SPLIT test helpers, which #9976's base predates, and drop the relocated function. An empty side is a deletion, not an abstention.

The [gc-copy-minor] diagnostic line conflicted twice, because #9861 (landed in #9978) added cohort-split fields while #9976 added pause_us/scan_us and then phases:. Merged to carry all of them; placeholder and argument counts verified equal (22/22) rather than assumed.

Gate fixes

  • copying.rs hit 2066 lines. The remembered-set scan and pinned-young preflight move to copying/remembered_scan.rs. Note pub(super) means gc in the parent and copying in the child, so a straight move silently narrows reach and the glob re-export then has nothing public enough — both are widened to pub(in crate::gc).
  • family_push_back became dead in a product build. Before gating it I checked that perf(gc): prune the per-object layout tables from a young-entry log (replay of #9895) + a residue histogram — 4 ms per steady minor on cc #9976 dropping its production rekey caller was deliberate: it is, and the replacement comment explains that re-entering the writer funnel mid-walk would enqueue the same family twice. shapes_test_support is now its only consumer, so #[cfg(test)] matches.
  • regex_census.rs's rows is extended only under regex-engine: unused-mut without the feature, required with it. The allow is scoped to the feature-off build rather than dropping mut, which breaks the other configuration.
  • Five new holders classified. BOX_YOUNG_ROOTS is covered_elsewhere — every address in that minor remembered set is also in the box registry scan_box_roots_mut walks, so the log is an accelerator, not an independent holder. The four test seams and the histogram counter are not_a_gc_pointer.
  • PASS1_MARKED re-audited. gc/mod.rs gains two module declarations and one reg_scanner! registration; a scanner registration adds a root SOURCE and runs nowhere between the census boundaries. gc/census.rs widens side_tables() and adds census rows plus a test — reporting that runs from the diagnostic dump, not inside a cycle. LAYOUT_DIAG's entry is deleted because the holder became covered, which the gate calls the receipt.

Validation

run_lint_gates: 3 of 80 FAILED, all accounted for: public-baseline is pre-existing on main (verified on a pristine worktree, red since 2026-07-29), and the two API docs gates are an artifact of this session's CARGO_TARGET_DIR override — regen_api_docs.sh hardcodes $ROOT/target/release/perry. With the binary placed where it expects, regeneration succeeds and the drift check is clean.

suite passed failed
perry-runtime 3310 0
perry-codegen 1947 0
perry-hir 630 0
perry-stdlib 132 0

Ralph Küpper and others added 27 commits September 8, 2026 00:07
Replace whole-map overflow clears with one-entry eviction, and keep
content-cache entries pinned while a recorded literal site refers to them.
Only dynamic or displaced-site entries can leave the bounded table.

Add a sabotage test that crosses both cache bounds, collects dead nursery
headers, and proves the recorded literal does not rebuild.

(cherry picked from commit ce9e128)
Use scoped handle access in the nursery relocation fixture, gate the Arc
import to the matcher feature, and document why matcher kinds are dead in
the feature-off layout-only build. Remove the unused test import and unsafe
block, and apply rustfmt's module ordering.

Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo
(cherry picked from commit dd1c524)
Cache and root one RegExp header for literal-only test call sites, while
validating the builtin method on every evaluation and preserving generic
fallback semantics for patched prototypes and changed factory callees.

Recognize exact zero-argument regex factories by their HIR body and pair
cross-function sites with the resolved native callee identity. Reset global
and sticky lastIndex before each cached test, expose decline diagnostics, and
register all regex cache tables with the GC census.

(cherry picked from commit 90e2131)
Document the implementation SHA, source map, validation status, expected
diagnostic movement, and the exact full-recompile measurement request.

(cherry picked from commit 47370d8)
Keep the merge-train's existing RegExp prototype holder verdicts instead of
registering the same three holders twice. Express the literal-site canonical
check and its post-call handle reload with the sanctioned across_mut form.

Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo
(cherry picked from commit 54c9373)
Append the 2026-09-07 CI-fix handoff with exact fixed code heads, per-item
static gate results, disk-skipped cargo gates, and both branch range-diffs.

Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo
(cherry picked from commit a93908a)
Add requested-only rows for the common regex-owned tables and reconcile
their de-duplicated byte estimates with the heap census side-table total.
Cover the emitted inventory and the no-construction-cost contract directly.

Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo
(cherry picked from commit 49f551f)
Measure the #9958 site-rooted headers and their gross pinned program lower
bound separately from de-duplicated side-table attribution. Include the
content and literal-key tables that provide the other owners.

Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo
(cherry picked from commit 5e80791)
Record the row accounting, reconciliation contract, sabotage coverage,
mainline cherry-pick proof, local gates, and RX2 perrymaster request.

Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo
(cherry picked from commit fe38040)
Keep minor remembered sets for boxed roots and the shape table's carrier
mutations. Compact both sets after each minor while retaining authoritative
full-table walks for major collection.

Report whole copied-minor pause time and its scanner share together.

(cherry picked from commit 64ef925)
Record the scanner map, sabotage-able test coverage, disk-gated validation,
predictions, and the exact perrymaster follow-up request.

(cherry picked from commit 194fcb6)
Account for the successful copying-minor path with diagnostic-only wall-time
buckets that partition the same interval as pause_us. Include per-table
from-space finalization and dead-owner prune detail so the remaining fixed
minor cost can be localized from one complete ran line.

(cherry picked from commit 0984678)
Make descriptor, closure metadata, template, array named-property, and
symbol side-table minor scans proportional to entries that can still move,
die, or expose a young strong edge. Keep full scans authoritative and use
test-only re-derivation sabotage checks to enforce every write funnel.

Narrow descriptor and closure owner retention to collectible metadata keys;
long-lived values remain logged only where their transitive edges require it.

(cherry picked from commit dae5192)
Record the phase instrument, young-log mappings and sabotage coverage,
shape residual analysis, validation results, performance predictions, and
the exact perrymaster relink and measurement request.

(cherry picked from commit de6bfd5)
Restore the dense full-table walkers for template roots and symbol side
tables after MP measurements showed that their keyed young paths cost more.
Remove the associated publication upkeep and rederivation tests while
leaving the three measured wins and descriptor narrowing intact.

Move the built-in closure young log onto hot TLS and update the thread-local
and rekey policy inventories for the callable-exports module split.

Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo
(cherry picked from commit 151680f)
…minor

A minor can only remove nursery owners, so walk the per-object layout
tables' young-entry log rather than every standing key. Full collections
retain the whole-table prune and rebuild the log from survivors.

Replay 19a6cd2 on the #9957 phase-instrument tree. Its runtime hunks are
unchanged; the young-log test file keeps both the newer fixed-cost scanner
tests and the replayed layout-prune tests.

Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo
(cherry picked from commit dd279a8)
Under PERRY_LAYOUT_DIAG, time each existing death-prune walk and emit
marginal histograms for surviving mask owners, slot counts, pointer share,
and heap space. Price the standing residue as per-key prune nanoseconds and
the maximum tag checks masks can save in one full trace.

Keep insert provenance in diagnostic-only counters so LayoutSlotMask and the
unarmed trace/store representation do not change. Cover kind/bucket routing
and prove the unarmed histogram loop stays dark with sabotage-capable tests.

Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo
(cherry picked from commit 97b5500)
Record the replay evidence, field derivations, sabotage-capable tests,
follow-up rule candidates, and exact Stage LP measurement request. Preserve
the binding disk-floor result for the release gates that could not start.

Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo
(cherry picked from commit 2278111)
Document the required target cleanup after the final Cargo gates were blocked
by the campaign's 12 GB free-space floor.

Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo
(cherry picked from commit a4a6978)
Distinguish the two replay tests covered by the focused layout filter from
the remaining named test whose full-suite gate was blocked by disk capacity.

Claude-Session: https://claude.ai/code/session_011dhBmdn4vGgNibjo3oZqTo
(cherry picked from commit 324166e)
- copying.rs reached 2066 lines. The remembered-set scan and pinned-young
  preflight move to copying/remembered_scan.rs. Their `pub(super)` meant
  `gc` in the parent and means `copying` in the child, so both are widened
  to `pub(in crate::gc)` to keep the original reach.

- regex_census.rs: `rows` is extended only under `regex-engine`, so the
  binding is unused-mut without that feature and REQUIRES mut with it.
  Scoped the allow to the feature-off build rather than dropping `mut`,
  which breaks the feature-on build. (My first attempt dropped it.)

- shapes.rs: #9976 deliberately removed `family_push_back`'s production
  rekey caller — the scanner-internal rekey note explains why re-entering
  the writer funnel mid-walk is wrong — leaving shapes_test_support as its
  only consumer. Gated `#[cfg(test)]` to match.

- Five new holders classified: BOX_YOUNG_ROOTS is covered_elsewhere, since
  every address in that minor remembered set is also in the box registry
  that scan_box_roots_mut walks; the four test seams and the histogram
  counter are not_a_gc_pointer.

- PASS1_MARKED re-audited: gc/mod.rs gains two module declarations and one
  reg_scanner! registration, gc/census.rs widens side_tables() and adds
  census rows plus a test. A scanner registration adds a root SOURCE and
  runs nowhere between the census boundaries; census reporting runs from
  the diagnostic dump, not inside a cycle. LAYOUT_DIAG's entry is deleted:
  the holder became covered, which the gate calls the receipt.
@proggeramlug
proggeramlug merged commit 2e4d639 into main Sep 7, 2026
1 check passed
@proggeramlug
proggeramlug deleted the train144 branch September 7, 2026 23:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant