GNU bug report logs -
#34686
26.1; unload-feature doesn't remove functions locally from hooks
Previous Next
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.
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):
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: 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):
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):
(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):
> > 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.