Merge train: 19 PRs (#9746–#9767) + gate fixes - #9798
Merged
Conversation
added 30 commits
September 5, 2026 05:17
A compiler built from a runtime-only branch computes a different `build_id` (djb2 of its own executable) and therefore misses every object a sibling build cached, even though the HIR and every codegen option match. Pinning the id lets relink workflows on large bundles (the 13 MB claude-code bundle: ~3 min link instead of ~40 min codegen) reuse those objects. Codegen changes still miss through the `hir` and option fields; an unparsable value is ignored. Claude-Session: https://claude.ai/code/session_01YPfnmWZmSpSWpmnoXvH8z2
This was referenced Sep 5, 2026
Closed
Closed
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Merge train: 19 PRs — #9746, #9747, #9748, #9749, #9751, #9752, #9753, #9754, #9757, #9758, #9759, #9760, #9761, #9763, #9764, #9765, #9766, #9767, #9750. Validated once as a tree, rebase-merged so each commit keeps its author.
#9762 is not in this train and is landing in the next one — see the note at the end.
Gate work
Five gates went red together; each is fixed at source rather than baselined away. All five were verified green on clean
mainfirst, so none had a pre-existing excuse.ic_miss.rs(fix(runtime): #9192 — an array with a non-array [[Prototype]] inherited nothing (47 divergences from node → 19) #9219 class). perf(regex): content-keyed construction cache, header-authoritative program lookups, find-only global test #9764's new#[cold]IC-miss diagnostic guarded a key pointer with a bare< 0x1000floor, which admits the whole handle band — real addresses on Linux, hidden by macOS's higher mmap base. Now asksaddr_class::is_above_handle_band.bun_compat/jsc.rs,class_registry/construct.rsandconstruct/class_object.rsmoved intowith_mut_ptr(gc(layer 3): from-space quarantine catches 55 stale dereferences across the gap suite — the instrument is in CI but aimed at one synthetic fixture #7341).IC_DIAGandREGEX_DIAGclassified.REGEX_DIAG's entry records that itsper_patternkey is a patternStringHeaderaddress used only as an opaque grouping id, never dereferenced — and that a recycled address merges two rows' counters. That imprecision is written down rather than papered over.PASS1_MARKED'snon_moving_snapshotpin re-audited. fix(gc): audit raw TLS holders and pin census snapshot lifetime #9750's new gate correctly demanded review because feat: implement bun:jsc heapStats with Perry heap counters #9760 touchedgc/mod.rs. That change ismod heap_stats;plus a re-export and alters no mark/sweep control flow;heap_stats()runs only from the JS-facingbun:jsc.heapStats(), never inside a cycle, and its own contract forbids allocation during the walk. Window unchanged, so only that one file's digest was re-pinned.Other train fixes
regex.rscrossed the 2000-line cap, soescape_regexp_sourcemoved into the existingregex/escape.rsand flags validation into a newregex/flags.rs— both gated onregex-enginelike their siblings. (A--features regex-enginecheck passes while the default build fails, since both moved items sit behind that gate; worth knowing before trusting a single-configuration check.)Two docs conflicts, resolved by kind: #9759's prose kept both independent sections; #9763's
docs/api/perry.d.tsanddocs/src/api/reference.mdare generated ("Do not edit by hand"), so they were regenerated from the manifest rather than merged.Validation
64/64 lint gates; release build;
perry-codegen,perry-runtime,perry-stdlib,perry-hir,perry-transform— all green (RUST_TEST_THREADS=1).On #9762
It failed
tdz_numeric_const_read_is_not_constant_folded, and I initially reported it as a regression. That was wrong: the emitted IR containscall i64 @js_box_get_bits_named(...), so the TDZ check is intact — the PR routes it through a named variant so theReferenceErrorcan identify the binding. The test hard-codes the old helper spelling. Corrected on the PR, and the test is being fixed to assert the property rather than the spelling (plus the no-fold assertion it was missing) in the next train.