repair for locked-object handling and multiply-locked values

Weak pairs, ephemeron pairs, some symbols, and some ports were handled
incorerctly when locked multiple times.

original commit: 847fc1c84496f67cd363c8411d0023339f4d6246
This commit is contained in:
Matthew Flatt 2019-09-01 08:57:14 -06:00
parent 2f4d59de0f
commit 502b0b5f50
2 changed files with 4 additions and 1 deletions

4
c/gc.c
View File

@ -2213,8 +2213,10 @@ static void sanitize_locked_segment(seginfo *si) {
/* Zero out unused memory */
while (pp < ppend) {
if ((ls != Snil) && (pp == UNTYPE_ANY(Scar(ls)))) {
ptr a = Scar(ls);
pp = (ptr *)((uptr)pp + size_object(Scar(ls)));
ls = Scdr(ls);
while ((ls != Snil) && (Scar(ls) == a))
ls = Scdr(ls);
} else {
*pp = FIX(0);
pp++;

View File

@ -3562,6 +3562,7 @@
(vector-set! v (sub1 N) p)
(collect 0)
(set-car! p 'yes)
(unlock-object v)
(equal? '(yes . 2) (vector-ref v (sub1 N)))))
)