X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-defstruct.lisp;h=f179459a85bd96ef77485f38bf886efa4146adca;hb=975f1932acc3a8e90fb31d2b055bfbdde78ea927;hp=2f462ef9f89baa3c00f5b87d3e4bd493900fe6d2;hpb=b6ed0e20d468099b62d27095db7d18f76d8886d2;p=sbcl.git diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index 2f462ef..f179459 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -31,15 +31,6 @@ (defun %instance-set (instance index new-value) (setf (%instance-ref instance index) new-value)) -(defun %instance-compare-and-swap (instance index old new) - #!+(or x86 x86-64) - (%instance-compare-and-swap instance index old new) - #!-(or x86 x86-64) - (let ((n-old (%instance-ref instance index))) - (when (eq old n-old) - (%instance-set instance index new)) - n-old)) - #!-hppa (progn (defun %raw-instance-ref/word (instance index) @@ -426,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