Repository navigation
Conversation
read_buffer_bytes takes a NoGc scope since PerryTS#12103, so the fixture no longer compiled, and the warnings and check jobs stopped there. The fixture's tests also call runtime-backed perry-ffi functions, so they take perry-ffi with runtime-link as a dev-dependency, like the ext crates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The runtime does not export the shadow-stack entry points on native stack-map targets. The http, net, streams and ws test modules called them, so they no longer compiled and the warnings job failed. On those targets the guards' shadow frames rooted nothing. The net and http tests now hold the values that must survive a collection in a RuntimeHandleScope. The guards call gc_init(), which registers the runtime-handle scanner that program startup would register. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…dr_class The GC store-site, address-classification and SSO inventories failed on main. - Store sites: the new raw writes get audit markers. None of them stores a GC reference in a heap slot, so no barrier was missing. - Address classes: the new GcHeader casts use the gc and addr_class helpers, and the clone writer's handle floors use is_handle_band. - SSO: the stream emitter's shape fast paths read a key's header through heap_string_header, which declines a short string. The clone writer now returns an empty string for a STRING_TAG payload in the handle band, where it read memory before. The method-site helpers now decline a misaligned or out-of-range address before they read a header. Both baselines go down. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Four lint steps failed on main. - Local binding audit: receiver_kind reads a typed-array hint. The emitted guard checks the receiver's kind at run time, so a wrong hint only loses the fast path. The allowlist records it as runtime-validated. - Test registration: the checker now accepts a #[path] declaration in a sibling file. native_payload_lifecycle.rs was declared that way and its tests already ran. - Test registration: three test_gap_gc fixtures join the GC corpus. The fixture-env parser accepts PERRY_GC_PROTECT_OLD_SWEEP, which two of them set. protected_poll_reclaim gets the parity-env line that its header describes, so its collections now run. - Per-test global sinks: the new test counters use per_test_global!. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Each split moves whole functions or inline test modules into a child file. Module paths and test names do not change. - dynamic_dispatch.rs: build_direct_method_args moves to dynamic_dispatch_args.rs. - node_stream_readwrite.rs: the chunk and byte collectors move to node_stream_chunk_collect.rs. - method_site.rs: prime_inherited and the constfn tests move to child files. - delete_rest.rs and read_holder.rs: their inline test modules move to child files. The buffer-layout and address-class baselines follow the moved node_stream lines. Their totals do not change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…tchets
Six ratchet steps failed on main.
- Raw-handle debt: each flagged site now uses with_*_ptr for a call
that cannot collect, or RuntimeHandle::across_* where an allocating
call comes before a re-read. The baseline falls from 861 to 848.
- iterator_push_pending read a raw promise and iterator after
js_array_alloc and js_array_push_f64. It now roots both values and
re-reads them after each call.
- Native-handle ledger: the zlib Statics rule required a field that
no longer exists, so it counted 0 tables. It now counts the streams
and listeners maps, which are keyed by i64 handles.
- Unrooted locals: the collection-point matcher matched "gc(" inside
no_gc(. Names now match only at the start of an identifier. The
self-test plants both cases.
- Thread-exit globals and registry lifetime: delete the entries for
INLINE_OWNING_U32_CACHE and VERDICT_CLASSES, which no longer exist.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The perry-runtime test binary aborted in the stream instanceof test, so cargo-test stopped before most suites ran. - instanceof: live_chain_answer and the native-subclass static arm passed builtin class ids, such as PassThrough's, to class_constructor_ref_value. Only a compiled class has a class function object. Both now check is_compiled_class_id and fall back to the declared chain walk. A release build no longer mints a bogus pinned closure for a builtin id. - Regex program cells: init_program_cell wrote None through a temporary after it zeroed the payload, which copied stack bytes into the cell. It writes a field only if the field does not already read as None. - The residual-prototype relocation test registers the object-model scanners. Its setPrototypeOf calls fill the canonical-keys trie, and without a scanner a copying minor left stale key cells. CI crashed on this intermittently. - Stale tests: the thread-exit closure and symbol side-table tests follow PerryTS#11931, and the macOS length test follows PerryTS#10694. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The guarded writes in init_program_cell sit outside the window of the existing POINTER_FREE marker, so the store-site inventory flagged them. They fill a fresh, unpublished cell whose fields hold no GC pointer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…call taint Since PerryTS#11992, NATIVE_CALLABLE_EXPORTS builds an ahash::RandomState in its thread-local initializer, and every HotKey slow path reaches that initializer. aHash's RAND_SOURCE OnceBox init makes one indirect call. The call drops the losing Box<dyn RandomSource>, which is always a DefaultRandomSource with no drop glue. The classifier treated the call as unknown, so about 740 macOS symbols became Reenters, js_arena_alloc among them. A new indirect rule exempts that one instantiation. A forbid rule on set_random_source keeps the exemption sound. The thread-creation rule also matches Arc's new alloc::rcs::arc path, which the nightly bump renamed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The table is regenerated from this branch's release archives with scripts/gc_call_effects/regen.sh macos-aarch64. With the aHash rule, js_arena_alloc stays AllocOnly and 809 symbols stay Leaf. The changed rows come from runtime code that changed after the last regeneration. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
On linux-x86_64 the NATIVE_CALLABLE_EXPORTS taint reaches a different aHash initializer: OnceBox<[[u64; 4]; 2]>::init for the fixed seeds. get_fixed_seeds fills that table from getrandom, and the register call in init is that getrandom or dealloc path. CI's fresh Linux table still had AllocOnly at 3 and js_arena_alloc as Reenters without this rule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
docs/src/api/reference.md is empty on main, so the check job's API docs drift step fails. scripts/regen_api_docs.sh output restores it from the manifest. docs/api/perry.d.ts does not change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The holder census matched a static only when the line started with `static`. A one-line `per_test_global!(static X: T = ...)` was invisible, although it expands to a real static outside tests. That made the iterator_close CALLS entry read as stale. DECL now accepts the macro prefix, and the self-test plants that form. The thread-exit audit shares the census, so it now sees the timer STORE map. Its entry names purge_agent_timers, which retire_agent calls to drop the exiting agent's partition. GC_INIT_DONE's frontier pin is deleted. The ext-http test guard now calls gc_init, so the bare-name graph reaches it. The holder is a Cell<bool> and never needed coverage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
PerryTS#12109 (node:sqlite on native payloads) failed six checks on main. - File size: native_payload.rs's hidden JS-state group moves to the native_payload_state.rs child. The public paths are re-exported. - Address classes: install_own_builtin_accessor guards with is_handle_band. The guard also rejects 0x10000..0x100000, where no heap object lives. - Raw-handle debt: the native-payload tests and native_payload_birth pass handles through with_mut_ptr and with_const_ptr. - Native-handle ledger: PerryTS#12109 removed three sqlite handle tables, so the census fell below the fixed floor of 200. The floor now follows the ledger: the census may not drop below 90% of the recorded totals or below 150. The self-test plants a collapse and a 20% drop. - GC holders: four holders lost their accidental coverage with the sqlite scanner. Each gets a researched not_a_gc_pointer verdict. - Warnings: drop an unneeded unsafe block and two unused imports. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…12121) The thread-local policy ratchet in self-test-checkers failed on main. Fourteen raw thread_local! declarations become perry_thread_local!, so their address comes from the per-thread hot cache. The two alloc_census.rs declarations stay raw and are recorded: the allocator hook reads them before the runtime's TLS exists, and a HotKey's first touch would allocate and re-enter that hook. The async_context.rs and builtin_closure_metadata.rs counts are re-recorded lower. The PASS1_MARKED holder pin follows the edited allocation_pacing.rs after a re-audit of its window. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The table lacked the js_perry_bytes_* and js_perry_stream_* entry points that the scoped byte API and native-payload streams added, so the lint job's ABI consistency step failed. This is the output of scripts/runtime_abi_check.py --emit-wasm-abi. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…2121) The table is CI's fresh output from the gc-call-effects (windows-x86_64) job on this chain. That job cross-builds the archives with cargo-xwin, which this branch's author cannot run locally. The committed table had 13 symbols in a weaker class than the archives prove. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…TS#12121) z8 failed on main and on this chain. It bounded anonymous RSS on a process that had run about 5000 tests. mimalloc commits and purges memory in 5 to 11 MB steps on its own schedule. CI showed a one-time 6.4 MB step, then a fall. On macOS the RSS probe read 0, so the test could not fail there. The test now bounds the thread's retained heap after a full collection: arena bytes, external bytes and payload-reported native bytes. The peak may sit less than 64 KiB above the warm batch, so a leak of 44 bytes per stream fails. A new retain_chunk sabotage keeps every finished chunk alive while every counter stays green, and the bound turns the test red. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
The table is CI's fresh output from the gc-call-effects-linux job on this branch, with the aHash fixed-seed rule in place. js_arena_alloc stays AllocOnly, and 811 symbols are Leaf. The committed table had 9 symbols in a weaker class than the archives prove. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
c346a01 keeps private entries and public properties in separate key namespaces. Four sites still treated a private entry as a flagged property, so `static #n = 8; A.#n` read undefined and the key leaked as a public property. - Claiming a defined static converts its property slot in place (AttrsEdit::ClaimPrivate). It no longer appends an empty private entry. - js_class_object_define_static_private writes the private entry directly. [[Set]] now throws "Cannot write private member" there. - Private get and set find the entry on a class object and in a class closure's property bag, so a write no longer creates a public twin. - Object spread drops private slots by position. Each class-expression evaluation's prototype also gets its symbol-keyed methods, under that evaluation's private brand. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
buffer_addr_from_raw stripped any tag to 48 bits, so a plain number such as fd 65 became a heap address. fs path validation then crashed on the header read (PerryTS#10694). boxed_primitive_payload read a subnormal double such as 1e-310 as a raw pointer and crashed in toString. Both now classify with addr_class::object_ref_addr, which checks the tag first and asks the allocator about a raw word. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
- Deleting a function's own user property no longer marks the key deleted, so the inherited Function.prototype member shows again. - super.m() in a class that extends a native base such as Map reads the home prototype's [[Prototype]]. - An Intl subclass's super() copies the instance fields with define, not [[Set]], which hit the inherited getter-only format. - Lowering no longer folds fnAlias.call(x, ...) into x.bind(...) for bind, call and apply. The fold recursed through a patched bind. - The default toLocaleString runs an inherited user toLocaleString. - util.inspect with a negative depth prints node's collapsed [Ctor]. - A Temporal value's property read falls back to its prototype. - The CJS wrapper re-exports undefined, NaN and Infinity under a mangled name, so exports.undefined no longer shadows the global. - The macOS hot-TLS mrs asm is a gc-leaf-function, so an inlined copy is not wrapped in a statepoint. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…#12148 - The harness strips the [gc-sweep-quarantine] banner, as it strips [gc-schedule]. - A Node crash is not node_fail when test-parity/expected has the test's output. better_sqlite3_close gets an expected file from Node 26.5.1 with better-sqlite3 on Linux, because the oracle does not install that package. - test_gap_11836 forces only evacuation. 9af2d89 deleted the shadow-frame retry that its RS4GC budget used to reach. - gap_snapshot.py writes both snapshot changes from CI's Linux reports: 2159 now passes, and iterret_generator_prototype fails until generator methods move to %GeneratorPrototype% (PerryTS#12148). known_failures.json follows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Main fixed several of this chain's targets in parallel. Main's version wins where both fixed the same thing: - the zlib ledger census and its floor - the residual-prototype test's scanners - the native_payload and node_stream_readwrite splits Our raw-handle and addr_class edits are re-applied on main's files. z8 keeps main's scanner set and block-sized batches, with this chain's retained-heap bound in place of the RSS bound. Main's new code also failed six gates, fixed here: - the string payload offset - one raw-handle site - the 2 MiB block size in the GC doc - two holder verdicts - two per-test counter names - six warnings Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: true
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This was referenced Oct 7, 2026
The merged main changes the runtime: 2 MiB GC blocks, OS-backed arena regions, and zlib codecs on native payloads. This is the output of scripts/gc_call_effects/regen.sh macos-aarch64 at this branch's tip. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
These are CI's fresh outputs from the gc-call-effects jobs on this branch with main merged. This Mac cannot build the Linux archives or cross-build the Windows ones. CI's macOS output for the same run matches the committed macOS table byte for byte. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…ceiver (PerryTS#12149) Lowering no longer folds `apply.call(undefined, ...)` into `undefined.apply(...)`, so these calls reach function_prototype_call_thunk and function_prototype_apply_thunk. Neither checked that `this` is callable, so `call` and `apply` on undefined, null or a boolean returned undefined. Node throws a TypeError, and test_gap_3662_function_proto_brand_check expects one. Both thunks now run the brand check that method dispatch uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…erryTS#12149) a139abd added perry-runtime to perry-ext-zlib's dev-dependencies without features. Every other ext crate declares it with default and stdlib, and the well_known guard ext_crates_bundle_a_full_featured_perry_runtime requires that, so cargo-test failed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…purpose (PerryTS#12149) - zlib_one_shots and zlib_paths: 79dc03e moved deflate to miniz_oxide on purpose, and its bytes differ from Node's. Node's gzip header also carries the host OS byte. The fixtures now check what holds on every platform: the round trip, sync and callback agreement, the gzip magic, and the decoded CRC. - gc_11828: two per-byte JS loops outside the stream under test caused 276k forced collections and a 10 s CI timeout. The fill uses Uint8Array.from and the sampler steps by 97. Moved objects stay near 14k, so the stream path is still tested. - cb-sqlite_perry: the harness now compares it against its expected file, and the T10 churn of 220k databases timed out on CI. 22k databases still catch a leak against the 64 MB bound. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Main fixed several of this branch's targets itself. Main's version wins where both fixed the same thing: - 2c50378 static private fields: our slot claim, static-private define and class-object private storage are dropped. - a09626c buffer words classified by tag: our buffer/query.rs fix is dropped. - the byte-cell series in buffer/backing.rs and buffer/view.rs. - read_holder.rs, now under the cap without our test split. Two of our private-member fixes stay, because main's fix does not cover them: spread drops private slots, and each class-expression evaluation gets its symbol-keyed methods. The subnormal toString fix also stays. Two fixes to code from main: - alloc.rs uses an empty key slice when a weak collection passes a null pointer at length 0. - buffer_b4.rs gates a Linux-only local, so macOS builds without warnings. The GC-holder JSON merges both sides' verdicts and re-pins PASS1_MARKED. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
Take main's side in the three Rust conflicts. Main rewrote the super property read, the class-id band check and the dynamic dispatch module. Delete dynamic_dispatch_args.rs, because main's dispatch module no longer uses it. Keep main's holder inventory and re-pin PASS1_MARKED for the policy.rs change in 0ebee67, which only edits a mutator-side parse bump. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…erryTS#12149) Gate accessor_entry_pair with the same cfg as its only caller, the probe module. Without the gate, `cargo check -p perry --bins` fails on dead code. Drop an unused import from iterator_step_tests.rs. Add PERRY_B4_SABOTAGE to BUILD_CACHE_ENV_VARS. Each sabotage mode changes the emitted object, so a cached object must not serve the other setting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
… main code (PerryTS#12149) Add GC_STORE_AUDIT markers to seven raw writes that main added. Each one initializes fresh storage or copies numeric lanes. Replace the 0x1000 floor in byte_word_address with is_handle_band. The check now covers the tagged payload too, so a POINTER_TAG handle is never read as an address. Read the SSO test's string bytes through OwnedStringBytes instead of an open-coded StringHeader offset. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…PerryTS#12149) Main deleted, retyped or rewrote several entries that the lint inventories still name. Update each inventory to match the code: - Shape census: rustfmt split one callsite line, and the RegExp birth now calls prepare_shape(receiver). - Thread-exit verdicts: delete three statics that no longer exist. Classify the new REGIONS map as thread_exit_invalidated by `unmap`. - Registry lifetime: lower MIN_REMOVING to 169. Main deleted or retyped every registry that left the list, so the scanner still matches. - Rekeyed tables: classify the ephemeron seed list as self_pruned by clear_seeds. - Native-handle ledger: delete the stale weakref/index.rs entry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
…ord (PerryTS#12149) Main folded gc-root-dominance.yml into the gc-root-dominance job in gc.yml. That job runs on PRs only with the run-extended-tests label. Update the two references in gc-rooting-invariant.md. List weakmap-owned-index-validation.md in HISTORICAL_DOCS. It records one past run with the knob names that the run used. Those names have no parser. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7
This branch has not been deployed
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 in this order:
Problem
CI on
mainis red again after #12025. Commits since then brokecheck,warnings,cargo-test,gc-call-effects,self-test-checkers,gap-suiteand fourteenlintsteps, so no PR can show a green build. Each later failure in a job was hidden behind an earlier one.Solution
Fix each breakage in its own PR. Each PR targets
mainand holds every fix above it in the order list, so the last PR is the one that can run fully green. Merge in order: each diff then shrinks to its own fix.In this PR
Fixes the gap-suite regressions. Main's gap shards are usually cancelled by the next push, so about 30 tests had been failing unseen. None comes from this chain: base and tip give identical results. This PR also merges current main and fixes the gates that main's newest commits left red. Main has since fixed some of the regressions itself, and this PR takes main's fix in each case.
Changes
Brand-check the Function.prototype call and apply thunks (diff). Once lowering stopped folding
apply.call(undefined, ...), those calls reached thunks that never checkedthis. They returned undefined where node throws a TypeError.perry/crates/perry-runtime/src/object/global_this/array_error.rs
Lines 33 to 38 in ef6aee0
Match node on the other regressions (diff). Function property delete, Intl subclass fields, the
bind/call/applyalias fold,toLocaleString,util.inspectdepth, Temporalconstructor, the CJSexports.undefinedwrapper, and the macOS hot-TLS asm.Fix the gap harness and record iterret (diff). The harness strips the new GC banner and uses an expected file when Node crashes. Both snapshot changes come from CI's Linux reports: 2159 now passes, and iterret_generator_prototype is recorded against Generator objects own next/return/throw, so a patched %GeneratorPrototype% method is ignored #12148.
Give perry-ext-zlib's test runtime the stdlib features (diff). a139abd declared the dev-dependency without features, so the well_known guard test failed.
perry/crates/perry-ext-zlib/Cargo.toml
Lines 32 to 35 in ef6aee0
Keep three fixtures within their purpose (diff). 79dc03e chose miniz_oxide, whose bytes differ from node's, so the zlib fixtures check the round trip and the decoded CRC. The gc_11828 and cb-sqlite fixtures drop loops and churn that timed out on CI but test nothing extra.
Fix the gates that main's newest commits left red (diff). Each one also fails on
mainat 6521c0c.warnings:accessor_entry_pairgets its only caller's cfg, and an unused import goes.cargo-test:PERRY_B4_SABOTAGEchanges emitted code, so it now keys the build cache.is_handle_bandinbyte_word_address, andOwnedStringBytesin one test.REGIONSmap), registry floor, ephemeron seed rekey, native-handle ledger, and the rooting doc's workflow path.weakmap-owned-index-validation.mdis now a historical record for the knob gate. The run that it records usedPERRY_GC_STRESS_SEEDandPERRY_GC_STRESS_RATE, which no parser reads, so that run was not GC-stressed.perry/crates/perry-runtime/src/buffer/header.rs
Lines 66 to 78 in ef6aee0
Regenerate the call-effects tables (diff). macOS is generated locally. Linux and Windows come from CI's jobs on this branch, and CI's macOS output matches the local one.
🤖 Generated with Claude Code
https://claude.ai/code/session_01V5MSmMLJm6sMdSS5r64ds7