Fix EQUALP on structures with raw slots.
[sbcl.git] / src / code / target-defstruct.lisp
index 89ced39..f397731 100644 (file)
   ;; all this with %RAW-INSTANCE-REF/WORD and bitwise comparisons, but
   ;; that'll fail in some cases. For example -0.0 and 0.0 are EQUALP
   ;; but have different bit patterns. -- JES, 2007-08-21
-  (loop with i = -1
+  (loop with i = 0
         for dsd in (dd-slots (layout-info layout))
         for raw-type = (dsd-raw-type dsd)
         for rsd = (when raw-type
         for accessor = (when rsd
                          (raw-slot-data-accessor-name rsd))
         always (or (not accessor)
-                   (progn
-                     (incf i)
-                     (equalp (funcall accessor x i)
-                             (funcall accessor y i))))))
+                   (prog1
+                       (equalp (funcall accessor x i)
+                               (funcall accessor y i))
+                     (incf i (raw-slot-data-n-words rsd))))))
 \f
 ;;; default PRINT-OBJECT method