mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-09 13:30:26 +02:00
Use SCM_{SET_}?CELL_TYPE when accessing the type entry of a cell.
This commit is contained in:
parent
76a369d95d
commit
2d67e39007
2 changed files with 35 additions and 19 deletions
|
@ -1,3 +1,12 @@
|
|||
2000-03-27 Dirk Herrmann <D.Herrmann@tu-bs.de>
|
||||
|
||||
* gc.h (SCM_NEWCELL, SCM_NEWCELL2): Use SCM_SET_CELL_TYPE to set
|
||||
the type entry of a new cell. Added a comment about things to
|
||||
remember when updating the list of free cells.
|
||||
|
||||
(SCM_FREEP, SCM_MARKEDP): Use SCM_CELL_TYPE to access the type
|
||||
entry of a cell.
|
||||
|
||||
2000-03-27 Dirk Herrmann <D.Herrmann@tu-bs.de>
|
||||
|
||||
* pairs.h (SCM_CAR, SCM_CDR, SCM_SETCAR, SCM_SETCDR): Use
|
||||
|
|
|
@ -153,11 +153,18 @@ typedef struct scm_cell
|
|||
#define SCM_PTR_GE(x, y) (!SCM_PTR_LT (x, y))
|
||||
|
||||
|
||||
/* the allocated thing: The car of newcells are set to
|
||||
/* Dirk:FIXME:: */
|
||||
/* Freelists consist of linked cells where the type entry holds the value
|
||||
* scm_tc_free_cell and the second entry holds a pointer to the next cell of
|
||||
* the freelist. Due to this structure, freelist cells are not cons cells
|
||||
* and thus may not be accessed using SCM_CAR and SCM_CDR.
|
||||
*/
|
||||
|
||||
/* the allocated thing: The car of new cells is set to
|
||||
scm_tc16_allocated to avoid the fragile state of newcells wrt the
|
||||
gc. If it stays as a freecell, any allocation afterwards could
|
||||
cause the cell to go back on the freelist, which will bite you
|
||||
sometime afterwards */
|
||||
sometime afterwards. */
|
||||
|
||||
#ifdef GUILE_DEBUG_FREELIST
|
||||
#define SCM_NEWCELL(_into) do { _into = scm_debug_newcell (); } while (0)
|
||||
|
@ -176,7 +183,7 @@ typedef struct scm_cell
|
|||
{ \
|
||||
_into = scm_freelist; \
|
||||
scm_freelist = SCM_CDR (scm_freelist); \
|
||||
SCM_SETCAR (_into, scm_tc16_allocated); \
|
||||
SCM_SET_CELL_TYPE (_into, scm_tc16_allocated); \
|
||||
} \
|
||||
} while(0)
|
||||
#define SCM_NEWCELL2(_into) \
|
||||
|
@ -188,7 +195,7 @@ typedef struct scm_cell
|
|||
{ \
|
||||
_into = scm_freelist2; \
|
||||
scm_freelist2 = SCM_CDR (scm_freelist2); \
|
||||
SCM_SETCAR (_into, scm_tc16_allocated); \
|
||||
SCM_SET_CELL_TYPE (_into, scm_tc16_allocated); \
|
||||
} \
|
||||
} while(0)
|
||||
#else /* GUILE_NEW_GC_SCHEME */
|
||||
|
@ -200,7 +207,7 @@ typedef struct scm_cell
|
|||
{ \
|
||||
_into = scm_freelist.cells; \
|
||||
scm_freelist.cells = SCM_CDR (scm_freelist.cells); \
|
||||
SCM_SETCAR (_into, scm_tc16_allocated); \
|
||||
SCM_SET_CELL_TYPE (_into, scm_tc16_allocated); \
|
||||
++scm_cells_allocated; \
|
||||
} \
|
||||
} while(0)
|
||||
|
@ -212,7 +219,7 @@ typedef struct scm_cell
|
|||
{ \
|
||||
_into = scm_freelist2.cells; \
|
||||
scm_freelist2.cells = SCM_CDR (scm_freelist2.cells); \
|
||||
SCM_SETCAR (_into, scm_tc16_allocated); \
|
||||
SCM_SET_CELL_TYPE (_into, scm_tc16_allocated); \
|
||||
scm_cells_allocated += 2; \
|
||||
} \
|
||||
} while(0)
|
||||
|
@ -220,12 +227,12 @@ typedef struct scm_cell
|
|||
#endif
|
||||
|
||||
|
||||
#define SCM_FREEP(x) (SCM_NIMP(x) && SCM_UNPACK_CAR (x)==scm_tc_free_cell)
|
||||
#define SCM_FREEP(x) (SCM_NIMP (x) && (SCM_CELL_TYPE (x) == scm_tc_free_cell))
|
||||
#define SCM_NFREEP(x) (!SCM_FREEP (x))
|
||||
|
||||
/* 1. This shouldn't be used on immediates.
|
||||
2. It thinks that subrs are always unmarked (harmless). */
|
||||
#define SCM_MARKEDP(x) ((SCM_UNPACK_CAR (x) & 5) == 5 \
|
||||
#define SCM_MARKEDP(x) ((SCM_CELL_TYPE (x) & 5) == 5 \
|
||||
? SCM_GC8MARKP (x) \
|
||||
: SCM_GCMARKP (x))
|
||||
#define SCM_NMARKEDP(x) (!SCM_MARKEDP (x))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue