* lisp/emacs-lisp/nadvice.el (advice--defalias-fset): Strip advices
authorStefan Monnier <monnier@iro.umontreal.ca>
Tue, 18 Jul 2017 18:07:16 +0000 (14:07 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Tue, 18 Jul 2017 18:07:41 +0000 (14:07 -0400)
This tries to make sure that (defalias F (symbol-function F)) stays a no-op.

lisp/emacs-lisp/nadvice.el

index fd1cd2c7aafc992e7e3e51b18fc9598eaa4d5945..c68ecbc59eec841ff08653dfab50bbc2f858fc76 100644 (file)
@@ -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))