X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-hash-table.lisp;h=70d6ddbf362ca080cb13ecd465fc95849bd051a7;hb=69ef68ba7393e3492c1b4a756d1140f71c2922bc;hp=c28e640a305ed8220cf8665f39da84c1875babe1;hpb=084168e1524a6493bc0f9d1697753d31239b158d;p=sbcl.git diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index c28e640..70d6ddb 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -161,12 +161,14 @@ (length (almost-primify (max scaled-size (1+ +min-hash-table-size+)))) (index-vector (make-array length - :element-type '(unsigned-byte 32) + :element-type + '(unsigned-byte #.sb!vm:n-word-bits) :initial-element 0)) ;; needs to be the same length as the KV vector ;; (FIXME: really? why doesn't the code agree?) (next-vector (make-array size+1 - :element-type '(unsigned-byte 32))) + :element-type + '(unsigned-byte #.sb!vm:n-word-bits))) (kv-vector (make-array (* 2 size+1) :initial-element +empty-ht-slot+)) (table (%make-hash-table @@ -182,7 +184,7 @@ :next-vector next-vector :hash-vector (unless (eq test 'eq) (make-array size+1 - :element-type '(unsigned-byte 32) + :element-type '(unsigned-byte #.sb!vm:n-word-bits) :initial-element +magic-hash-vector-value+))))) (declare (type index size+1 scaled-size length)) ;; Set up the free list, all free. These lists are 0 terminated. @@ -246,18 +248,18 @@ (new-kv-vector (make-array (* 2 new-size) :initial-element +empty-ht-slot+)) (new-next-vector (make-array new-size - :element-type '(unsigned-byte 32) + :element-type '(unsigned-byte #.sb!vm:n-word-bits) :initial-element 0)) (new-hash-vector (when old-hash-vector (make-array new-size - :element-type '(unsigned-byte 32) + :element-type '(unsigned-byte #.sb!vm:n-word-bits) :initial-element +magic-hash-vector-value+))) (old-index-vector (hash-table-index-vector table)) (new-length (almost-primify (truncate (/ (float new-size) (hash-table-rehash-threshold table))))) (new-index-vector (make-array new-length - :element-type '(unsigned-byte 32) + :element-type '(unsigned-byte #.sb!vm:n-word-bits) :initial-element 0))) (declare (type index new-size new-length old-size)) @@ -597,21 +599,18 @@ #!+sb-doc "This removes all the entries from HASH-TABLE and returns the hash table itself." + (declare (optimize speed)) (let* ((kv-vector (hash-table-table hash-table)) - (kv-length (length kv-vector)) (next-vector (hash-table-next-vector hash-table)) (hash-vector (hash-table-hash-vector hash-table)) (size (length next-vector)) - (index-vector (hash-table-index-vector hash-table)) - (length (length index-vector))) + (index-vector (hash-table-index-vector hash-table))) ;; Disable GC tricks. (set-header-data kv-vector sb!vm:vector-normal-subtype) ;; Mark all slots as empty by setting all keys and values to magic ;; tag. - (do ((i 2 (1+ i))) - ((>= i kv-length)) - (setf (aref kv-vector i) +empty-ht-slot+)) (aver (eq (aref kv-vector 0) hash-table)) + (fill kv-vector +empty-ht-slot+ :start 2) ;; Set up the free list, all free. (do ((i 1 (1+ i))) ((>= i (1- size))) @@ -620,12 +619,10 @@ (setf (hash-table-next-free-kv hash-table) 1) (setf (hash-table-needing-rehash hash-table) 0) ;; Clear the index-vector. - (dotimes (i length) - (setf (aref index-vector i) 0)) + (fill index-vector 0) ;; Clear the hash-vector. (when hash-vector - (dotimes (i size) - (setf (aref hash-vector i) +magic-hash-vector-value+)))) + (fill hash-vector +magic-hash-vector-value+))) (setf (hash-table-number-entries hash-table) 0) hash-table)