Skip to content

Merge train: #9924, #9926, #9929, #9930, #9931, #9932, #9933, #9934 - #9939

Merged
proggeramlug merged 13 commits into
mainfrom
train139
Sep 7, 2026
Merged

Merge train: #9924, #9926, #9929, #9930, #9931, #9932, #9933, #9934#9939
proggeramlug merged 13 commits into
mainfrom
train139

Conversation

@proggeramlug

Copy link
Copy Markdown
Contributor

Merge train: #9924, #9926, #9929, #9930, #9931, #9932, #9933, #9934. All eight cherry-picked without a conflict.

#9924 fixes a real boot failure (#9907)

main stopped booting Claude-of-Duty with Set.prototype.add is not a function — the TypeError: value is not a function signature this repo documents for GC rooting defects, and it held again.

The first copying minor speculatively retags nursery blocks as PromotedYoung, traces them, then rolls back when measured survival is low. Young-entry side-table scanners classified that temporary state through classify_heap_generation, which answers Old for it, and so drained their remembered keys during the speculative trace. When the promotion rolled back, the evacuation retry had already lost the roots reachable only through those tables.

The fix moves the predicate to classify_heap_space, which distinguishes PromotedYoung from ordinary old space, so the logs survive a rollback while a committed promotion still lets the next ordinary minor discard them. The regression test removes the ordinary old-object edge so the young log is the only root — without that it would pass either way — and it fails before the fix.

Two gate repairs, audited as such

#9929 lowers --min-funcs from 6000 to 5000 on the dependency corpus, which is a weakening on its face. It is a stale-floor correction: the measured population is 5,615–5,920 after legitimate compiler pruning, so the gate was red for the wrong reason. The 60-module and 4,000-root-store floors are untouched, and decisively all three corpora still catch 40/40 seeded violations — a vacuous corpus would catch none. It also teaches the checker LLVM 22's quoted inlined block labels (the #9494 false-positive class) with a planted quoted-edge hazard in the self-test.

#9930 is the opposite of a weakening. It replaces an unanchored substring grep bound to a specific module path with ^test .*::rs4gc_schedules_in_process \.\.\. ok$. The test moved between inprocess submodules; the anchored form survives that while still proving the pin ran and passed.

Issues

#9925 and #9928 were both filed automatically by the gate-failure watcher added in #9880 (landed in #9888). That observer has now caught three real scheduled-gate failures — gc-native-roots, gc-root-dominance, llvm-inprocess — each of which has a fix.

Validation

run_lint_gates: all 66 gates passed; 2 CI-only skipped (66, not 64 — #9929 adds two)

suite passed failed
perry-runtime 3265 0
perry-codegen 1940 0
perry-hir 629 0
perry-stdlib 132 0

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