X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-defstruct.lisp;h=f179459a85bd96ef77485f38bf886efa4146adca;hb=9fd95117be995b9e15a19aa182fafe4a489a4ac7;hp=176c4f54e70da10869673046bb41a072595ee19c;hpb=bfb19d306581ac86feb4371846c4b9953d692dd8;p=sbcl.git diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index 176c4f5..f179459 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -417,6 +417,31 @@ (%raw-instance-ref/word structure i))) res)) + + + +;; Do an EQUALP comparison on the raw slots (only, not the normal slots) of a +;; structure. +(defun raw-instance-slots-equalp (layout x y) + ;; This implementation sucks, but hopefully EQUALP on raw structures + ;; won't be a major bottleneck for anyone. It'd be tempting to do + ;; 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 + for dsd in (dd-slots (layout-info layout)) + for raw-type = (dsd-raw-type dsd) + for rsd = (when raw-type + (find raw-type + *raw-slot-data-list* + :key 'raw-slot-data-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)))))) ;;; default PRINT-OBJECT method