diff --git a/libguile/gc.c b/libguile/gc.c index c6d065d12..14542dff0 100644 --- a/libguile/gc.c +++ b/libguile/gc.c @@ -350,7 +350,7 @@ scm_igc (what) while (type_list != SCM_EOL) if (SCM_VELTS (SCM_CAR (type_list))[scm_struct_i_refcnt]) { - pos = &SCM_CDR (type_list); + pos = SCM_CDRLOC (type_list); type_list = SCM_CDR (type_list); } else @@ -717,7 +717,7 @@ gc_mark_nimp: case scm_tc_free_cell: /* printf("found free_cell %X ", ptr); fflush(stdout); */ SCM_SETGC8MARK (ptr); - SCM_CDR (ptr) = SCM_EOL; + SCM_SETCDR (ptr, SCM_EOL); break; case scm_tcs_bignums: case scm_tc16_flo: @@ -952,7 +952,7 @@ scm_gc_sweep () if (SCM_GCMARKP (scmptr)) { if (SCM_CDR (SCM_CAR (scmptr) - 1) == (SCM)1) - SCM_CDR (SCM_CAR (scmptr) - 1) = (SCM)0; + SCM_SETCDR (SCM_CAR (scmptr) - 1, (SCM) 0); goto cmrkcontinue; } { @@ -1090,7 +1090,7 @@ scm_gc_sweep () SCM_SETSTREAM (scmptr, 0); scm_remove_from_port_table (scmptr); scm_gc_ports_collected++; - SCM_CAR (scmptr) &= ~SCM_OPN; + SCM_SETAND_CAR (scmptr, ~SCM_OPN); } break; case scm_tc7_smob: @@ -1146,8 +1146,8 @@ scm_gc_sweep () if (SCM_CAR (scmptr) == (SCM) scm_tc_free_cell) exit (2); #endif - SCM_CAR (scmptr) = (SCM) scm_tc_free_cell; - SCM_CDR (scmptr) = nfreelist; + SCM_SETCAR (scmptr, (SCM) scm_tc_free_cell); + SCM_SETCDR (scmptr, nfreelist); nfreelist = scmptr; #if 0 if ((nfreelist < scm_heap_table[0].bounds[0]) || @@ -1227,7 +1227,7 @@ scm_gc_sweep () *fixup = SCM_CDR (alist); } else - fixup = &SCM_CDR (alist); + fixup = SCM_CDRLOC (alist); alist = SCM_CDR (alist); } } @@ -1453,8 +1453,8 @@ init_heap_seg (seg_org, size, ncells, freelistp) #ifdef SCM_POINTERS_MUNGED scmptr = PTR2SCM (ptr); #endif - SCM_CAR (scmptr) = (SCM) scm_tc_free_cell; - SCM_CDR (scmptr) = PTR2SCM (ptr + ncells); + SCM_SETCAR (scmptr, (SCM) scm_tc_free_cell); + SCM_SETCDR (scmptr, PTR2SCM (ptr + ncells)); ptr += ncells; } @@ -1463,7 +1463,7 @@ init_heap_seg (seg_org, size, ncells, freelistp) /* Patch up the last freelist pointer in the segment * to join it to the input freelist. */ - SCM_CDR (PTR2SCM (ptr)) = *freelistp; + SCM_SETCDR (PTR2SCM (ptr), *freelistp); *freelistp = PTR2SCM (CELL_UP (seg_org)); scm_heap_size += (ncells * n_new_objects); @@ -1659,7 +1659,7 @@ scm_init_storage (init_heap_size) scm_undefineds = scm_cons (SCM_UNDEFINED, SCM_EOL); - SCM_CDR (scm_undefineds) = scm_undefineds; + SCM_SETCDR (scm_undefineds, scm_undefineds); scm_listofnull = scm_cons (SCM_EOL, SCM_EOL); scm_nullstr = scm_makstr (0L, 0); diff --git a/libguile/pairs.h b/libguile/pairs.h index 9cbca3541..4b7af0b26 100644 --- a/libguile/pairs.h +++ b/libguile/pairs.h @@ -101,8 +101,16 @@ typedef SCM huge *SCMPTR; #define SCM_CAR(x) (((scm_cell *)(SCM2PTR(x)))->car) #define SCM_CDR(x) (((scm_cell *)(SCM2PTR(x)))->cdr) #define SCM_GCCDR(x) (~1L & SCM_CDR(x)) -#define SCM_SETCDR(x, v) SCM_CDR(x) = (SCM)(v) -#define SCM_SETCAR(x, v) SCM_CAR(x) = (SCM)(v) +#define SCM_SETCAR(x, v) (SCM_CAR(x) = (SCM)(v)) +#define SCM_SETCDR(x, v) (SCM_CDR(x) = (SCM)(v)) + +#define SCM_CARLOC(x) (&SCM_CAR (x)) +#define SCM_CDRLOC(x) (&SCM_CDR (x)) + +#define SCM_SETAND_CAR(x, y) (SCM_CAR (x) &= (y)) +#define SCM_SETAND_CDR(x, y) (SCM_CDR (x) &= (y)) +#define SCM_SETOR_CAR(x, y) (SCM_CAR (x) |= (y)) +#define SCM_SETOR_CDR(x, y) (SCM_CDR (x) |= (y)) #define SCM_CAAR(OBJ) SCM_CAR (SCM_CAR (OBJ)) #define SCM_CDAR(OBJ) SCM_CDR (SCM_CAR (OBJ))