[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))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master 24bd525: * lisp/emacs-lisp/nadvice.el (advice--defalias-fset): Strip advices,
Stefan Monnier <=