X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-sxhash.lisp;h=c64ef1aa6193589c7fe86cb8956ec01dc7aa74f1;hb=9fd95117be995b9e15a19aa182fafe4a489a4ac7;hp=5ddbd212d3fbc5d5fc907ff31cdc81a68e72f17a;hpb=9109df608080457c2fb2437c7eb5b9af23fe6cf2;p=sbcl.git diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index 5ddbd21..c64ef1a 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -11,6 +11,15 @@ (in-package "SB!IMPL") +(eval-when (:compile-toplevel :load-toplevel :execute) + (defconstant max-hash sb!xc:most-positive-fixnum)) + +(deftype hash () + `(integer 0 ,max-hash)) + +(defun pointer-hash (key) + (pointer-hash key)) + ;;; the depthoid explored when calculating hash values ;;; ;;; "Depthoid" here is a sort of mixture of what Common Lisp ordinarily calls @@ -250,12 +259,13 @@ '(let ((result 572539)) (declare (type fixnum result)) (mixf result (length key)) - (dotimes (i (length key)) + (when (plusp depthoid) + (decf depthoid) + (dotimes (i (length key)) (declare (type fixnum i)) (mixf result - (psxhash (aref key i) - (- depthoid 1 i)))) - result)) + (psxhash (aref key i) depthoid)))) + result)) (make-dispatch (types) `(typecase key ,@(loop for type in types @@ -274,10 +284,11 @@ (declare (type fixnum result)) (dotimes (i (array-rank key)) (mixf result (array-dimension key i))) - (dotimes (i (array-total-size key)) - (mixf result - (psxhash (row-major-aref key i) - (- depthoid 1 i)))) + (when (plusp depthoid) + (decf depthoid) + (dotimes (i (array-total-size key)) + (mixf result + (psxhash (row-major-aref key i) depthoid)))) result)))) (defun structure-object-psxhash (key depthoid)