Problem
After #91, the isolated fixed-shape object-allocation loop still writes index, displaced, value, and fresh into Frame.slots on every fused iteration. During a successful quick batch these locals are not observed until batch exit:
- the current displaced object remains rooted by the array until replacement
- the fresh object is rooted by the array immediately after replacement
- the next iteration overwrites the old displaced local before allocating again
- the quick path already rejects escaped frames and synchronized execution
Allocation and restricted-receiver errors must still expose bytecode-exact current/previous locals.
Proposed change
- retain the last completed iteration values in native locals
- publish the four frame slots once on normal quick-batch exit
- on allocation failure, publish the current partial index/displaced/value plus the last completed fresh value
- on restricted-receiver failure, publish the current partial index/displaced/value/fresh exactly as today
- preserve step accounting, GC rooting, guarded fallback, and checksum behavior
Acceptance
- existing fixed-shape allocation, multi-checkpoint, nursery-retention, observable fallback, and restricted-receiver tests pass with zero leaks
- exact checksum remains
1030552128 - exact-parent alternating
object_churnA/B reproduces a material win - batch full validation only if retained
- revert and close as not planned if neutral or slower