summaryrefslogtreecommitdiff
path: root/libguile/gc.c
diff options
context:
space:
mode:
authorJim Blandy <jimb@red-bean.com>1998-07-23 04:47:56 +0000
committerJim Blandy <jimb@red-bean.com>1998-07-23 04:47:56 +0000
commitdc53f026909e5373e5c864429897d1dc0780cd6c (patch)
tree58568db1ad4ee66dd89cfa80b4aa797a29069d2f /libguile/gc.c
parent6f4d9622004098db34124c5f25ef654197e5cfe6 (diff)
downloadguile-dc53f026909e5373e5c864429897d1dc0780cd6c.tar.gz
Simplify smob and port marking; set the mark bit in the generic
marking code, and make marker routines only responsible for turning up outgoing pointers. * gc.c (scm_gc_mark): Set the mark bit on ports and smobs here, before calling the marking function. Don't call the marking function if it's zero. * markers.c (scm_mark0): Just return #f. This function isn't necessary at all now, but it's harmless to call it. We'll leave it in so other folks' code doesn't croak at link time. (scm_markcdr): Don't call SCM_SETGC8MARK. * async.c (mark_async): Don't call SCM_SETGC8MARK. * dynl.c (mark_dynl_obj): Same. * root.c (mark_root): Same. * srcprop.c (marksrcprops): Same. * unif.c (markra): Same. * variable.c (scm_markvar): Same. * ports.c (scm_markstream): Same. (void_port_ptob): Specify zero for our marking function. * debug.c (debugobjsmob): Same. * dynwind.c (guardsmob): Same. * filesys.c (dir_smob): Same. * fluids.c (fluid_smob): Same. * fports.c (scm_fptob, scm_pipob): Same. * mallocs.c (mallocsmob): Same. * regex-posix.c (regex_t_smob): Same. * smob.c (freecell, flob, bigob): Same. * threads.c (thread_smob, mutex_smob, condvar_smob): Same. * throw.c (jbsmob, lazy_catch_funs): Same.
Diffstat (limited to 'libguile/gc.c')
-rw-r--r--libguile/gc.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/libguile/gc.c b/libguile/gc.c
index 16de3d978..988379c8b 100644
--- a/libguile/gc.c
+++ b/libguile/gc.c
@@ -819,31 +819,41 @@ gc_mark_nimp:
goto def;
if (SCM_GC8MARKP (ptr))
break;
+ SCM_SETGC8MARK (ptr);
if (SCM_PTAB_ENTRY(ptr))
scm_gc_mark (SCM_PTAB_ENTRY(ptr)->file_name);
- ptr = (scm_ptobs[i].mark) (ptr);
- goto gc_mark_loop;
+ if (scm_ptobs[i].mark)
+ {
+ ptr = (scm_ptobs[i].mark) (ptr);
+ goto gc_mark_loop;
+ }
+ else
+ return;
break;
case scm_tc7_smob:
if (SCM_GC8MARKP (ptr))
break;
- switch SCM_TYP16 (ptr)
+ SCM_SETGC8MARK (ptr);
+ switch SCM_GCTYP16 (ptr)
{ /* should be faster than going through scm_smobs */
case scm_tc_free_cell:
/* printf("found free_cell %X ", ptr); fflush(stdout); */
- SCM_SETGC8MARK (ptr);
SCM_SETCDR (ptr, SCM_EOL);
break;
case scm_tcs_bignums:
case scm_tc16_flo:
- SCM_SETGC8MARK (ptr);
break;
default:
i = SCM_SMOBNUM (ptr);
if (!(i < scm_numsmob))
goto def;
- ptr = (scm_smobs[i].mark) (ptr);
- goto gc_mark_loop;
+ if (scm_smobs[i].mark)
+ {
+ ptr = (scm_smobs[i].mark) (ptr);
+ goto gc_mark_loop;
+ }
+ else
+ return;
}
break;
default: