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 |
} |
} |
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, |
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])) */ |
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 |
} |
} |