Grammar fix.
[bpt/guile.git] / libguile / pairs.h
index 3b56610..2b18433 100644 (file)
  * 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"
@@ -143,21 +147,27 @@ typedef SCM  huge *SCMPTR;
 #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