GNU bug report logs - #34686
26.1; unload-feature doesn't remove functions locally from hooks

Previous Next

Package: emacs;

Reported by: Braun Gábor <braungb88 <at> gmail.com>

Date: Thu, 28 Feb 2019 16:21:02 UTC

Severity: minor

Merged with 5293

Found in version 26.1

Done: Štěpán Němec <stepnem <at> gmail.com>

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 34686 in the body.
You can then email your comments to 34686 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#34686; Package emacs. (Thu, 28 Feb 2019 16:21:03 GMT) Full text and rfc822 format available.

Acknowledgement sent to Braun Gábor <braungb88 <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Thu, 28 Feb 2019 16:21:03 GMT) Full text and rfc822 format available.

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

From: Braun Gábor <braungb88 <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 26.1; unload-feature doesn't remove functions locally from hooks
Date: Sat, 23 Feb 2019 22:16:45 +0100
Create in the current directory the following two files:

------------------------- test.el -------------------------------------
(with-temp-buffer
  (load-file "./test-unload.el")
  (add-hook 'test-hook #'test-function nil t)
  (unload-feature 'test-unload)
  (run-hooks 'test-hook))
-----------------------------------------------------------------------

------------------------- test-unload.el ------------------------------
(defun test-function () "Test function, does nothing." nil)
(provide 'test-unload)
-----------------------------------------------------------------------

Start Emacs via

emacs -Q --eval '(setq debug-on-error t)' -l test.el

Expectation: Emacs starts up with no error.
(`unload-feature' should remove `test-function' from `test-hook' as
documented, so `(run-hooks 'test-hook)' should be a no-op.)

A split frame is shown with buffer *Backtrace* having the following 
content:

-------------------- buffer *Backtrace* -------------------------------
Debugger entered--Lisp error: (void-function test-function)
  test-function()
  run-hooks(test-hook)
  (progn (load-file "./test-unload.el") (add-hook 'test-hook (function 
test-function) nil t) (unload-feature 'test-unload) (run-hooks 'test-
hook))
  (unwind-protect (progn (load-file "./test-unload.el") (add-hook 'test-
hook (function test-function) nil t) (unload-feature 'test-unload) (run-
hooks 'test-hook)) (and (buffer-name temp-buffer) (kill-buffer temp-
buffer)))
  (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn 
(load-file "./test-unload.el") (add-hook 'test-hook (function test-
function) nil t) (unload-feature 'test-unload) (run-hooks 'test-hook)) 
(and (buffer-name temp-buffer) (kill-buffer temp-buffer))))
  (let ((temp-buffer (generate-new-buffer " *temp*"))) (save-current-
buffer (set-buffer temp-buffer) (unwind-protect (progn (load-file "./
test-unload.el") (add-hook 'test-hook (function test-function) nil t) 
(unload-feature 'test-unload) (run-hooks 'test-hook)) (and (buffer-name 
temp-buffer) (kill-buffer temp-buffer)))))
  eval-buffer(#<buffer  *load*> nil "/run/shm/test.el" nil t)  ; Reading 
at buffer position 155
  load-with-code-conversion("/run/shm/test.el" "/run/shm/test.el" nil t)
  load("/run/shm/test.el" nil t)
  command-line-1(("--eval" "(setq debug-on-error t)" "-l" "test.el"))
  command-line()
  normal-top-level()
-----------------------------------------------------------------------

Best wishes,

     Gábor Braun

System information:

In GNU Emacs 26.1 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.2)
 of 2018-12-26, modified by Debian built on x86-ubc-01
Windowing system distributor 'The X.Org Foundation', version 
11.0.12003000
System Description:	Debian GNU/Linux buster/sid

Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.
Loading /run/shm/test-unload.el (source)...done
Entering debugger...

Configured using:
 'configure --build x86_64-linux-gnu --prefix=/usr
 --sharedstatedir=/var/lib --libexecdir=/usr/lib
 --localstatedir=/var/lib --infodir=/usr/share/info
 --mandir=/usr/share/man --enable-libsystemd --with-pop=yes
 --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/26.1/site-
lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/26.1/site-lisp:/
usr/share/emacs/site-lisp
 --with-sound=alsa --without-gconf --with-mailutils --build
 x86_64-linux-gnu --prefix=/usr --sharedstatedir=/var/lib
 --libexecdir=/usr/lib --localstatedir=/var/lib
 --infodir=/usr/share/info --mandir=/usr/share/man --enable-libsystemd
 --with-pop=yes
 --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/26.1/site-
lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/26.1/site-lisp:/
usr/share/emacs/site-lisp
 --with-sound=alsa --without-gconf --with-mailutils --with-x=yes
 --with-x-toolkit=gtk3 --with-toolkit-scroll-bars 'CFLAGS=-g -O2
 -fdebug-prefix-map=/build/emacs-3ThesY/emacs-26.1+1=. -fstack-
protector-strong
 -Wformat -Werror=format-security -Wall' 'CPPFLAGS=-Wdate-time
 -D_FORTIFY_SOURCE=2' LDFLAGS=-Wl,-z,relro'

Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GSETTINGS NOTIFY
ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB
TOOLKIT_SCROLL_BARS GTK3 X11 THREADS LIBSYSTEMD LCMS2

Important settings:
  value of $LANG: hu_HU.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Debugger

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  buffer-read-only: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message rmc puny seq dired
dired-loaddefs format-spec rfc822 mml mml-sec password-cache epa derived
epg epg-config gnus-util rmail rmail-loaddefs mm-decode mm-bodies
mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail
rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils help-mode
easymenu cl-print debug loadhist byte-opt gv bytecomp byte-compile
cl-loaddefs cl-lib cconv elec-pair time-date mule-util tooltip eldoc
electric uniquify ediff-hook vc-hooks lisp-float-type 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 elisp-mode lisp-mode
prog-mode register page menu-bar rfn-eshadow isearch timer select
scroll-bar mouse jit-lock font-lock syntax facemenu font-core
term/tty-colors frame 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 charscript charprop case-table epa-hook jka-cmpr-hook
help simple abbrev obarray minibuffer cl-preloaded nadvice loaddefs
button faces cus-face macroexp files text-properties overlay sha1 md5
base64 format env code-pages mule custom widget hashtable-print-readable
backquote dbusbind inotify lcms2 dynamic-setting system-font-setting
font-render-setting move-toolbar gtk x-toolkit x multi-tty
make-network-process emacs)

Memory information:
((conses 16 99661 8330)
 (symbols 48 20573 1)
 (miscs 40 65 104)
 (strings 32 28942 1190)
 (string-bytes 1 759566)
 (vectors 16 14967)
 (vector-slots 8 500780 7422)
 (floats 8 55 154)
 (intervals 56 296 0)
 (buffers 992 14))







Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34686; Package emacs. (Thu, 28 Feb 2019 18:05:02 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Braun Gábor <braungb88 <at> gmail.com>
Cc: 34686 <at> debbugs.gnu.org
Subject: Re: bug#34686: 26.1;
 unload-feature doesn't remove functions locally from hooks
Date: Thu, 28 Feb 2019 20:03:27 +0200
> From: Braun Gábor <braungb88 <at> gmail.com>
> Date: Sat, 23 Feb 2019 22:16:45 +0100
> 
> Create in the current directory the following two files:
> 
> ------------------------- test.el -------------------------------------
> (with-temp-buffer
>   (load-file "./test-unload.el")
>   (add-hook 'test-hook #'test-function nil t)
>   (unload-feature 'test-unload)
>   (run-hooks 'test-hook))
> -----------------------------------------------------------------------
> 
> ------------------------- test-unload.el ------------------------------
> (defun test-function () "Test function, does nothing." nil)
> (provide 'test-unload)
> -----------------------------------------------------------------------
> 
> Start Emacs via
> 
> emacs -Q --eval '(setq debug-on-error t)' -l test.el
> 
> Expectation: Emacs starts up with no error.
> (`unload-feature' should remove `test-function' from `test-hook' as
> documented, so `(run-hooks 'test-hook)' should be a no-op.)

Where do you see it documented that the hook should be removed?  All I
see is this:

  Standard unloading activities include restoring old autoloads for
  functions defined by the library, undoing any additions that the
  library has made to hook variables or to ‘auto-mode-alist’[...]

This says that hooks are removed if they were added by the library
being unloaded.  But in your example, the hook was not added by
test-unload.el, it was added by test.el, a different library.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34686; Package emacs. (Thu, 28 Feb 2019 19:04:01 GMT) Full text and rfc822 format available.

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

From: Robert Pluim <rpluim <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 34686 <at> debbugs.gnu.org, Braun Gábor <braungb88 <at> gmail.com>
Subject: Re: bug#34686: 26.1;
 unload-feature doesn't remove functions locally from hooks
Date: Thu, 28 Feb 2019 20:03:44 +0100
Eli Zaretskii <eliz <at> gnu.org> writes:

>> Expectation: Emacs starts up with no error.
>> (`unload-feature' should remove `test-function' from `test-hook' as
>> documented, so `(run-hooks 'test-hook)' should be a no-op.)
>
> Where do you see it documented that the hook should be removed?  All I
> see is this:
>
>   Standard unloading activities include restoring old autoloads for
>   functions defined by the library, undoing any additions that the
>   library has made to hook variables or to ‘auto-mode-alist’[...]
>
> This says that hooks are removed if they were added by the library
> being unloaded.  But in your example, the hook was not added by
> test-unload.el, it was added by test.el, a different library.

In "(elisp) Unloading" it says:

     Before restoring the previous definitions, ‘unload-feature’ runs
     ‘remove-hook’ to remove functions in the library from certain
     hooks.  These hooks include variables whose names end in ‘-hook’
     (or the deprecated suffix ‘-hooks’), plus those listed in
     ‘unload-feature-special-hooks’, as well as ‘auto-mode-alist’.  This
     is to prevent Emacs from ceasing to function because important
     hooks refer to functions that are no longer defined.

and a quick look at the code confirms that it at least *tries* to do
that.

Robert




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34686; Package emacs. (Thu, 28 Feb 2019 19:39:02 GMT) Full text and rfc822 format available.

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

From: Robert Pluim <rpluim <at> gmail.com>
To: Braun Gábor <braungb88 <at> gmail.com>
Cc: 34686 <at> debbugs.gnu.org
Subject: Re: bug#34686: 26.1;
 unload-feature doesn't remove functions locally from hooks
Date: Thu, 28 Feb 2019 20:38:11 +0100
(please donʼt drop the bug address from the CC)

Braun Gábor <braungb88 <at> gmail.com> writes:

> Hi,
>
>> > Standard unloading activities include restoring old autoloads for
>> > functions defined by the library, undoing any additions that the
>> > library has made to hook variables or to ‘auto-mode-alist’[...]
>
> Obviously, this part of the docstring of unload-feature contradicts
> the info manual.
>  
>> In "(elisp) Unloading" it says:
>> 
>>      Before restoring the previous definitions, ‘unload-feature’ runs
>>      ‘remove-hook’ to remove functions in the library from certain
>>      hooks.  These hooks include variables whose names end in ‘-hook’
>>      (or the deprecated suffix ‘-hooks’), plus those listed in
>>      ‘unload-feature-special-hooks’, as well as ‘auto-mode-alist’.  This
>>      is to prevent Emacs from ceasing to function because important
>>      hooks refer to functions that are no longer defined.
>> 
>> and a quick look at the code confirms that it at least *tries* to do
>> that.
>
> And as far as I understand the code, it does remove functions from the 
> global value of the hooks, but not from the buffer-local values.
>
> IMHO, the stated reason in the info manual (keep Emacs functioning) 
> justifies removing functions from the hooks (both their global and local 
> values) which become undefined.

Yes, Iʼd tend to agree. Would you have a patch to offer?

Thanks

Robert




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34686; Package emacs. (Thu, 28 Feb 2019 20:09:01 GMT) Full text and rfc822 format available.

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

From: Braun Gábor <braungb88 <at> gmail.com>
To: Robert Pluim <rpluim <at> gmail.com>
Cc: 34686 <at> debbugs.gnu.org
Subject: Re: bug#34686: 26.1;
 unload-feature doesn't remove functions locally from hooks
Date: Thu, 28 Feb 2019 21:08:44 +0100
> > IMHO, the stated reason in the info manual (keep Emacs functioning)
> > justifies removing functions from the hooks (both their global and 
local
> > values) which become undefined.
> 
> Yes, Iʼd tend to agree. Would you have a patch to offer?

What about the following?

Gábor

--- lisp/loadhist.el	2019-02-28 20:52:14.852487704 +0100
+++ lisp/loadhist.el	2019-02-28 20:51:40.008386599 +0100
@@ -295,7 +295,13 @@
 	     (dolist (y unload-function-defs-list)
 	       (when (and (eq (car-safe y) 'defun)
 			  (not (get (cdr y) 'autoload)))
-		 (remove-hook x (cdr y)))))))
+		 (let ((f (cdr y)))
+		   (remove-hook x f)
+		   ;; Remove also from buffer-local value.
+		   (save-current-buffer
+		     (dolist (buf (buffer-list))
+		       (set-buffer buf)
+		       (remove-hook x f t)))))))))
 	;; Remove any feature-symbols from auto-mode-alist as well.
 	(dolist (y unload-function-defs-list)
 	  (when (and (eq (car-safe y) 'defun)







Forcibly Merged 5293 34686. Request was from Glenn Morris <rgm <at> gnu.org> to control <at> debbugs.gnu.org. (Fri, 01 Mar 2019 01:24:02 GMT) Full text and rfc822 format available.

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Thu, 19 Nov 2020 12:24:07 GMT) Full text and rfc822 format available.

This bug report was last modified 4 years and 213 days ago.

Previous Next


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