emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 24bd525: * lisp/emacs-lisp/nadvice.el (advice--defa


From: Stefan Monnier
Subject: [Emacs-diffs] master 24bd525: * lisp/emacs-lisp/nadvice.el (advice--defalias-fset): Strip advices
Date: Tue, 18 Jul 2017 14:07:45 -0400 (EDT)

branch: master
commit 24bd52565a7652817e6bf9b7a5cb9ad99c955a13
Author: Stefan Monnier <address@hidden>
Commit: Stefan Monnier <address@hidden>

    * lisp/emacs-lisp/nadvice.el (advice--defalias-fset): Strip advices
    
    This tries to make sure that (defalias F (symbol-function F)) stays a no-op.
---
 lisp/emacs-lisp/nadvice.el | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el
index fd1cd2c..c68ecbc 100644
--- a/lisp/emacs-lisp/nadvice.el
+++ b/lisp/emacs-lisp/nadvice.el
@@ -385,6 +385,18 @@ of the piece of advice."
 
 (defun advice--defalias-fset (fsetfun symbol newdef)
   (unless fsetfun (setq fsetfun #'fset))
+  ;; `newdef' shouldn't include advice wrappers, since that's what *we* manage!
+  ;; So if `newdef' includes advice wrappers, it's usually because someone
+  ;; naively took (symbol-function F) and then passed that back to `defalias':
+  ;; let's strip them away.
+  (cond
+   ((advice--p newdef) (setq newdef (advice--cd*r newdef)))
+   ((and (eq 'macro (car-safe newdef))
+         (advice--p (cdr newdef)))
+    (setq newdef `(macro . ,(advice--cd*r (cdr newdef))))))
+  ;; The saved-rewrite is specific to the current value, so since we are about
+  ;; to overwrite that current value with new value, the old saved-rewrite is
+  ;; not relevant any more.
   (when (get symbol 'advice--saved-rewrite)
     (put symbol 'advice--saved-rewrite nil))
   (setq newdef (advice--normalize symbol newdef))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]