#!+sb-doc
"Return a copy of STRUCTURE with the same (EQL) slot values."
(declare (type structure-object structure))
- (let* ((len (%instance-length structure))
- (res (%make-instance len))
- (layout (%instance-layout structure))
+ (let* ((layout (%instance-layout structure))
+ (res (%make-instance (%instance-length structure)))
+ (len (layout-length layout))
(nuntagged (layout-n-untagged-slots layout)))
(declare (type index len))
;; 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