1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

Add `scm_immutable_cell ()'.

* libguile/inline.h (scm_immutable_cell): New.
This commit is contained in:
Ludovic Courtès 2008-09-15 23:28:35 +02:00
parent d6c74168a7
commit 53ea4fdf99

View file

@ -80,6 +80,7 @@
SCM_API SCM scm_cell (scm_t_bits car, scm_t_bits cdr); SCM_API SCM scm_cell (scm_t_bits car, scm_t_bits cdr);
SCM_API SCM scm_immutable_cell (scm_t_bits car, scm_t_bits cdr);
SCM_API SCM scm_double_cell (scm_t_bits car, scm_t_bits cbr, SCM_API SCM scm_double_cell (scm_t_bits car, scm_t_bits cbr,
scm_t_bits ccr, scm_t_bits cdr); scm_t_bits ccr, scm_t_bits cdr);
@ -124,6 +125,26 @@ scm_cell (scm_t_bits car, scm_t_bits cdr)
return cell; return cell;
} }
#ifndef SCM_INLINE_C_INCLUDING_INLINE_H
SCM_C_EXTERN_INLINE
#endif
SCM
scm_immutable_cell (scm_t_bits car, scm_t_bits cdr)
{
SCM cell = SCM_PACK ((scm_t_bits) (GC_MALLOC_STUBBORN (sizeof (scm_t_cell))));
/* Initialize the type slot last so that the cell is ignored by the GC
until it is completely initialized. This is only relevant when the GC
can actually run during this code, which it can't since the GC only runs
when all other threads are stopped. */
SCM_GC_SET_CELL_WORD (cell, 1, cdr);
SCM_GC_SET_CELL_WORD (cell, 0, car);
GC_END_STUBBORN_CHANGE ((void *) cell);
return cell;
}
#ifndef SCM_INLINE_C_INCLUDING_INLINE_H #ifndef SCM_INLINE_C_INCLUDING_INLINE_H
SCM_C_EXTERN_INLINE SCM_C_EXTERN_INLINE
#endif #endif