Re: [Sbcl-commits] master: Fix adaptive equal hash tables

Gábor Melis <[email protected]>
Newsgroups gmane.lisp.steel-bank.devel
Message-ID <CADJFn4Vz2sGrtsqbTtmOYbmoi9C7f3o_yr9Y84WLvSoDYzy9Tw@mail.gmail.com>
I pushed a quick fix. It compiles and runs the tests now on x86. There are
a few warts (also related to weak hash tables) that I ran into while
investigating. Those will be addressed later.


On Mon, 8 Dec 2025 at 14:18, Stas Boukarev <[email protected]> wrote:

> That didn't fix the fixnum issue.
>
> On Mon, Dec 8, 2025 at 3:45 PM melisgl via Sbcl-commits
> <[email protected]> wrote:
> >
> > The branch "master" has been updated in SBCL:
> >        via  393fd97d93dbb805e0477c6d417aa2cf454d9605 (commit)
> >       from  018143647fdd3acd3ab67d7a981db8bc9ee774b7 (commit)
> >
> > - Log -----------------------------------------------------------------
> > commit 393fd97d93dbb805e0477c6d417aa2cf454d9605
> > Author: Gabor Melis <[email protected]>
> > Date:   Mon Dec 8 13:32:04 2025 +0100
> >
> >     Fix adaptive equal hash tables
> >
> >     ADAPTIVE-EQUAL-HASH was called with a single argument, and the second
> >     argument (the state) got garbage.
> > ---
> >  src/code/hash-table.lisp        |  6 +++---
> >  src/code/target-hash-table.lisp | 22 +++++++++++-----------
> >  2 files changed, 14 insertions(+), 14 deletions(-)
> >
> > diff --git a/src/code/hash-table.lisp b/src/code/hash-table.lisp
> > index 385b6f6c1..f98fd691b 100644
> > --- a/src/code/hash-table.lisp
> > +++ b/src/code/hash-table.lisp
> > @@ -81,14 +81,14 @@
> >    (puthash-impl #'error :type (sfunction * t))
> >    (remhash-impl #'error :type (sfunction * t))
> >    ;; If non-negative, this gets passed to HASH-TABLE-HASH-FUN as its
> > -  ;; second argument (see HASH-KEY and HT-HASH-SETUP). For a given
> > +  ;; second argument (see REHASH-KEY and HT-HASH-SETUP). For a given
> >    ;; HASH-TABLE-TEST, the same HASH-FUN-STATE cannot be an argument
> >    ;; for the different HASH-FUNs. Thus, it completely identifies the
> >    ;; hash function. It may be changed during the lifetime of the hash
> >    ;; table, which allows us to do adaptive hashing.
> >    (%hash-fun-state 0
> > -   ;; HASH-FUN-STATE easily fits into a fixnum, but having it unboxed
> > -   ;; as a signed word allows EQ-HASH/SMALL in EQ-HASH/COMMON to be
> > +   ;; HASH-FUN-STATE fits into a fixnum, but having it unboxed as a
> > +   ;; signed word allows EQ-HASH/SMALL in EQ-HASH/COMMON to be
> >     ;; compiled a bit more tightly.
> >     :type sb-vm:signed-word)
> >    ;; The Key-Value pair vector.
> > diff --git a/src/code/target-hash-table.lisp
> b/src/code/target-hash-table.lisp
> > index 365ab9795..6189a9ad1 100644
> > --- a/src/code/target-hash-table.lisp
> > +++ b/src/code/target-hash-table.lisp
> > @@ -138,6 +138,10 @@
> >    ;; is (UNSIGNED-BYTE 32).
> >    '(unsigned-byte #.(the (integer 0 32) (1+ +max-hash-table-bits+))))
> >
> > +(declaim (inline adaptive-hash-fun-state-p))
> > +(defun adaptive-hash-fun-state-p (state)
> > +  (<= 0 state))
> > +
> >  ;;; Hash KEY again after a hash function change. This is like
> >  ;;; HASH-KEY, but it's not inline, and it does not return
> >  ;;; ADDRESS-BASED-P because we assume that hash function changes
> > @@ -149,7 +153,7 @@
> >             (optimize (safety 0)))
> >    (let ((hash-fun (hash-table-hash-fun hash-table)))
> >      (the maybe-truncated-hash
> > -         (values (if (<= 0 hash-fun-state)
> > +         (values (if (adaptive-hash-fun-state-p hash-fun-state)
> >                       (funcall hash-fun key hash-fun-state)
> >                       (funcall hash-fun key))))))
> >
> > @@ -2036,6 +2040,7 @@ if there is no such entry. Entries can be added
> using SETF."
> >
> >    (defun ht-hash-setup (hash-fun-name stateful-hash-p)
> >      (cond ((null hash-fun-name)
> > +           (aver (not stateful-hash-p))
> >             '((hash (clip-hash (the fixnum
> >                                 (funcall (hash-table-hash-fun
> hash-table) key))))
> >               (address-based-p nil)))
> > @@ -2448,16 +2453,11 @@ nnnn 1_    any       linear scan (don't try to
> read when rehash already in progr
> >  (defmacro with-weak-hash-table-entry (&body body)
> >    `(with-pinned-objects (key)
> >       (binding* (((hash0 address-sensitive-p)
> > -                 ;; I'm pretty sure this is not how this code is
> supposed to look,
> > -                 ;; but it worked for me.
> > -                 (if (eq (hash-table-hash-fun hash-table)
> #'adaptive-equal-hash)
> > -                     (funcall (hash-table-hash-fun hash-table) key
> > -                              #+64-bit (hash-table-hash-fun-state
> hash-table)
> > -                              ;; adaptive-equal-hash says (truly-the
> fixnum sxstate) though the
> > -                              ;; slot's initial value is something like
> #x3999BA85 which accords
> > -                              ;; with its declared type of
> sb-vm:signed-word, but is non-fixnum.
> > -                              #-64-bit 0)
> > -                     (funcall (hash-table-hash-fun hash-table) key)))
> > +                 (let ((hash-fun (hash-table-hash-fun hash-table))
> > +                       (hash-fun-state (hash-table-hash-fun-state
> hash-table)))
> > +                   (if (adaptive-hash-fun-state-p hash-fun-state)
> > +                       (funcall hash-fun key hash-fun-state)
> > +                       (funcall hash-fun key))))
> >                  (address-sensitive-p
> >                   (and address-sensitive-p
> >                        (not (logtest (hash-table-flags hash-table)
> hash-table-userfun-flag))))
> >
> > -----------------------------------------------------------------------
> >
> >
> > hooks/post-receive
> > --
> > SBCL
> >
> >
> > _______________________________________________
> > Sbcl-commits mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/sbcl-commits
>

_______________________________________________
Sbcl-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sbcl-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.