GNU bug report logs - #56255
28.1.50; sxhash-equal does not change when object is modified

Previous Next

Package: emacs;

Reported by: Ihor Radchenko <yantar92 <at> gmail.com>

Date: Mon, 27 Jun 2022 12:27:02 UTC

Severity: normal

Found in version 28.1.50

Fixed in version 29.1

Done: Lars Ingebrigtsen <larsi <at> gnus.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 56255 in the body.
You can then email your comments to 56255 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Mon, 27 Jun 2022 12:27:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Ihor Radchenko <yantar92 <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Mon, 27 Jun 2022 12:27:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Ihor Radchenko <yantar92 <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 28.1.50; sxhash-equal does not change when object is modified
Date: Mon, 27 Jun 2022 20:27:09 +0800
Hi,

I just stumbled upon an unexpected behavior of sxhash-equal.

According to its docstring:

sxhash-equal is a function defined in fns.c.

Documentation
Return an integer hash code for OBJ suitable for equal.

If (equal A B), then (= (sxhash-equal A) (sxhash-equal B)).

So, if A is changed, I expect (sxhash-equal A) to change as well.

Now, consider the following code:

(setq a (avl-tree--create #'org-element--cache-compare))
(avl-tree-enter a '(headline (:begin 2)))
(avl-tree-enter a '(headline (:begin 4)))
(sxhash-equal a) ;; some value
(plist-put (nth 1 (avl-tree-first a)) :begin 10)
(sxhash-equal a) ;; the value does not change!

The result of sxhash-equal does not change despite `a' object being
changed.

Best,
Ihor

In GNU Emacs 28.1.50 (build 1, x86_64-pc-linux-gnu, cairo version 1.16.0)
 of 2022-05-26 built on localhost
Repository revision: a9f17ccce336ad5d384a6271f205a84141980019
Repository branch: emacs-28
Windowing system distributor 'The X.Org Foundation', version 11.0.12101003
System Description: Gentoo Linux

Configured using:
 'configure --prefix=/usr --build=x86_64-pc-linux-gnu
 --host=x86_64-pc-linux-gnu --mandir=/usr/share/man
 --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc
 --localstatedir=/var/lib --datarootdir=/usr/share
 --disable-silent-rules --docdir=/usr/share/doc/emacs-28.1.9999
 --htmldir=/usr/share/doc/emacs-28.1.9999/html --libdir=/usr/lib64
 --program-suffix=-emacs-28-vcs --includedir=/usr/include/emacs-28-vcs
 --infodir=/usr/share/info/emacs-28-vcs --localstatedir=/var
 --enable-locallisppath=/etc/emacs:/usr/share/emacs/site-lisp
 --without-compress-install --without-hesiod --without-pop
 --with-file-notification=inotify --with-pdumper --enable-acl
 --with-dbus --with-modules --without-gameuser --with-libgmp
 --without-gpm --with-native-compilation --with-json --without-kerberos
 --without-kerberos5 --without-lcms2 --with-xml2 --without-mailutils
 --with-selinux --with-gnutls --without-libsystemd --with-threads
 --with-wide-int --with-zlib --with-sound=oss --with-x --without-ns
 --without-gconf --without-gsettings --without-toolkit-scroll-bars
 --with-gif --with-jpeg --with-png --with-rsvg --with-tiff --with-xpm
 --with-imagemagick --with-xft --with-cairo --with-harfbuzz
 --without-libotf --without-m17n-flt --with-x-toolkit=no
 --with-dumping=pdumper 'CFLAGS=-march=native -O3 -pipe'
 'LDFLAGS=-Wl,-O1 -Wl,--as-needed''

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS HARFBUZZ IMAGEMAGICK JPEG
JSON LIBSELINUX LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY OLDXMENU
PDUMPER PNG RSVG SECCOMP SOUND THREADS TIFF X11 XDBE XIM XPM ZLIB

Important settings:
  value of $LC_COLLATE: C
  value of $LANG: en_US.utf8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  pyvenv-mode: t
  git-email-notmuch-mode: t
  git-email-piem-mode: t
  piem-notmuch-mode: t
  org-edna-mode: t
  eros-mode: t
  pdf-occur-global-minor-mode: t
  which-key-mode: t
  diredfl-global-mode: t
  winner-mode: t
  eval-sexp-fu-flash-mode: t
  global-flycheck-mode: t
  flycheck-mode: t
  el-patch-use-package-mode: t
  global-git-commit-mode: t
  magit-auto-revert-mode: t
  recentf-mode: t
  hl-todo-mode: t
  pretty-symbols-mode: t
  company-mode: t
  persistent-scratch-autosave-mode: t
  savehist-mode: t
  helm-adaptive-mode: t
  helm-mode: t
  helm-minibuffer-history-mode: t
  helm-ff-icon-mode: t
  shell-dirtrack-mode: t
  helm--remap-mouse-mode: t
  async-bytecomp-package-mode: t
  boon-mode: t
  boon-local-mode: t
  global-hl-line-mode: t
  global-page-break-lines-mode: t
  page-break-lines-mode: t
  shackle-mode: t
  override-global-mode: t
  straight-use-package-mode: t
  straight-package-neutering-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  global-prettify-symbols-mode: t
  prettify-symbols-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  window-divider-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t
  abbrev-mode: t

Load-path shadows:
/usr/share/emacs/site-lisp/cmake-mode hides /usr/share/emacs/site-lisp/cmake/cmake-mode
/home/yantar92/.emacs.d/straight/build/dash/dash hides /usr/share/emacs/site-lisp/dash/dash
/usr/share/emacs/site-lisp/desktop-entry-mode hides /usr/share/emacs/site-lisp/desktop-file-utils/desktop-entry-mode
/home/yantar92/.emacs.d/straight/build/f/f hides /usr/share/emacs/site-lisp/f/f
/home/yantar92/.emacs.d/straight/build/s/s hides /usr/share/emacs/site-lisp/s/s
/home/yantar92/.emacs.d/straight/build/with-editor/with-editor hides /usr/share/emacs/site-lisp/with-editor/with-editor
/home/yantar92/.emacs.d/straight/build/transient/transient hides /usr/share/emacs/28.1.50/lisp/transient
/home/yantar92/.emacs.d/straight/build/project/project hides /usr/share/emacs/28.1.50/lisp/progmodes/project
/home/yantar92/.emacs.d/straight/build/xref/xref hides /usr/share/emacs/28.1.50/lisp/progmodes/xref
/home/yantar92/.emacs.d/straight/build/org/ob-C hides /usr/share/emacs/28.1.50/lisp/org/ob-C
/home/yantar92/.emacs.d/straight/build/org/ob-R hides /usr/share/emacs/28.1.50/lisp/org/ob-R
/home/yantar92/.emacs.d/straight/build/org/ob-awk hides /usr/share/emacs/28.1.50/lisp/org/ob-awk
/home/yantar92/.emacs.d/straight/build/org/ob-calc hides /usr/share/emacs/28.1.50/lisp/org/ob-calc
/home/yantar92/.emacs.d/straight/build/org/ob-clojure hides /usr/share/emacs/28.1.50/lisp/org/ob-clojure
/home/yantar92/.emacs.d/straight/build/org/ob-comint hides /usr/share/emacs/28.1.50/lisp/org/ob-comint
/home/yantar92/.emacs.d/straight/build/org/ob-core hides /usr/share/emacs/28.1.50/lisp/org/ob-core
/home/yantar92/.emacs.d/straight/build/org/ob-css hides /usr/share/emacs/28.1.50/lisp/org/ob-css
/home/yantar92/.emacs.d/straight/build/org/ob-ditaa hides /usr/share/emacs/28.1.50/lisp/org/ob-ditaa
/home/yantar92/.emacs.d/straight/build/org/ob-dot hides /usr/share/emacs/28.1.50/lisp/org/ob-dot
/home/yantar92/.emacs.d/straight/build/org/ob-emacs-lisp hides /usr/share/emacs/28.1.50/lisp/org/ob-emacs-lisp
/home/yantar92/.emacs.d/straight/build/org/ob-eshell hides /usr/share/emacs/28.1.50/lisp/org/ob-eshell
/home/yantar92/.emacs.d/straight/build/org/ob-eval hides /usr/share/emacs/28.1.50/lisp/org/ob-eval
/home/yantar92/.emacs.d/straight/build/org/ob-exp hides /usr/share/emacs/28.1.50/lisp/org/ob-exp
/home/yantar92/.emacs.d/straight/build/org/ob-forth hides /usr/share/emacs/28.1.50/lisp/org/ob-forth
/home/yantar92/.emacs.d/straight/build/org/ob-fortran hides /usr/share/emacs/28.1.50/lisp/org/ob-fortran
/home/yantar92/.emacs.d/straight/build/org/ob-gnuplot hides /usr/share/emacs/28.1.50/lisp/org/ob-gnuplot
/home/yantar92/.emacs.d/straight/build/org/ob-groovy hides /usr/share/emacs/28.1.50/lisp/org/ob-groovy
/home/yantar92/.emacs.d/straight/build/org/ob-haskell hides /usr/share/emacs/28.1.50/lisp/org/ob-haskell
/home/yantar92/.emacs.d/straight/build/org/ob-java hides /usr/share/emacs/28.1.50/lisp/org/ob-java
/home/yantar92/.emacs.d/straight/build/org/ob-js hides /usr/share/emacs/28.1.50/lisp/org/ob-js
/home/yantar92/.emacs.d/straight/build/org/ob-julia hides /usr/share/emacs/28.1.50/lisp/org/ob-julia
/home/yantar92/.emacs.d/straight/build/org/ob-latex hides /usr/share/emacs/28.1.50/lisp/org/ob-latex
/home/yantar92/.emacs.d/straight/build/org/ob-lilypond hides /usr/share/emacs/28.1.50/lisp/org/ob-lilypond
/home/yantar92/.emacs.d/straight/build/org/ob-lisp hides /usr/share/emacs/28.1.50/lisp/org/ob-lisp
/home/yantar92/.emacs.d/straight/build/org/ob-lob hides /usr/share/emacs/28.1.50/lisp/org/ob-lob
/home/yantar92/.emacs.d/straight/build/org/ob-lua hides /usr/share/emacs/28.1.50/lisp/org/ob-lua
/home/yantar92/.emacs.d/straight/build/org/ob-makefile hides /usr/share/emacs/28.1.50/lisp/org/ob-makefile
/home/yantar92/.emacs.d/straight/build/org/ob-matlab hides /usr/share/emacs/28.1.50/lisp/org/ob-matlab
/home/yantar92/.emacs.d/straight/build/org/ob-maxima hides /usr/share/emacs/28.1.50/lisp/org/ob-maxima
/home/yantar92/.emacs.d/straight/build/org/ob-ocaml hides /usr/share/emacs/28.1.50/lisp/org/ob-ocaml
/home/yantar92/.emacs.d/straight/build/org/ob-octave hides /usr/share/emacs/28.1.50/lisp/org/ob-octave
/home/yantar92/.emacs.d/straight/build/org/ob-org hides /usr/share/emacs/28.1.50/lisp/org/ob-org
/home/yantar92/.emacs.d/straight/build/org/ob-perl hides /usr/share/emacs/28.1.50/lisp/org/ob-perl
/home/yantar92/.emacs.d/straight/build/org/ob-plantuml hides /usr/share/emacs/28.1.50/lisp/org/ob-plantuml
/home/yantar92/.emacs.d/straight/build/org/ob-processing hides /usr/share/emacs/28.1.50/lisp/org/ob-processing
/home/yantar92/.emacs.d/straight/build/org/ob-python hides /usr/share/emacs/28.1.50/lisp/org/ob-python
/home/yantar92/.emacs.d/straight/build/org/ob-ref hides /usr/share/emacs/28.1.50/lisp/org/ob-ref
/home/yantar92/.emacs.d/straight/build/org/ob-ruby hides /usr/share/emacs/28.1.50/lisp/org/ob-ruby
/home/yantar92/.emacs.d/straight/build/org/ob-sass hides /usr/share/emacs/28.1.50/lisp/org/ob-sass
/home/yantar92/.emacs.d/straight/build/org/ob-scheme hides /usr/share/emacs/28.1.50/lisp/org/ob-scheme
/home/yantar92/.emacs.d/straight/build/org/ob-screen hides /usr/share/emacs/28.1.50/lisp/org/ob-screen
/home/yantar92/.emacs.d/straight/build/org/ob-sed hides /usr/share/emacs/28.1.50/lisp/org/ob-sed
/home/yantar92/.emacs.d/straight/build/org/ob-shell hides /usr/share/emacs/28.1.50/lisp/org/ob-shell
/home/yantar92/.emacs.d/straight/build/org/ob-sql hides /usr/share/emacs/28.1.50/lisp/org/ob-sql
/home/yantar92/.emacs.d/straight/build/org/ob-sqlite hides /usr/share/emacs/28.1.50/lisp/org/ob-sqlite
/home/yantar92/.emacs.d/straight/build/org/ob-table hides /usr/share/emacs/28.1.50/lisp/org/ob-table
/home/yantar92/.emacs.d/straight/build/org/ob-tangle hides /usr/share/emacs/28.1.50/lisp/org/ob-tangle
/home/yantar92/.emacs.d/straight/build/org/ob hides /usr/share/emacs/28.1.50/lisp/org/ob
/home/yantar92/.emacs.d/straight/build/org/oc-basic hides /usr/share/emacs/28.1.50/lisp/org/oc-basic
/home/yantar92/.emacs.d/straight/build/org/oc-biblatex hides /usr/share/emacs/28.1.50/lisp/org/oc-biblatex
/home/yantar92/.emacs.d/straight/build/org/oc-csl hides /usr/share/emacs/28.1.50/lisp/org/oc-csl
/home/yantar92/.emacs.d/straight/build/org/oc-natbib hides /usr/share/emacs/28.1.50/lisp/org/oc-natbib
/home/yantar92/.emacs.d/straight/build/org/oc hides /usr/share/emacs/28.1.50/lisp/org/oc
/home/yantar92/.emacs.d/straight/build/org/ol-bbdb hides /usr/share/emacs/28.1.50/lisp/org/ol-bbdb
/home/yantar92/.emacs.d/straight/build/org/ol-bibtex hides /usr/share/emacs/28.1.50/lisp/org/ol-bibtex
/home/yantar92/.emacs.d/straight/build/org/ol-docview hides /usr/share/emacs/28.1.50/lisp/org/ol-docview
/home/yantar92/.emacs.d/straight/build/org/ol-doi hides /usr/share/emacs/28.1.50/lisp/org/ol-doi
/home/yantar92/.emacs.d/straight/build/org/ol-eshell hides /usr/share/emacs/28.1.50/lisp/org/ol-eshell
/home/yantar92/.emacs.d/straight/build/org/ol-eww hides /usr/share/emacs/28.1.50/lisp/org/ol-eww
/home/yantar92/.emacs.d/straight/build/org/ol-gnus hides /usr/share/emacs/28.1.50/lisp/org/ol-gnus
/home/yantar92/.emacs.d/straight/build/org/ol-info hides /usr/share/emacs/28.1.50/lisp/org/ol-info
/home/yantar92/.emacs.d/straight/build/org/ol-irc hides /usr/share/emacs/28.1.50/lisp/org/ol-irc
/home/yantar92/.emacs.d/straight/build/org/ol-man hides /usr/share/emacs/28.1.50/lisp/org/ol-man
/home/yantar92/.emacs.d/straight/build/org/ol-mhe hides /usr/share/emacs/28.1.50/lisp/org/ol-mhe
/home/yantar92/.emacs.d/straight/build/org/ol-rmail hides /usr/share/emacs/28.1.50/lisp/org/ol-rmail
/home/yantar92/.emacs.d/straight/build/org/ol-w3m hides /usr/share/emacs/28.1.50/lisp/org/ol-w3m
/home/yantar92/.emacs.d/straight/build/org/ol hides /usr/share/emacs/28.1.50/lisp/org/ol
/home/yantar92/.emacs.d/straight/build/org/org-agenda hides /usr/share/emacs/28.1.50/lisp/org/org-agenda
/home/yantar92/.emacs.d/straight/build/org/org-archive hides /usr/share/emacs/28.1.50/lisp/org/org-archive
/home/yantar92/.emacs.d/straight/build/org/org-attach-git hides /usr/share/emacs/28.1.50/lisp/org/org-attach-git
/home/yantar92/.emacs.d/straight/build/org/org-attach hides /usr/share/emacs/28.1.50/lisp/org/org-attach
/home/yantar92/.emacs.d/straight/build/org/org-capture hides /usr/share/emacs/28.1.50/lisp/org/org-capture
/home/yantar92/.emacs.d/straight/build/org/org-clock hides /usr/share/emacs/28.1.50/lisp/org/org-clock
/home/yantar92/.emacs.d/straight/build/org/org-colview hides /usr/share/emacs/28.1.50/lisp/org/org-colview
/home/yantar92/.emacs.d/straight/build/org/org-compat hides /usr/share/emacs/28.1.50/lisp/org/org-compat
/home/yantar92/.emacs.d/straight/build/org/org-crypt hides /usr/share/emacs/28.1.50/lisp/org/org-crypt
/home/yantar92/.emacs.d/straight/build/org/org-ctags hides /usr/share/emacs/28.1.50/lisp/org/org-ctags
/home/yantar92/.emacs.d/straight/build/org/org-datetree hides /usr/share/emacs/28.1.50/lisp/org/org-datetree
/home/yantar92/.emacs.d/straight/build/org/org-duration hides /usr/share/emacs/28.1.50/lisp/org/org-duration
/home/yantar92/.emacs.d/straight/build/org/org-element hides /usr/share/emacs/28.1.50/lisp/org/org-element
/home/yantar92/.emacs.d/straight/build/org/org-entities hides /usr/share/emacs/28.1.50/lisp/org/org-entities
/home/yantar92/.emacs.d/straight/build/org/org-faces hides /usr/share/emacs/28.1.50/lisp/org/org-faces
/home/yantar92/.emacs.d/straight/build/org/org-feed hides /usr/share/emacs/28.1.50/lisp/org/org-feed
/home/yantar92/.emacs.d/straight/build/org/org-footnote hides /usr/share/emacs/28.1.50/lisp/org/org-footnote
/home/yantar92/.emacs.d/straight/build/org/org-goto hides /usr/share/emacs/28.1.50/lisp/org/org-goto
/home/yantar92/.emacs.d/straight/build/org/org-habit hides /usr/share/emacs/28.1.50/lisp/org/org-habit
/home/yantar92/.emacs.d/straight/build/org/org-id hides /usr/share/emacs/28.1.50/lisp/org/org-id
/home/yantar92/.emacs.d/straight/build/org/org-indent hides /usr/share/emacs/28.1.50/lisp/org/org-indent
/home/yantar92/.emacs.d/straight/build/org/org-inlinetask hides /usr/share/emacs/28.1.50/lisp/org/org-inlinetask
/home/yantar92/.emacs.d/straight/build/org/org-install hides /usr/share/emacs/28.1.50/lisp/org/org-install
/home/yantar92/.emacs.d/straight/build/org/org-keys hides /usr/share/emacs/28.1.50/lisp/org/org-keys
/home/yantar92/.emacs.d/straight/build/org/org-lint hides /usr/share/emacs/28.1.50/lisp/org/org-lint
/home/yantar92/.emacs.d/straight/build/org/org-list hides /usr/share/emacs/28.1.50/lisp/org/org-list
/home/yantar92/.emacs.d/straight/build/org/org-macro hides /usr/share/emacs/28.1.50/lisp/org/org-macro
/home/yantar92/.emacs.d/straight/build/org/org-macs hides /usr/share/emacs/28.1.50/lisp/org/org-macs
/home/yantar92/.emacs.d/straight/build/org/org-mobile hides /usr/share/emacs/28.1.50/lisp/org/org-mobile
/home/yantar92/.emacs.d/straight/build/org/org-mouse hides /usr/share/emacs/28.1.50/lisp/org/org-mouse
/home/yantar92/.emacs.d/straight/build/org/org-num hides /usr/share/emacs/28.1.50/lisp/org/org-num
/home/yantar92/.emacs.d/straight/build/org/org-pcomplete hides /usr/share/emacs/28.1.50/lisp/org/org-pcomplete
/home/yantar92/.emacs.d/straight/build/org/org-plot hides /usr/share/emacs/28.1.50/lisp/org/org-plot
/home/yantar92/.emacs.d/straight/build/org/org-protocol hides /usr/share/emacs/28.1.50/lisp/org/org-protocol
/home/yantar92/.emacs.d/straight/build/org/org-refile hides /usr/share/emacs/28.1.50/lisp/org/org-refile
/home/yantar92/.emacs.d/straight/build/org/org-src hides /usr/share/emacs/28.1.50/lisp/org/org-src
/home/yantar92/.emacs.d/straight/build/org/org-table hides /usr/share/emacs/28.1.50/lisp/org/org-table
/home/yantar92/.emacs.d/straight/build/org/org-tempo hides /usr/share/emacs/28.1.50/lisp/org/org-tempo
/home/yantar92/.emacs.d/straight/build/org/org-timer hides /usr/share/emacs/28.1.50/lisp/org/org-timer
/home/yantar92/.emacs.d/straight/build/org/org-version hides /usr/share/emacs/28.1.50/lisp/org/org-version
/home/yantar92/.emacs.d/straight/build/org/org hides /usr/share/emacs/28.1.50/lisp/org/org
/home/yantar92/.emacs.d/straight/build/org/ox-ascii hides /usr/share/emacs/28.1.50/lisp/org/ox-ascii
/home/yantar92/.emacs.d/straight/build/org/ox-beamer hides /usr/share/emacs/28.1.50/lisp/org/ox-beamer
/home/yantar92/.emacs.d/straight/build/org/ox-html hides /usr/share/emacs/28.1.50/lisp/org/ox-html
/home/yantar92/.emacs.d/straight/build/org/ox-icalendar hides /usr/share/emacs/28.1.50/lisp/org/ox-icalendar
/home/yantar92/.emacs.d/straight/build/org/ox-koma-letter hides /usr/share/emacs/28.1.50/lisp/org/ox-koma-letter
/home/yantar92/.emacs.d/straight/build/org/ox-latex hides /usr/share/emacs/28.1.50/lisp/org/ox-latex
/home/yantar92/.emacs.d/straight/build/org/ox-man hides /usr/share/emacs/28.1.50/lisp/org/ox-man
/home/yantar92/.emacs.d/straight/build/org/ox-md hides /usr/share/emacs/28.1.50/lisp/org/ox-md
/home/yantar92/.emacs.d/straight/build/org/ox-odt hides /usr/share/emacs/28.1.50/lisp/org/ox-odt
/home/yantar92/.emacs.d/straight/build/org/ox-org hides /usr/share/emacs/28.1.50/lisp/org/ox-org
/home/yantar92/.emacs.d/straight/build/org/ox-publish hides /usr/share/emacs/28.1.50/lisp/org/ox-publish
/home/yantar92/.emacs.d/straight/build/org/ox-texinfo hides /usr/share/emacs/28.1.50/lisp/org/ox-texinfo
/home/yantar92/.emacs.d/straight/build/org/ox hides /usr/share/emacs/28.1.50/lisp/org/ox
/home/yantar92/.emacs.d/straight/build/org/org-loaddefs hides /usr/share/emacs/28.1.50/lisp/org/org-loaddefs
/home/yantar92/.emacs.d/straight/build/let-alist/let-alist hides /usr/share/emacs/28.1.50/lisp/emacs-lisp/let-alist
/home/yantar92/.emacs.d/straight/build/map/map hides /usr/share/emacs/28.1.50/lisp/emacs-lisp/map

Features:
(shadow sort footnote emacsbug sendmail helm-imenu cus-start macrostep-c
cmacexp boon-main boon-hl boon-arguments multiple-cursors
mc-separate-operations rectangular-region-mode mc-mark-pop mc-edit-lines
mc-hide-unmatched-lines-mode mc-mark-more mc-cycle-cursors
multiple-cursors-core boon-regs mule-util boon-moves boon-utils
er-basic-expansions expand-region-core expand-region-custom vc ffap
org-table-sticky-header cl-print oc-basic helm-command helm-elisp
helm-eval tramp-archive tramp-gvfs helm-x-files helm-for-files
helm-bookmark helm-external helm-net highlight-indentation flymake-proc
flymake elpy elpy-rpc pyvenv eshell esh-cmd esh-ext esh-opt esh-proc
esh-io esh-arg esh-module esh-groups esh-util elpy-shell elpy-profile
elpy-django elpy-refactor grep scimax-jupyter ob-jupyter jupyter-tramp
tramp-cache jupyter-server jupyter-server-ioloop jupyter-ioloop-comm
jupyter-ioloop zmq zmq-core jupyter-rest-api jupyter-org-extensions
jupyter-org-client git-email-magit magit-patch git-email-notmuch
git-email-piem git-email git-email-autoloads project-autoloads
xref-autoloads piem-notmuch piem piem-maildir mail-extr piem-autoloads
org-crypt helm-notmuch helm-notmuch-autoloads ol-notmuch org-eldoc
org-table-sticky-header-autoloads posframe posframe-autoloads ob-async
ob-async-autoloads ob-latex ob-dot ob-calc calc-store calc-trail
ob-gnuplot ob-ditaa ob-C cc-mode cc-fonts cc-guess cc-menus cc-cmds
cc-styles cc-align cc-engine cc-vars cc-defs ob-python ob-perl ob-org
ob-shell ob-mathematica org-tempo tempo org-archive ox-md ox-beamer
engrave-faces engrave-faces-autoloads ox-extra orgdiff orgdiff-autoloads
doct ya-org-capture ya-org-capture-autoloads doct-autoloads
org-capture-pop-frame org-capture-pop-frame-autoloads org-protocol
org-analyzer-autoloads pomidor-autoloads alert-autoloads log4e-autoloads
gntp-autoloads helm-org-ql helm-org org-clock org-autosort
org-autosort-autoloads helm-org-ql-autoloads helm-org-autoloads
org-ql-search org-ql-view ov org-super-agenda org-ql peg ts
org-ql-autoloads peg-autoloads ov-autoloads org-super-agenda-autoloads
org-quick-peek org-quick-peek-autoloads calfw-org calfw-org-autoloads
calfw holidays hol-loaddefs calfw-autoloads org-attach cdlatex texmathp
cdlatex-autoloads org-capture-ref org-ref-url-utils org-ref org-ref-core
org-ref-glossary org-ref-bibtex doi-utils org-ref-utils org-ref-export
citeproc citeproc-itemgetters citeproc-biblatex citeproc-bibtex
ol-bibtex citeproc-cite citeproc-subbibs citeproc-sort citeproc-name
citeproc-formatters citeproc-number rst citeproc-proc citeproc-disamb
citeproc-itemdata citeproc-generic-elements citeproc-macro
citeproc-choose citeproc-date citeproc-context citeproc-prange
citeproc-style citeproc-locale citeproc-term citeproc-rt citeproc-lib
citeproc-s queue ox-pandoc ox-org ox-odt rng-loc rng-uri rng-parse
rng-match rng-dt rng-util rng-pttrn nxml-parse nxml-ns nxml-enc xmltok
nxml-util ox-latex ox-icalendar ox-html table ox-ascii ox-publish ox
org-ref-misc-links org-ref-label-link org-ref-ref-links
org-ref-citation-links org-ref-bibliography-links bibtex-completion
biblio biblio-download biblio-dissemin biblio-ieee biblio-hal
biblio-dblp biblio-crossref biblio-arxiv timezone biblio-doi biblio-core
ido parsebib bibtex org-ref-autoloads ox-pandoc-autoloads
citeproc-autoloads string-inflection-autoloads queue-autoloads
bibtex-completion-autoloads biblio-autoloads biblio-core-autoloads
parsebib-autoloads htmlize-autoloads scimax-inkscape
scimax-inkscape-autoloads org-pdftools pdf-annot facemenu org-noter
org-pdftools-autoloads org-noter-autoloads org-capture org-checklist
org-habit org-edna org-edna-autoloads org-inlinetask org-drill persist
org-agenda org-drill-autoloads persist-autoloads ol-info ol-w3m ol-doi
org-link-doi speed-type speed-type-autoloads ement ement-notify
ement-room ewoc ement-lib ement-api ement-structs ement-macros dns
ement-autoloads ts-autoloads svg-lib-autoloads
taxy-magit-section-autoloads taxy-autoloads map-autoloads plz
plz-autoloads 0x0 0x0-autoloads notmuch-calendar-x
notmuch-calendar-x-autoloads notmuch notmuch-tree notmuch-jump
notmuch-hello notmuch-show notmuch-print notmuch-crypto notmuch-mua
notmuch-message notmuch-draft notmuch-maildir-fcc notmuch-address
notmuch-company notmuch-parser notmuch-wash coolj notmuch-query
goto-addr icalendar diary-lib diary-loaddefs notmuch-tag notmuch-lib
notmuch-version notmuch-compat mm-view mml-smime smime dig w3m-autoloads
elfeed-score elfeed-score-maint elfeed-score-scoring elfeed-score-serde
elfeed-score-rule-stats elfeed-org org-element org-persist
elfeed-org-autoloads quick-peek quick-peek-autoloads elfeed-show
elfeed-search hideshow display-fill-column-indicator eros
rainbow-delimiters highlight-numbers parent-mode easy-escape
license-snippets yasnippet-snippets-autoloads yasnippet-snippets
yasnippet elfeed-csv elfeed elfeed-curl elfeed-log elfeed-db elfeed-lib
avl-tree url-queue xml-query elfeed-score-rules elfeed-score-log
elfeed-score-autoloads elfeed-autoloads ytel-show-autoloads ytel
ytel-autoloads qrencode-el-autoloads tb-keycast tb-keycast-autoloads
gif-screencast xdg gif-screencast-autoloads yaml-mode
yaml-mode-autoloads mingus libmpdee cl mingus-autoloads
libmpdee-autoloads calctex calc-sel calctex-autoloads
shell-pop-autoloads eterm-256color-autoloads xterm-color-autoloads vterm
term ehelp vterm-module term/xterm xterm vterm-autoloads diffpdf
diffpdf-autoloads pdf-view-restore pdf-view-restore-autoloads pdf-occur
ibuf-ext ibuffer ibuffer-loaddefs tablist tablist-filter
semantic/wisent/comp semantic/wisent semantic/wisent/wisent
semantic/util-modes semantic/util semantic semantic/tag semantic/lex
semantic/fw mode-local cedet pdf-isearch pdf-misc pdf-tools cus-edit
cus-load pdf-roll pdf-view jka-compr pdf-cache pdf-info tq pdf-util
pdf-macs pdf-tools-autoloads tablist-autoloads image-roll
image-roll-autoloads scimax-jupyter-autoloads pretty-hydra
pretty-hydra-autoloads jupyter jupyter-repl jupyter-kernel-manager
jupyter-channel jupyter-widget-client websocket bindat simple-httpd
jupyter-kernelspec jupyter-env jupyter-client jupyter-mime
jupyter-comm-layer jupyter-messages hmac-def jupyter-base eieio-base
jupyter-autoloads websocket-autoloads simple-httpd-autoloads
zmq-autoloads scimax-ob avy scimax-ob-autoloads wolfram-mode
wolfram-mode-autoloads ledger-mode-autoloads auctex-autoloads tex-site
ebuild-mode skeleton sh-script smie executable ebuild-mode-autoloads
lua-mode lua-mode-autoloads gnuplot-autoloads eros-autoloads nameless
lisp-mnt nameless-autoloads paredit paredit-autoloads company-jedi
company-jedi-autoloads jedi jedi-core python-environment epc ctable
concurrent auto-complete jedi-autoloads auto-complete-autoloads
jedi-core-autoloads python-environment-autoloads epc-autoloads
ctable-autoloads concurrent-autoloads elpy-autoloads pyvenv-autoloads
highlight-indentation-autoloads python tramp-sh helm-info which-key
which-key-autoloads helm-descbinds helm-descbinds-autoloads elisp-demos
elisp-demos-autoloads helpful edebug info-look help-fns radix-tree
elisp-refs helpful-autoloads elisp-refs-autoloads tldr tldr-autoloads
lsp-ui-autoloads lsp-mode-autoloads spinner-autoloads macrostep
macrostep-autoloads highlight-refontification
highlight-refontification-autoloads font-lock-profiler
font-lock-profiler-autoloads font-lock-studio font-lock-studio-autoloads
memory-usage memory-usage-autoloads bug-hunter bug-hunter-autoloads
lorem-ipsum lorem-ipsum-autoloads debug backtrace
license-snippets-autoloads yasnippet-autoloads move-text
move-text-autoloads aggressive-indent aggressive-indent-autoloads
visual-regexp-autoloads magit-bookmark bookmark pp helm-bm compile
helm-bm-autoloads bm bm-autoloads helm-dash dash-docs
helm-dash-autoloads dash-docs-autoloads disk-usage disk-usage-autoloads
dired-git-info-autoloads dired-hide-dotfiles-autoloads
dired-filter-autoloads diredfl diredfl-autoloads
all-the-icons-dired-autoloads dired-async dired-open-autoloads
dired-avfs dired-avfs-autoloads dired-narrow-autoloads dired-hacks-utils
dired-hacks-utils-autoloads dired+ image-file image-converter dired-x
dired-aux dired+-autoloads winner windower emacs-windower-autoloads
goggles pulse skip-buffers-mode avy-autoloads eval-sexp-fu
eval-sexp-fu-autoloads goggles-autoloads easy-escape-autoloads
highlight-numbers-autoloads parent-mode-autoloads
rainbow-delimiters-autoloads highlight-parentheses
highlight-parentheses-autoloads flycheck-tip error-tip notifications
dbus popup flycheck-tip-autoloads flycheck flycheck-autoloads
pkg-info-autoloads epl-autoloads wordnut wordnut-history wordnut-u
wordnut-autoloads smog smog-autoloads writegood-mode
writegood-mode-autoloads el-patch-autoloads el-patch el-patch-stub
flyspell ispell hi-lock ediff ediff-merg ediff-mult ediff-wind
ediff-diff ediff-help ediff-init ediff-util browse-at-remote vc-git
vc-dispatcher f browse-at-remote-autoloads f-autoloads code-review
code-review-actions code-review-comment code-review-section
code-review-bitbucket code-review-faces shr kinsoku svg xml dom emojify
apropos tar-mode arc-mode archive-mode ht code-review-gitlab
code-review-utils code-review-parse-hunk code-review-github
code-review-db uuidgen calc-misc calc-ext calc calc-loaddefs rect
calc-macs a code-review-interfaces deferred forge-list forge-commands
forge-semi forge-bitbucket buck forge-gogs gogs forge-gitea gtea
forge-gitlab glab forge-github ghub-graphql treepy gsexp ghub let-alist
gnutls forge-notify forge-revnote forge-pullreq forge-issue forge-topic
yaml bug-reference forge-post markdown-mode thingatpt forge-repo forge
forge-core forge-db closql emacsql-sqlite emacsql emacsql-compiler
url-http url-auth url-gw nsm magit-submodule magit-obsolete magit-blame
magit-stash magit-reflog magit-bisect magit-push magit-pull magit-fetch
magit-clone magit-remote magit-commit magit-sequence magit-notes
magit-worktree magit-tag magit-merge magit-branch magit-reset
magit-files magit-refs magit-status magit package browse-url
url-handlers magit-repos magit-apply magit-wip magit-log which-func
imenu magit-diff smerge-mode diff diff-mode git-commit log-edit message
rmc puny rfc822 mml mml-sec epa derived epg rfc6068 epg-config gnus-util
rmail rmail-loaddefs text-property-search mm-decode mm-bodies mm-encode
mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums mail-prsvr
mailabbrev mail-utils gmm-utils mailheader pcvs-util add-log magit-core
magit-autorevert magit-margin magit-transient magit-process with-editor
magit-mode transient magit-git magit-base magit-section crm compat-27
compat-26 code-review-autoloads emojify-autoloads ht-autoloads
deferred-autoloads uuidgen-autoloads a-autoloads forge-autoloads
yaml-autoloads markdown-mode-autoloads ghub-autoloads treepy-autoloads
let-alist-autoloads emacsql-sqlite-autoloads emacsql-autoloads
closql-autoloads magit-autoloads magit-section-autoloads
git-commit-autoloads with-editor-autoloads transient-autoloads
autorevert recentf tree-widget wid-edit disp-table hl-todo
pretty-symbols company-oddmuse company-keywords company-etags etags
fileloop generator xref project company-gtags company-dabbrev-code
company-dabbrev company-files company-clang company-capf company-cmake
company-semantic company-template company-bbdb company
persistent-scratch persistent-scratch-autoloads savehist
backup-walker-autoloads company-autoloads helm-adaptive helm-mode
helm-misc helm-files image-dired image-mode dired dired-loaddefs exif
filenotify tramp tramp-loaddefs trampver tramp-integration files-x
tramp-compat shell parse-time iso8601 ls-lisp helm-buffers helm-occur
helm-tags helm-locate helm-grep helm-regexp helm-utils helm-help
helm-types helm helm-core async-bytecomp helm-global-bindings
helm-easymenu helm-source helm-multi-match helm-lib async helm-autoloads
popup-autoloads helm-core-autoloads face-remap pyim pyim-hacks
pyim-cloudim url url-proxy url-privacy url-expand url-methods
url-history url-cookie url-domsuf mailcap pyim-probe pyim-cregexp xr
pyim-dict pyim-autoselector pyim-indicator pyim-preview pyim-page
pyim-process pyim-cstring pyim-punctuation pyim-outcome pyim-candidates
pyim-codes pyim-imobjs pyim-pinyin pyim-pymap pyim-entered pyim-dcache
url-util url-parse auth-source eieio eieio-core eieio-loaddefs
password-cache json map url-vars pyim-scheme pyim-common pyim-autoloads
xr-autoloads async-autoloads reverse-im quail reverse-im-autoloads hydra
lv boon-qwerty color olivetti straight-x boon boon-keys boon-core
boon-loaddefs boon-autoloads multiple-cursors-autoloads
expand-region-autoloads meta-functions org-id org-refile dash
meta-functions-autoloads dash-autoloads hl-line memoize
memoize-autoloads info-colors info-colors-autoloads hl-todo-autoloads
latex-pretty-symbols latex-pretty-symbols-autoloads
pretty-symbols-autoloads page-break-lines page-break-lines-autoloads
edmacro kmacro adaptive-wrap adaptive-wrap-autoloads olivetti-autoloads
shackle trace shackle-autoloads use-package-diminish all-the-icons
all-the-icons-faces data-material data-weathericons data-octicons
data-fileicons data-faicons data-alltheicons all-the-icons-autoloads org
ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-footnote
org-src ob-comint org-pcomplete pcomplete comint ansi-color ring
org-list org-entities time-date noutline outline org-version
ob-emacs-lisp ob-core ob-eval org-cycle org-font-lock org-font-lock-core
org-element-match org-faces org-table ol org-fold org-fold-core org-keys
oc org-compat advice org-font-lock-obsolete org-macs org-loaddefs
format-spec find-func cal-menu calendar cal-loaddefs
modus-operandi-theme modus-themes modus-themes-autoloads s s-autoloads
pcase asoc asoc.el-autoloads no-littering compat no-littering-autoloads
compat-autoloads hydra-autoloads lv-autoloads finder-inf
use-package-bind-key org-contrib-autoloads comp comp-cstr warnings rx
bind-key easy-mmode diminish diminish-autoloads use-package-core
use-package-autoloads bind-key-autoloads straight-autoloads info cl-seq
cl-extra help-mode seq byte-opt straight subr-x cl-macs gv cl-loaddefs
cl-lib bytecomp byte-compile cconv server site-gentoo iso-transl tooltip
eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type
elisp-mode mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd
fontset image regexp-opt fringe tabulated-list replace newcomment
text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow
isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax
font-core term/tty-colors frame minibuffer cl-generic cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european
ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop
case-table epa-hook jka-cmpr-hook help simple abbrev obarray
cl-preloaded nadvice button loaddefs faces cus-face macroexp files
window text-properties overlay sha1 md5 base64 format env code-pages
mule custom widget hashtable-print-readable backquote threads dbusbind
inotify dynamic-setting font-render-setting cairo x multi-tty
make-network-process native-compile emacs)

Memory information:
((conses 16 6640792 1584580)
 (symbols 48 83706 1504)
 (strings 32 570057 296114)
 (string-bytes 1 75546444)
 (vectors 16 314161)
 (vector-slots 8 5434095 14347567)
 (floats 8 6713 24116)
 (intervals 56 188583 30856)
 (buffers 992 60))




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Mon, 27 Jun 2022 22:58:02 GMT) Full text and rfc822 format available.

Message #8 received at 56255 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Ihor Radchenko <yantar92 <at> gmail.com>
Cc: 56255 <at> debbugs.gnu.org
Subject: Re: bug#56255: 28.1.50; sxhash-equal does not change when object is
 modified
Date: Tue, 28 Jun 2022 00:56:48 +0200
Ihor Radchenko <yantar92 <at> gmail.com> writes:

> The result of sxhash-equal does not change despite `a' object being
> changed.

Here's a self-contained example:

(require 'org-element)
(setq c (avl-tree--create #'org-element--cache-compare))
(avl-tree-enter c '(headline (:begin 2)))

(setq d (avl-tree--create #'org-element--cache-compare))
(avl-tree-enter d '(headline (:begin 5)))

(equal c d)
nil

(sxhash-equal c)
1776904311275
(sxhash-equal d)
1776904311275

This is due to:

/* Maximum depth up to which to dive into Lisp structures.  */
#define SXHASH_MAX_DEPTH 3

Since this record nests to a depth of 4, and that's where the difference
is.

So I think the doc string overstates things. 

--
If (equal A B), then (= (sxhash-equal A) (sxhash-equal B)).
--

Is not remotely true, but:

--
If (= (sxhash-equal A) (sxhash-equal B)) then it's quite likely that
(equal A B), but the opposite is not true for deeply nested structures.
--



-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Mon, 27 Jun 2022 23:01:01 GMT) Full text and rfc822 format available.

Message #11 received at 56255 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Ihor Radchenko <yantar92 <at> gmail.com>
Cc: 56255 <at> debbugs.gnu.org
Subject: Re: bug#56255: 28.1.50; sxhash-equal does not change when object is
 modified
Date: Tue, 28 Jun 2022 01:00:33 +0200
Lars Ingebrigtsen <larsi <at> gnus.org> writes:

> So I think the doc string overstates things. 
>
> --
> If (equal A B), then (= (sxhash-equal A) (sxhash-equal B)).
> --
>
> Is not remotely true, but:
>
> --
> If (= (sxhash-equal A) (sxhash-equal B)) then it's quite likely that
> (equal A B), but the opposite is not true for deeply nested structures.
> --

Sorry, that's all wrong, and what the doc string says is true.  That is,
if they're equal, then the hash is =.

But (= (sxhash-equal A) (sxhash-equal B)) does not imply that
(equal A B), and the doc string should say that explicitly.

It's the manual that's wrong here:

     If the two objects are not ‘equal’, the values returned by
     ‘sxhash-equal’ are usually different, but not always; once in a
     rare while, by luck, you will encounter two distinct-looking
     objects that give the same result from ‘sxhash-equal’.

It's not "once in a rare while" for deeply nested structures.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Tue, 28 Jun 2022 12:59:01 GMT) Full text and rfc822 format available.

Message #14 received at 56255 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Ihor Radchenko <yantar92 <at> gmail.com>
Cc: 56255 <at> debbugs.gnu.org
Subject: Re: bug#56255: 28.1.50; sxhash-equal does not change when object is
 modified
Date: Tue, 28 Jun 2022 14:58:37 +0200
Lars Ingebrigtsen <larsi <at> gnus.org> writes:

> It's the manual that's wrong here:

I've now clarified the manual and doc strings here in Emacs 29.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




bug marked as fixed in version 29.1, send any further explanations to 56255 <at> debbugs.gnu.org and Ihor Radchenko <yantar92 <at> gmail.com> Request was from Lars Ingebrigtsen <larsi <at> gnus.org> to control <at> debbugs.gnu.org. (Tue, 28 Jun 2022 13:00:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Wed, 29 Jun 2022 01:58:02 GMT) Full text and rfc822 format available.

Message #19 received at 56255 <at> debbugs.gnu.org (full text, mbox):

From: Ihor Radchenko <yantar92 <at> gmail.com>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: 56255 <at> debbugs.gnu.org
Subject: Re: bug#56255: 28.1.50; sxhash-equal does not change when object is
 modified
Date: Wed, 29 Jun 2022 09:58:54 +0800
Lars Ingebrigtsen <larsi <at> gnus.org> writes:

> Lars Ingebrigtsen <larsi <at> gnus.org> writes:
>
>> It's the manual that's wrong here:
>
> I've now clarified the manual and doc strings here in Emacs 29.

Thanks!

Off topic: Do you know any other way to detect if deeply nested object
has changed (other than creating a deep copy and using equal)?

Best,
Ihor




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Wed, 29 Jun 2022 10:02:02 GMT) Full text and rfc822 format available.

Message #22 received at 56255 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Ihor Radchenko <yantar92 <at> gmail.com>
Cc: 56255 <at> debbugs.gnu.org
Subject: Re: bug#56255: 28.1.50; sxhash-equal does not change when object is
 modified
Date: Wed, 29 Jun 2022 12:01:33 +0200
Ihor Radchenko <yantar92 <at> gmail.com> writes:

> Off topic: Do you know any other way to detect if deeply nested object
> has changed (other than creating a deep copy and using equal)?

Printing the object to a buffer and then using `buffer-hash' should be
OK for most structures, but would be very slow for large objects.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Wed, 29 Jun 2022 10:12:01 GMT) Full text and rfc822 format available.

Message #25 received at 56255 <at> debbugs.gnu.org (full text, mbox):

From: Ihor Radchenko <yantar92 <at> gmail.com>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: 56255 <at> debbugs.gnu.org
Subject: Re: bug#56255: 28.1.50; sxhash-equal does not change when object is
 modified
Date: Wed, 29 Jun 2022 18:12:38 +0800
Lars Ingebrigtsen <larsi <at> gnus.org> writes:

> Ihor Radchenko <yantar92 <at> gmail.com> writes:
>
>> Off topic: Do you know any other way to detect if deeply nested object
>> has changed (other than creating a deep copy and using equal)?
>
> Printing the object to a buffer and then using `buffer-hash' should be
> OK for most structures, but would be very slow for large objects.

This is exactly the problem at hand. I was hoping to find a fast way to
detect if a large deeply nested object is changed. If not, do not print
that object for the purpose of saving it to disk cache. Printing can
take up to 2-3 seconds in some cases.

Best,
Ihor




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Wed, 29 Jun 2022 10:16:01 GMT) Full text and rfc822 format available.

Message #28 received at 56255 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Ihor Radchenko <yantar92 <at> gmail.com>
Cc: 56255 <at> debbugs.gnu.org
Subject: Re: bug#56255: 28.1.50; sxhash-equal does not change when object is
 modified
Date: Wed, 29 Jun 2022 12:15:30 +0200
Ihor Radchenko <yantar92 <at> gmail.com> writes:

> This is exactly the problem at hand. I was hoping to find a fast way to
> detect if a large deeply nested object is changed. If not, do not print
> that object for the purpose of saving it to disk cache. Printing can
> take up to 2-3 seconds in some cases.

I think you basically have to restructure the code to add a guard to
whatever's updating the structure to see whether it's "dirty" or not.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Wed, 29 Jun 2022 12:33:02 GMT) Full text and rfc822 format available.

Message #31 received at 56255 <at> debbugs.gnu.org (full text, mbox):

From: Ihor Radchenko <yantar92 <at> gmail.com>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: 56255 <at> debbugs.gnu.org
Subject: Re: bug#56255: 28.1.50; sxhash-equal does not change when object is
 modified
Date: Wed, 29 Jun 2022 20:33:05 +0800
Lars Ingebrigtsen <larsi <at> gnus.org> writes:

> Ihor Radchenko <yantar92 <at> gmail.com> writes:
>
>> This is exactly the problem at hand. I was hoping to find a fast way to
>> detect if a large deeply nested object is changed. If not, do not print
>> that object for the purpose of saving it to disk cache. Printing can
>> take up to 2-3 seconds in some cases.
>
> I think you basically have to restructure the code to add a guard to
> whatever's updating the structure to see whether it's "dirty" or not.

This is only possible when I have access to the code making changes to
the object.

The original idea was to detect changed objects in most generic way, as
a part of persistent storage library. Oh well.

Best,
Ihor




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Wed, 29 Jun 2022 12:39:01 GMT) Full text and rfc822 format available.

Message #34 received at 56255 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Ihor Radchenko <yantar92 <at> gmail.com>
Cc: 56255 <at> debbugs.gnu.org
Subject: Re: bug#56255: 28.1.50; sxhash-equal does not change when object is
 modified
Date: Wed, 29 Jun 2022 14:38:06 +0200
Ihor Radchenko <yantar92 <at> gmail.com> writes:

> The original idea was to detect changed objects in most generic way, as
> a part of persistent storage library. Oh well.

We could make SXHASH_MAX_DEPTH into a defvar -- or pass the depth in to
`sxhash-equal'.  However, the hash it's computing is geared towards hash
tables, so collisions are OK -- it's not a cryptographic hash, so I'm
not sure it would fit your use case anyway.  I.e., our sxhash_combine is
very simple.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Wed, 29 Jun 2022 12:56:01 GMT) Full text and rfc822 format available.

Message #37 received at 56255 <at> debbugs.gnu.org (full text, mbox):

From: Ihor Radchenko <yantar92 <at> gmail.com>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: 56255 <at> debbugs.gnu.org
Subject: Re: bug#56255: 28.1.50; sxhash-equal does not change when object is
 modified
Date: Wed, 29 Jun 2022 20:56:31 +0800
Lars Ingebrigtsen <larsi <at> gnus.org> writes:

> Ihor Radchenko <yantar92 <at> gmail.com> writes:
>
>> The original idea was to detect changed objects in most generic way, as
>> a part of persistent storage library. Oh well.
>
> We could make SXHASH_MAX_DEPTH into a defvar -- or pass the depth in to
> `sxhash-equal'.  However, the hash it's computing is geared towards hash
> tables, so collisions are OK -- it's not a cryptographic hash, so I'm
> not sure it would fit your use case anyway.  I.e., our sxhash_combine is
> very simple.

Well. In my scenario, the object structure creates so bad case that
_all_ the hashes for _all possible_ avl-tree structures collide
(actually, I use plists containing avl-tree structures).

As for the hash tables and collisions. Are you sure that collisions are
OK? Consider the following example:

(setq a (avl-tree--create #'org-element--cache-compare))
(avl-tree-enter a '(headline (:begin 2)))
(setq tbl (make-hash-table :test #'equal))
(puthash a 'value tbl)
(gethash a tbl)
(plist-put (nth 1 (avl-tree-first a)) :begin 10)
(gethash a tbl) ;; the value does not change!

Best,
Ihor




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Thu, 30 Jun 2022 09:07:01 GMT) Full text and rfc822 format available.

Message #40 received at 56255 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Ihor Radchenko <yantar92 <at> gmail.com>
Cc: 56255 <at> debbugs.gnu.org
Subject: Re: bug#56255: 28.1.50; sxhash-equal does not change when object is
 modified
Date: Thu, 30 Jun 2022 11:06:34 +0200
Ihor Radchenko <yantar92 <at> gmail.com> writes:

> As for the hash tables and collisions. Are you sure that collisions are
> OK? Consider the following example:
>
> (setq a (avl-tree--create #'org-element--cache-compare))
> (avl-tree-enter a '(headline (:begin 2)))
> (setq tbl (make-hash-table :test #'equal))
> (puthash a 'value tbl)
> (gethash a tbl)
> (plist-put (nth 1 (avl-tree-first a)) :begin 10)
> (gethash a tbl) ;; the value does not change!

That has nothing to do with collisions -- you're free to alter a key as
much as you want.  It's just a normal Lisp object.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#56255; Package emacs. (Thu, 30 Jun 2022 11:16:02 GMT) Full text and rfc822 format available.

Message #43 received at 56255 <at> debbugs.gnu.org (full text, mbox):

From: Ihor Radchenko <yantar92 <at> gmail.com>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: 56255 <at> debbugs.gnu.org
Subject: Re: bug#56255: 28.1.50; sxhash-equal does not change when object is
 modified
Date: Thu, 30 Jun 2022 19:16:49 +0800
Lars Ingebrigtsen <larsi <at> gnus.org> writes:

>> (setq a (avl-tree--create #'org-element--cache-compare))
>> (avl-tree-enter a '(headline (:begin 2)))
>> (setq tbl (make-hash-table :test #'equal))
>> (puthash a 'value tbl)
>> (gethash a tbl)
>> (plist-put (nth 1 (avl-tree-first a)) :begin 10)
>> (gethash a tbl) ;; the value does not change!
>
> That has nothing to do with collisions -- you're free to alter a key as
> much as you want.  It's just a normal Lisp object.

You are indeed right. Thanks for the clarification!

Best,
Ihor




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Thu, 28 Jul 2022 11:24:09 GMT) Full text and rfc822 format available.

This bug report was last modified 3 years and 58 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.