1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-01 04:10:18 +02:00

Fix a bug in weak hash table bucket fixup.

* libguile/hashtab.c (scm_fixup_weak_alist): Keep the value of PREV
  unchanged after a nullified pair is deleted; this fixes a bug whereby
  if several successive nullified pairs were encountered, not all of them
  would be removed, and the assertion in `weak_bucket_assoc' would be
  hit.  In addition, remove the `scm_is_pair (pair)' test.
This commit is contained in:
Ludovic Courtès 2010-10-11 15:14:55 +02:00
parent 08002eae4d
commit dff58577d8

View file

@ -102,25 +102,25 @@ scm_fixup_weak_alist (SCM alist, size_t *removed_items)
*removed_items = 0;
for (result = alist;
scm_is_pair (alist);
prev = alist, alist = SCM_CDR (alist))
alist = SCM_CDR (alist))
{
SCM pair = SCM_CAR (alist);
if (scm_is_pair (pair))
if (SCM_WEAK_PAIR_DELETED_P (pair))
{
if (SCM_WEAK_PAIR_DELETED_P (pair))
{
/* Remove from ALIST weak pair PAIR whose car/cdr has been
nullified by the GC. */
if (prev == SCM_EOL)
result = SCM_CDR (alist);
else
SCM_SETCDR (prev, SCM_CDR (alist));
/* Remove from ALIST weak pair PAIR whose car/cdr has been
nullified by the GC. */
if (prev == SCM_EOL)
result = SCM_CDR (alist);
else
SCM_SETCDR (prev, SCM_CDR (alist));
(*removed_items)++;
continue;
}
(*removed_items)++;
/* Leave PREV unchanged. */
}
else
prev = alist;
}
return result;