cisco / ChezScheme

Chez Scheme
Apache License 2.0
6.89k stars 983 forks source link

ensure write barrier in last step of `vector-sort!` #784

Closed mflatt closed 6 months ago

mflatt commented 6 months ago

The old $vector-copy! could use $ptr-copy!, which doesn't have an associated write barrier. As a result, using $vector-copy! at the end of vector-sort! is incorrect.

The new test is arranges for one half of a vector to have generation-0 objects and the other to have immediate objects; the two halves are already sorted, so they end up being swapped via a temporary vector and $vector-copy!. As a result, a collection afterward can fail to scan the half of the original vector that it should scan.

The solution here is to rename the internal $vector-copy! function to $vector-fill-copy! (by analogy to $stencil-vector-fill-set!) and use keep using it for things like vector-copy. But the new $vector-copy! as used by vector-sort! avoids $ptr-copy!.