From cecef73d94a59f5932e28e938145700019203801 Mon Sep 17 00:00:00 2001 From: Clinton Ebadi Date: Sat, 17 Apr 2010 14:21:43 -0400 Subject: [PATCH 2/3] Register disappearing links when initializing weak vectors * libguile/vectors.c (scm_c_vector_set_x): Unregister old weak link when assigning to a weak vector. (scm_i_make_weak_vector): Register elements as disappearing links to fill value. (scm_i_make_weak_vector_from_list): Register elements as disappearing links. --- libguile/vectors.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) diff --git a/libguile/vectors.c b/libguile/vectors.c index e60e2c3..cca57cd 100644 --- a/libguile/vectors.c +++ b/libguile/vectors.c @@ -274,10 +274,11 @@ scm_c_vector_set_x (SCM v, size_t k, SCM obj) if (k >= SCM_I_VECTOR_LENGTH (v)) scm_out_of_range (NULL, scm_from_size_t (k)); (SCM_I_VECTOR_WELTS(v))[k] = obj; - if (SCM_I_WVECTP (v)) + if (SCM_I_WVECTP (v) && !SCM_IS_WHVEC (v)) { /* Make it a weak pointer. */ GC_PTR link = (GC_PTR) & ((SCM_I_VECTOR_WELTS (v))[k]); + GC_unregister_disappearing_link (link); SCM_I_REGISTER_DISAPPEARING_LINK (link, obj); } } @@ -292,10 +293,11 @@ scm_c_vector_set_x (SCM v, size_t k, SCM obj) k = SCM_I_ARRAY_BASE (v) + k*dim->inc; (SCM_I_VECTOR_WELTS (vv))[k] = obj; - if (SCM_I_WVECTP (vv)) + if (SCM_I_WVECTP (vv) && !SCM_IS_WHVEC (vv)) { /* Make it a weak pointer. */ GC_PTR link = (GC_PTR) & ((SCM_I_VECTOR_WELTS (vv))[k]); + GC_unregister_disappearing_link (link); SCM_I_REGISTER_DISAPPEARING_LINK (link, obj); } } @@ -420,7 +422,10 @@ scm_i_make_weak_vector (scm_t_bits type, SCM size, SCM fill) base = SCM_I_WVECT_GC_WVELTS (wv); for (j = 0; j != c_size; ++j) - base[j] = fill; + { + base[j] = fill; + SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) base + j, (GC_PTR) SCM_UNPACK(fill)); + } return wv; } @@ -442,6 +447,7 @@ scm_i_make_weak_vector_from_list (scm_t_bits type, SCM lst) scm_is_pair (lst); lst = SCM_CDR (lst), elt++) { + SCM_I_REGISTER_DISAPPEARING_LINK((GC_PTR) elt, (GC_PTR) SCM_UNPACK(SCM_CAR(lst))); *elt = SCM_CAR (lst); } -- 1.6.5.7