/[guile]/guile/guile-core/libguile/weaks.c
ViewVC logotype

Diff of /guile/guile-core/libguile/weaks.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.50 by xxhanwen, Sat Jul 20 14:08:34 2002 UTC revision 1.51 by hanwen, Sun Aug 4 00:17:18 2002 UTC
# Line 278  scm_mark_weak_vector_spines (void *dummy Line 278  scm_mark_weak_vector_spines (void *dummy
278    
279                alist = ptr[j];                alist = ptr[j];
280                while (   SCM_CONSP (alist)                while (   SCM_CONSP (alist)
281                       && !SCM_GCMARKP (alist)                       && !SCM_GC_MARK_P (alist)
282                       && SCM_CONSP  (SCM_CAR (alist)))                       && SCM_CONSP  (SCM_CAR (alist)))
283                  {                  {
284                    SCM_SETGCMARK (alist);                    SCM_SET_GC_MARK (alist);
285                    SCM_SETGCMARK (SCM_CAR (alist));                    SCM_SET_GC_MARK (SCM_CAR (alist));
286                    alist = SCM_CDR (alist);                    alist = SCM_CDR (alist);
287                  }                  }
288              }              }
# Line 292  scm_mark_weak_vector_spines (void *dummy Line 292  scm_mark_weak_vector_spines (void *dummy
292    return 0;    return 0;
293  }  }
294    
295    #define UNMARKED_CELL_P(x) (SCM_NIMP(x) && !SCM_GC_MARK_P (x))
296    
297  static void *  static void *
298  scm_scan_weak_vectors (void *dummy1 SCM_UNUSED,  scm_scan_weak_vectors (void *dummy1 SCM_UNUSED,
# Line 308  scm_scan_weak_vectors (void *dummy1 SCM_ Line 309  scm_scan_weak_vectors (void *dummy1 SCM_
309            ptr = SCM_GC_WRITABLE_VELTS (w);            ptr = SCM_GC_WRITABLE_VELTS (w);
310            n = SCM_VECTOR_LENGTH (w);            n = SCM_VECTOR_LENGTH (w);
311            for (j = 0; j < n; ++j)            for (j = 0; j < n; ++j)
312              if (SCM_FREE_CELL_P (ptr[j]))              if (UNMARKED_CELL_P (ptr[j]))
313                ptr[j] = SCM_BOOL_F;                ptr[j] = SCM_BOOL_F;
314          }          }
315        else /* if (SCM_IS_WHVEC_ANY (scm_weak_vectors[i])) */        else /* if (SCM_IS_WHVEC_ANY (scm_weak_vectors[i])) */
# Line 329  scm_scan_weak_vectors (void *dummy1 SCM_ Line 330  scm_scan_weak_vectors (void *dummy1 SCM_
330                fixup = ptr + j;                fixup = ptr + j;
331                alist = *fixup;                alist = *fixup;
332    
333                while (   SCM_CONSP (alist)                while (SCM_CONSP (alist)
334                          && SCM_CONSP (SCM_CAR (alist)))                       && SCM_CONSP (SCM_CAR (alist)))
335                  {                  {
336                    SCM key;                    SCM key;
337                    SCM value;                    SCM value;
338    
339                    key = SCM_CAAR (alist);                    key = SCM_CAAR (alist);
340                    value = SCM_CDAR (alist);                    value = SCM_CDAR (alist);
341                    if (   (weak_keys && SCM_FREE_CELL_P (key))                    if (   (weak_keys && UNMARKED_CELL_P (key))
342                           || (weak_values && SCM_FREE_CELL_P (value)))                           || (weak_values && UNMARKED_CELL_P (value)))
343                      {                      {
344                        *fixup = SCM_CDR (alist);                        *fixup = SCM_CDR (alist);
345                      }                      }

Legend:
Removed from v.1.50  
changed lines
  Added in v.1.51

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26