From 68cbc58be59373e805fa200db02e4022e20050f0 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Thu, 10 Nov 2011 20:46:03 -0500 Subject: [PATCH] eval-after-load fix for bug#10009 * lisp/subr.el (eval-after-load): If FILE is already loaded, evaluate FORM before it gets wrapped in more stuff. --- lisp/ChangeLog | 5 +++++ lisp/subr.el | 43 +++++++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 0b1572f9bce..6df54fb4527 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2011-11-11 Glenn Morris + + * subr.el (eval-after-load): If FILE is already loaded, + evaluate FORM before it gets wrapped in more stuff. (Bug#10009) + 2011-11-10 Glenn Morris * vc/vc-svn.el (vc-svn-create-repo, vc-svn-modify-change-comment): diff --git a/lisp/subr.el b/lisp/subr.el index d5120826812..1cd6598eeb5 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -1797,30 +1797,29 @@ This function makes or adds to an entry on `after-load-alist'." (push elt after-load-alist)) ;; Make sure `form' is evalled in the current lexical/dynamic code. (setq form `(funcall ',(eval `(lambda () ,form) lexical-binding))) - (when (symbolp regexp-or-feature) - ;; For features, the after-load-alist elements get run when `provide' is - ;; called rather than at the end of the file. So add an indirection to - ;; make sure that `form' is really run "after-load" in case the provide - ;; call happens early. - (setq form - `(when load-file-name - (let ((fun (make-symbol "eval-after-load-helper"))) - (fset fun `(lambda (file) - (if (not (equal file ',load-file-name)) - nil - (remove-hook 'after-load-functions ',fun) - ,',form))) - (add-hook 'after-load-functions fun))))) - ;; Add FORM to the element unless it's already there. - (unless (member form (cdr elt)) - (nconc elt (purecopy (list form)))) - ;; Is there an already loaded file whose name (or `provide' name) ;; matches FILE? - (if (if (stringp file) - (load-history-filename-element regexp-or-feature) - (featurep file)) - (eval form)))) + (prog1 (if (if (stringp file) + (load-history-filename-element regexp-or-feature) + (featurep file)) + (eval form)) + (when (symbolp regexp-or-feature) + ;; For features, the after-load-alist elements get run when `provide' is + ;; called rather than at the end of the file. So add an indirection to + ;; make sure that `form' is really run "after-load" in case the provide + ;; call happens early. + (setq form + `(when load-file-name + (let ((fun (make-symbol "eval-after-load-helper"))) + (fset fun `(lambda (file) + (if (not (equal file ',load-file-name)) + nil + (remove-hook 'after-load-functions ',fun) + ,',form))) + (add-hook 'after-load-functions fun))))) + ;; Add FORM to the element unless it's already there. + (unless (member form (cdr elt)) + (nconc elt (purecopy (list form))))))) (defvar after-load-functions nil "Special hook run after loading a file. -- 2.39.2