* If you write modifications of your own for GUILE, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice. */
+
+/* Software engineering face-lift by Greg J. Badros, 11-Dec-1999,
+ gjb@cs.washington.edu, http://www.cs.washington.edu/homes/gjb */
+
\f
#include "libguile/__scm.h"
#define SCM_CADDDR(OBJ) SCM_CAR (SCM_CDR (SCM_CDR (SCM_CDR (OBJ))))
#define SCM_CDDDDR(OBJ) SCM_CDR (SCM_CDR (SCM_CDR (SCM_CDR (OBJ))))
+/* the allocated thing: The car of newcells are 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 */
-#ifdef DEBUG_FREELIST
-#define SCM_NEWCELL(_into) (_into = scm_debug_newcell ())
+#ifdef GUILE_DEBUG_FREELIST
+#define SCM_NEWCELL(_into) do { _into = scm_debug_newcell (); } while (0)
#else
#define SCM_NEWCELL(_into) \
- { \
+ do { \
if (SCM_IMP(scm_freelist)) \
_into = scm_gc_for_newcell();\
else \
{ \
_into = scm_freelist; \
scm_freelist = SCM_CDR(scm_freelist);\
+ SCM_SETCAR(_into, scm_tc16_allocated); \
++scm_cells_allocated; \
} \
- }
+ } while(0)
#endif
\f