Release blocker
The full release CI run for v0.5.1519 fails deterministically in:
cargo-test-perry (8/8)
issue_5139_object_arraylike_method_dispatch::any_typed_real_arrays_keep_array_mutator_semantics
Observed output:
Expected sum: 499500. Sampled array values (0, 1, 2, 99, 500, 999) are correct, so storage is intact and the optimized reduction is wrong.
Reproduction
RUST_TEST_THREADS=1 cargo test -p perry \
--test issue_5139_object_arraylike_method_dispatch \
any_typed_real_arrays_keep_array_mutator_semantics -- --exact --nocapture
Reproduced independently on perrymaster.skelpo.net at release SHA 259cf8b68dc1303cc4119595f96d458a52af8c4e.
Bisect
Automated exact compiler/runtime bisect:
The array is grown across a call boundary and the caller retains a forwarding stub. js_packed_arraylike_loop_guard follows that stub and validates the live target, but the ordinary-local stable-packed path discards the live address and reloads/de-tags the stale local for direct fast-clone reads. #9060 makes that clone reachable for the reduction by classifying js_shadow_slot_set as call-safe.
Required fix
Use js_packed_arraylike_loop_guard_live for ordinary-local admission as well as captured receivers, and feed its returned live receiver address to the fast clone. Retain the generic slow clone on a zero result. Update IR assertions to expect the stronger live guard.
Before merging/releasing, verify:
- the exact issue_5139 test above;
- all three issue_8690 versioned-loop tests, including three live-guard calls in the read-only IR fixture;
- issue_8655 and issue_8773 packed-loop IR/runtime coverage;
- quick pre-tag checks.
Release blocker
The full release CI run for v0.5.1519 fails deterministically in:
cargo-test-perry (8/8)issue_5139_object_arraylike_method_dispatch::any_typed_real_arrays_keep_array_mutator_semanticsObserved output:
Expected sum:
499500. Sampled array values (0, 1, 2, 99, 500, 999) are correct, so storage is intact and the optimized reduction is wrong.Reproduction
RUST_TEST_THREADS=1 cargo test -p perry \ --test issue_5139_object_arraylike_method_dispatch \ any_typed_real_arrays_keep_array_mutator_semantics -- --exact --nocaptureReproduced independently on
perrymaster.skelpo.netat release SHA259cf8b68dc1303cc4119595f96d458a52af8c4e.Bisect
Automated exact compiler/runtime bisect:
da0eefbf99a80da0b00020c0ae1c4bb88a1147ca57926713b078df354d7cf76ff11eaa18d5de76fb(perf(codegen): reduce accumulators earn the packed fast clone's numeric proof — s += arr[i] at node parity (was 5.3×) #9060)The array is grown across a call boundary and the caller retains a forwarding stub.
js_packed_arraylike_loop_guardfollows that stub and validates the live target, but the ordinary-local stable-packed path discards the live address and reloads/de-tags the stale local for direct fast-clone reads. #9060 makes that clone reachable for the reduction by classifyingjs_shadow_slot_setas call-safe.Required fix
Use
js_packed_arraylike_loop_guard_livefor ordinary-local admission as well as captured receivers, and feed its returned live receiver address to the fast clone. Retain the generic slow clone on a zero result. Update IR assertions to expect the stronger live guard.Before merging/releasing, verify: