X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-sxhash.lisp;h=cbc226771e99e40e4632dfe870a24a574ccf1f9e;hb=3fe0010d2777b41e01ea9b4a0f894cfa40f7df1b;hp=38422a105c00dfdd61d212faa698565b51faf52c;hpb=59ac7389b0bead82dfe2c94a5edab79dc9569c61;p=sbcl.git diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index 38422a1..cbc2267 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -89,28 +89,20 @@ (declare (optimize (speed 3) (safety 0))) (declare (type string string)) (declare (type index count)) - (let ((result 0)) - (declare (type (unsigned-byte 32) result)) - (unless (typep string '(vector nil)) - (dotimes (i count) - (declare (type index i)) - (setf result - (ldb (byte 32 0) - (+ result (char-code (aref string i))))) - (setf result - (ldb (byte 32 0) - (+ result (ash result 10)))) - (setf result - (logxor result (ash result -6))))) - (setf result - (ldb (byte 32 0) - (+ result (ash result 3)))) - (setf result - (logxor result (ash result -11))) - (setf result - (ldb (byte 32 0) - (logxor result (ash result 15)))) - (logand result most-positive-fixnum))) + (macrolet ((set-result (form) + `(setf result (ldb (byte #.sb!vm:n-word-bits 0) ,form)))) + (let ((result 0)) + (declare (type (unsigned-byte #.sb!vm:n-word-bits) result)) + (unless (typep string '(vector nil)) + (dotimes (i count) + (declare (type index i)) + (set-result (+ result (char-code (aref string i)))) + (set-result (+ result (ash result 10))) + (set-result (logxor result (ash result -6))))) + (set-result (+ result (ash result 3))) + (set-result (logxor result (ash result -11))) + (set-result (logxor result (ash result 15))) + (logand result most-positive-fixnum)))) ;;; test: ;;; (let ((ht (make-hash-table :test 'equal))) ;;; (do-all-symbols (symbol) @@ -172,7 +164,7 @@ (mixf result (sxhash-number (realpart x))) (mixf result (sxhash-number (imagpart x))) result)))) - (sxhash-recurse (x &optional (depthoid +max-hash-depthoid+)) + (sxhash-recurse (x depthoid) (declare (type index depthoid)) (typecase x ;; we test for LIST here, rather than CONS, because the @@ -217,7 +209,7 @@ (number (sxhash-number x)) (generic-function (sxhash-instance x)) (t 42)))) - (sxhash-recurse x))) + (sxhash-recurse x +max-hash-depthoid+))) ;;;; the PSXHASH function @@ -297,13 +289,16 @@ (name (classoid-name classoid)) (result (mix (sxhash name) (the fixnum 79867)))) (declare (type fixnum result)) - (dotimes (i (min depthoid (1- length))) + (dotimes (i (min depthoid (- length 1 (layout-n-untagged-slots layout)))) (declare (type fixnum i)) (let ((j (1+ i))) ; skipping slot #0, which is for LAYOUT (declare (type fixnum j)) (mixf result (psxhash (%instance-ref key j) (1- depthoid))))) + ;; KLUDGE: Should hash untagged slots, too. (Although +max-hash-depthoid+ + ;; is pretty low currently, so they might not make it into the hash + ;; value anyway.) result)) (defun list-psxhash (key depthoid)