1.0.16.37: fix bug #206 -- SB-FLUID build works once more
[sbcl.git] / src / pcl / cache.lisp
index 3204dbe..e7f60e4 100644 (file)
         ;; Make a smaller one, then
         (make-cache :key-count key-count :value value :size (ceiling size 2)))))
 
+(defconstant n-fixnum-bits #.(integer-length most-positive-fixnum))
+
 ;;;; Copies and expands the cache, dropping any invalidated or
 ;;;; incomplete lines.
 (defun copy-and-expand-cache (cache layouts value)
                       ;; analysis...
                       (flet ((random-fixnum ()
                                (random (1+ most-positive-fixnum))))
-                        (let ((drops (random-fixnum)))
-                          (declare (fixnum drops))
+                        (let ((drops (random-fixnum))
+                              (drop-pos n-fixnum-bits))
+                          (declare (fixnum drops)
+                                   (type (integer 0 #.n-fixnum-bits) drop-pos))
                           (lambda (layouts value)
-                            (when (logbitp 0 drops)
+                            (when (logbitp (the unsigned-byte (decf drop-pos)) drops)
                               (try-update-cache copy layouts value))
-                            (when (zerop (ash drops -1))
-                              (setf drops (random-fixnum))))))
+                            (when (zerop drop-pos)
+                              (setf drops (random-fixnum)
+                                    drop-pos n-fixnum-bits)))))
                       (lambda (layouts value)
                         (unless (try-update-cache copy layouts value)
                           ;; Didn't fit -- expand the cache, or drop