You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
GC young-log rule-1 assertion aborts perry-stdlib tests on clean main: a writer of closure.dynamic_props publishes without note()-ing the key #11117
RUST_TEST_THREADS=1 cargo test -p perry-stdlib aborts on clean main with a GC young-log assertion. It is not the parallel-safety hazard CLAUDE.md documents — it is deterministic under single-threaded tests, and it reproduces with no PR applied.
The abort
panicked at crates/perry-runtime/src/gc/young_log.rs:173:13:
young log for closure.dynamic_props does not name 50252359400, which holds a
minor-relevant pointer: a writer of that table publishes without `note`-ing the
key first (see gc/young_log.rs rule 1)
thread caused non-unwinding panic. aborting.
Identical assertion, identical test, on clean main with none of the PR's code present. Deterministic, so it is not flake and not the shared-global races that per_test_global! is converting (#7672) — those present as a fixture precondition failure ("fixture must start proven…"), which this is not.
Two further failures in the same run, also reproducing on clean main in isolation: crypto::random::tests::native_dispatch_pbkdf2_value_form_fires_callback and crypto::random::tests::native_dispatch_random_bytes_value_form_fires_callback.
Why nobody has seen it in CI
cargo-test on #11036 aborted at perry-codegen, the 4th crate of 44, so perry-stdlib never ran there. Whether the sweep/full tiers reach it on Linux is worth checking — the reproduction above is on a macOS/aarch64 host, and the assertion may be host-sensitive.
Why it matters more than a failing test
The assertion is the young log catching rule 1: a writer published a pointer into closure.dynamic_props without note-ing the key first. That is the missing-write-barrier class. The instrument is doing exactly its job here — the alternative to this abort is a minor collection that does not trace the pointer, which surfaces cycles later as TypeError: value is not a function in an unrelated function and is invisible to every runtime GC probe.
So the question is not "why does this test abort" but "which writer of closure.dynamic_props publishes without noting" — and whether that writer is reachable from ordinary JS rather than only from this fixture.
Reproduce
RUST_TEST_THREADS=1 cargo test -p perry-stdlib --lib readline::mod_tests::listeners_provider_roots_readable_snapshot_across_array_allocation
Found while repairing #11036's CI; that PR is unrelated and its own failures are fixed separately.
Activity