diff options
author | Jim Blandy <jimb@red-bean.com> | 1998-07-23 04:47:56 +0000 |
---|---|---|
committer | Jim Blandy <jimb@red-bean.com> | 1998-07-23 04:47:56 +0000 |
commit | dc53f026909e5373e5c864429897d1dc0780cd6c (patch) | |
tree | 58568db1ad4ee66dd89cfa80b4aa797a29069d2f /libguile/gc.c | |
parent | 6f4d9622004098db34124c5f25ef654197e5cfe6 (diff) | |
download | guile-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.c | 24 |
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: |