GNU bug report logs -
#29679
26.0.90; :after-hook not compiled
Previous Next
Reported by: Stefan Monnier <monnier <at> iro.umontreal.ca>
Date: Tue, 12 Dec 2017 20:08:01 UTC
Severity: normal
Found in version 26.0.90
Fixed in version 26.1
Done: Stefan Monnier <monnier <at> IRO.UMontreal.CA>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Your bug report
#29679: 26.0.90; :after-hook not compiled
which was filed against the emacs package, has been closed.
The explanation is attached below, along with your original report.
If you require more details, please reply to 29679 <at> debbugs.gnu.org.
--
29679: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=29679
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
Version: 26.1
Installed, with corresponding test into emacs-26.
Stefan
[Message part 3 (message/rfc822, inline)]
Package: Emacs
Version: 26.0.90
I just realized that the :after-hook option of define-derived-mode (new
in Emacs-26) is expanded in a way that introduces some problems.
More specifically a
:after-hook (foo bar)
gets turned into something like
(push '(foo bar) 'delayed-after-hook-forms)
which means that the code (foo bar) is not byte-compiled, hence is not
macro-expanded, and will be evaluated later via `eval` without paying
attention to the setting of `lexical-binding`.
It's not a very serious problem in practice, but if we keep the code as
we have it, it means that code byte-compiled with Emacs-26 will use the
above
(push '(foo bar) 'delayed-after-hook-forms)
in its .elc and we'll have to preserve backward compatibility with it.
So it'd be better to fix it before Emacs-26 is released.
Here's a minimal patch for it, which I hope is safe enough for emacs-26.
OK to push to emacs-26?
Stefan
diff --git a/lisp/emacs-lisp/derived.el b/lisp/emacs-lisp/derived.el
index 751291afa8..c0ef199424 100644
--- a/lisp/emacs-lisp/derived.el
+++ b/lisp/emacs-lisp/derived.el
@@ -285,7 +285,7 @@ define-derived-mode
(run-mode-hooks ',hook)
,@(when after-hook
`((if delay-mode-hooks
- (push ',after-hook delayed-after-hook-forms)
+ (push (lambda () ,after-hook) delayed-after-hook-functions)
,after-hook)))))))
;; PUBLIC: find the ultimate class of a derived mode.
diff --git a/lisp/subr.el b/lisp/subr.el
index 6db3b614d6..64521711b7 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1844,10 +1844,10 @@ delayed-mode-hooks
(make-variable-buffer-local 'delayed-mode-hooks)
(put 'delay-mode-hooks 'permanent-local t)
-(defvar delayed-after-hook-forms nil
+(defvar delayed-after-hook-functions nil
"List of delayed :after-hook forms waiting to be run.
These forms come from `define-derived-mode'.")
-(make-variable-buffer-local 'delayed-after-hook-forms)
+(make-variable-buffer-local 'delayed-after-hook-functions)
(defvar change-major-mode-after-body-hook nil
"Normal hook run in major mode functions, before the mode hooks.")
@@ -1865,7 +1865,7 @@ run-mode-hooks
Otherwise, runs hooks in the sequence: `change-major-mode-after-body-hook',
`delayed-mode-hooks' (in reverse order), HOOKS, then runs
`hack-local-variables', runs the hook `after-change-major-mode-hook', and
-finally evaluates the forms in `delayed-after-hook-forms' (see
+finally evaluates the functions in `delayed-after-hook-functions' (see
`define-derived-mode').
Major mode functions should use this instead of `run-hooks' when
@@ -1882,9 +1882,9 @@ run-mode-hooks
(with-demoted-errors "File local-variables error: %s"
(hack-local-variables 'no-mode)))
(run-hooks 'after-change-major-mode-hook)
- (dolist (form (nreverse delayed-after-hook-forms))
- (eval form))
- (setq delayed-after-hook-forms nil)))
+ (dolist (fun (nreverse delayed-after-hook-functions))
+ (funcall fun))
+ (setq delayed-after-hook-functions nil)))
(defmacro delay-mode-hooks (&rest body)
"Execute BODY, but delay any `run-mode-hooks'.
This bug report was last modified 7 years and 159 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.