0.8.17.20:
[sbcl.git] / src / runtime / purify.c
index cc8496e..3750895 100644 (file)
@@ -27,6 +27,7 @@
 #include "interrupt.h"
 #include "purify.h"
 #include "interr.h"
+#include "fixnump.h"
 #include "gc.h"
 #include "gc-internal.h"
 #include "thread.h"
@@ -80,9 +81,6 @@ later {
 } *later_blocks = NULL;
 static int later_count = 0;
 
-#define CEILING(x,y) (((x) + ((y) - 1)) & (~((y) - 1)))
-#define NWORDS(x,y) (CEILING((x),(y)) / (y))
-
 /* FIXME: Shouldn't this be defined in sbcl.h?  See also notes in
  * cheneygc.c */
 
@@ -201,11 +199,11 @@ valid_dynamic_space_pointer(lispobj *pointer, lispobj *start_addr)
        /* Is it plausible cons? */
        if ((is_lisp_pointer(start_addr[0])
            || ((start_addr[0] & 3) == 0) /* fixnum */
-           || (widetag_of(start_addr[0]) == BASE_CHAR_WIDETAG)
+           || (widetag_of(start_addr[0]) == CHARACTER_WIDETAG)
            || (widetag_of(start_addr[0]) == UNBOUND_MARKER_WIDETAG))
           && (is_lisp_pointer(start_addr[1])
               || ((start_addr[1] & 3) == 0) /* fixnum */
-              || (widetag_of(start_addr[1]) == BASE_CHAR_WIDETAG)
+              || (widetag_of(start_addr[1]) == CHARACTER_WIDETAG)
               || (widetag_of(start_addr[1]) == UNBOUND_MARKER_WIDETAG))) {
            break;
        } else {
@@ -249,7 +247,7 @@ valid_dynamic_space_pointer(lispobj *pointer, lispobj *start_addr)
        }
        switch (widetag_of(start_addr[0])) {
        case UNBOUND_MARKER_WIDETAG:
-       case BASE_CHAR_WIDETAG:
+       case CHARACTER_WIDETAG:
            if (pointer_filter_verbose) {
                fprintf(stderr,"*Wo3: %x %x %x\n", (unsigned int) pointer, 
                        (unsigned int) start_addr, *start_addr);
@@ -287,6 +285,9 @@ valid_dynamic_space_pointer(lispobj *pointer, lispobj *start_addr)
 #endif
        case SIMPLE_ARRAY_WIDETAG:
        case COMPLEX_BASE_STRING_WIDETAG:
+#ifdef COMPLEX_CHARACTER_STRING_WIDETAG
+       case COMPLEX_CHARACTER_STRING_WIDETAG:
+#endif
        case COMPLEX_VECTOR_NIL_WIDETAG:
        case COMPLEX_BIT_VECTOR_WIDETAG:
        case COMPLEX_VECTOR_WIDETAG:
@@ -303,6 +304,9 @@ valid_dynamic_space_pointer(lispobj *pointer, lispobj *start_addr)
 #endif
        case SIMPLE_ARRAY_NIL_WIDETAG:
        case SIMPLE_BASE_STRING_WIDETAG:
+#ifdef SIMPLE_CHARACTER_STRING_WIDETAG
+       case SIMPLE_CHARACTER_STRING_WIDETAG:
+#endif
        case SIMPLE_BIT_VECTOR_WIDETAG:
        case SIMPLE_ARRAY_UNSIGNED_BYTE_2_WIDETAG:
        case SIMPLE_ARRAY_UNSIGNED_BYTE_4_WIDETAG:
@@ -914,6 +918,9 @@ ptrans_otherptr(lispobj thing, lispobj header, boolean constant)
       case COMPLEX_WIDETAG:
       case SIMPLE_ARRAY_WIDETAG:
       case COMPLEX_BASE_STRING_WIDETAG:
+#ifdef COMPLEX_CHARACTER_STRING_WIDETAG
+    case COMPLEX_CHARACTER_STRING_WIDETAG:
+#endif
       case COMPLEX_BIT_VECTOR_WIDETAG:
       case COMPLEX_VECTOR_NIL_WIDETAG:
       case COMPLEX_VECTOR_WIDETAG:
@@ -933,6 +940,11 @@ ptrans_otherptr(lispobj thing, lispobj header, boolean constant)
       case SIMPLE_BASE_STRING_WIDETAG:
         return ptrans_vector(thing, 8, 1, 0, constant);
 
+#ifdef SIMPLE_CHARACTER_STRING_WIDETAG
+    case SIMPLE_CHARACTER_STRING_WIDETAG:
+       return ptrans_vector(thing, 32, 1, 0, constant);
+#endif
+
       case SIMPLE_BIT_VECTOR_WIDETAG:
         return ptrans_vector(thing, 1, 0, 0, constant);
 
@@ -1151,22 +1163,29 @@ pscav(lispobj *addr, int nwords, boolean constant)
 
               case SIMPLE_BASE_STRING_WIDETAG:
                 vector = (struct vector *)addr;
-                count = CEILING(NWORDS(fixnum_value(vector->length)+1,4)+2,2);
+                count = CEILING(NWORDS(fixnum_value(vector->length)+1,8)+2,2);
                 break;
 
+#ifdef SIMPLE_CHARACTER_STRING_WIDETAG
+           case SIMPLE_CHARACTER_STRING_WIDETAG:
+               vector = (struct vector *)addr;
+               count = CEILING(NWORDS(fixnum_value(vector->length)+1,32)+2,2);
+               break;
+#endif
+
               case SIMPLE_BIT_VECTOR_WIDETAG:
                 vector = (struct vector *)addr;
-                count = CEILING(NWORDS(fixnum_value(vector->length),32)+2,2);
+                count = CEILING(NWORDS(fixnum_value(vector->length),1)+2,2);
                 break;
 
               case SIMPLE_ARRAY_UNSIGNED_BYTE_2_WIDETAG:
                 vector = (struct vector *)addr;
-                count = CEILING(NWORDS(fixnum_value(vector->length),16)+2,2);
+                count = CEILING(NWORDS(fixnum_value(vector->length),2)+2,2);
                 break;
 
               case SIMPLE_ARRAY_UNSIGNED_BYTE_4_WIDETAG:
                 vector = (struct vector *)addr;
-                count = CEILING(NWORDS(fixnum_value(vector->length),8)+2,2);
+                count = CEILING(NWORDS(fixnum_value(vector->length),4)+2,2);
                 break;
 
               case SIMPLE_ARRAY_UNSIGNED_BYTE_8_WIDETAG:
@@ -1175,7 +1194,7 @@ pscav(lispobj *addr, int nwords, boolean constant)
               case SIMPLE_ARRAY_UNSIGNED_BYTE_7_WIDETAG:
 #endif
                 vector = (struct vector *)addr;
-                count = CEILING(NWORDS(fixnum_value(vector->length),4)+2,2);
+                count = CEILING(NWORDS(fixnum_value(vector->length),8)+2,2);
                 break;
 
               case SIMPLE_ARRAY_UNSIGNED_BYTE_16_WIDETAG:
@@ -1184,7 +1203,7 @@ pscav(lispobj *addr, int nwords, boolean constant)
               case SIMPLE_ARRAY_UNSIGNED_BYTE_15_WIDETAG:
 #endif
                 vector = (struct vector *)addr;
-                count = CEILING(NWORDS(fixnum_value(vector->length),2)+2,2);
+                count = CEILING(NWORDS(fixnum_value(vector->length),16)+2,2);
                 break;
 
               case SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG:
@@ -1197,9 +1216,24 @@ pscav(lispobj *addr, int nwords, boolean constant)
               case SIMPLE_ARRAY_UNSIGNED_BYTE_31_WIDETAG:
 #endif
                 vector = (struct vector *)addr;
-                count = CEILING(fixnum_value(vector->length)+2,2);
+                count = CEILING(NWORDS(fixnum_value(vector->length),32)+2,2);
                 break;
 
+#if N_WORD_BITS == 64
+              case SIMPLE_ARRAY_UNSIGNED_BYTE_64_WIDETAG:
+#ifdef SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG
+              case SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG:
+              case SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG:
+#endif
+#ifdef SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG
+              case SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG:
+              case SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG:
+#endif
+                vector = (struct vector *)addr;
+                count = CEILING(NWORDS(fixnum_value(vector->length),64)+2,2);
+                break;
+#endif
+
               case SIMPLE_ARRAY_SINGLE_FLOAT_WIDETAG:
                 vector = (struct vector *)addr;
                 count = CEILING(fixnum_value(vector->length)+2,2);