0.8.17.7:
[sbcl.git] / src / runtime / gc-internal.h
index ac8d5bd..114f514 100644 (file)
                        __FILE__, __LINE__)
 
 #define CEILING(x,y) (((x) + ((y) - 1)) & (~((y) - 1)))
-#define NWORDS(x,y) (CEILING((x),(y)) / (y))
+
+static inline unsigned int
+NWORDS(unsigned int x, unsigned int n_bits)
+{
+    /* A good compiler should be able to constant-fold this whole thing,
+       even with the conditional. */
+    if(n_bits <= N_WORD_BITS) {
+        unsigned int elements_per_word = N_WORD_BITS/n_bits;
+
+        return CEILING(x, elements_per_word)/elements_per_word;
+    }
+    else {
+        /* FIXME: should have some sort of assertion that N_WORD_BITS
+           evenly divides n_bits */
+        return x * (n_bits/N_WORD_BITS);
+    }
+}
 
 /* FIXME: Shouldn't this be defined in sbcl.h? */
 #define FUN_RAW_ADDR_OFFSET (6*sizeof(lispobj) - FUN_POINTER_LOWTAG)
@@ -64,6 +80,8 @@ lispobj *search_read_only_space(void *pointer);
 lispobj *search_static_space(void *pointer);
 lispobj *search_dynamic_space(void *pointer);
 
+#include "fixnump.h"
+
 /* Scan an area looking for an object which encloses the given pointer.
  * Return the object start on success or NULL on failure. */
 static lispobj *
@@ -75,8 +93,8 @@ search_space(lispobj *start, size_t words, lispobj *pointer)
 
        /* If thing is an immediate then this is a cons. */
        if (is_lisp_pointer(thing)
-           || ((thing & 3) == 0) /* fixnum */
-           || (widetag_of(thing) == BASE_CHAR_WIDETAG)
+           || (fixnump(thing))
+           || (widetag_of(thing) == CHARACTER_WIDETAG)
            || (widetag_of(thing) == UNBOUND_MARKER_WIDETAG))
            count = 2;
        else