Merge train: #9704, #9710 - #9714
Merged
Merged
Conversation
This was referenced Sep 4, 2026
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: #9704, #9710. Cherry-picked onto one branch, validated once as a tree, rebase-merged so each commit keeps its author.
#9704 — the exact-receiver inliner ignored prototype replacement (#9239). It substituted a declared method body even when the prototype had been monkey-patched at run time, so the replacement was never observed. Admission now requires a module-wide stable prototype-chain proof, and only the touched classes and their descendants lose inlining.
What makes this one sound is the direction it fails in. An unrecognized prototype holder sets
opaque_prototype_access = true; the child walk runs unconditionally after the match, so the bare_ => {}means "this node isn't an access" rather than "stop descending";walk_expr_childrenis an exhaustive match, so a newExprvariant breaks the build instead of silently escaping the proof; andvisit_stmtenumerates its no-op variants rather than using a catch-all. Closure bodies get an explicit visit because the shared walker deliberately doesn't descend them (per the 2026-07-02 audit note indeforest/walk.rs) — that one is load-bearing, not incidental.#9710 — buffer-backed
Uint8Arraymisses (#9347). The intrinsiclength/byteLength/byteOffset/buffergetters threwTypeErroron aUint8Arrayreceiver, Node-API reported it as not a typed array, andpreventExtensions/Reflect.seteither reported stale extensibility or lost ordinary-property writes.Int32Arraywas already correct. Both GC-holder gates confirm its address-keyedTYPED_ARRAY_OWN_PROPSstate is already classified, and the PR addsgc/tests/buffer_side_tables.rscovering prune-on-death.Validation
64/64 lint gates; release build;
perry-runtime,perry-stdlib,perry-transform(allRUST_TEST_THREADS=1), andissue_9131_prototype_method_replacement— all green.A first gate run reported
cargo clippy --workspacered; it did not reproduce. The gate's exact command with all 18 exclude args exits 0, and the warnings it printed were inperry-ext-ads/perry-ext-events, which neither PR touches. The full 64 were re-run clean rather than waiving it on one gate's say-so.Not in this train
#9705 was pulled after audit — its borrowing
_staticregistration spelling is unsound for plugin dylibs, whichperry_plugin_unloaddlcloses while the registries still borrow their rodata. Fix written and landing separately.