summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2013-01-08 10:24:56 -0500
committerStefan Monnier <monnier@iro.umontreal.ca>2013-01-08 10:24:56 -0500
commita731fc1bb01f3c0c8eb2ca24a1c5cd7cd7373059 (patch)
treeb7720ad698b8a7fd074d33f9bcbf41d696a81734 /lisp/emacs-lisp
parent2a22c83bb05ecd98cee091fdf59d2f687f83f5dc (diff)
downloademacs-a731fc1bb01f3c0c8eb2ca24a1c5cd7cd7373059.tar.gz
emacs-a731fc1bb01f3c0c8eb2ca24a1c5cd7cd7373059.tar.bz2
emacs-a731fc1bb01f3c0c8eb2ca24a1c5cd7cd7373059.zip
* lisp/emacs-lisp/nadvice.el (advice--tweak): New function.
(advice--remove-function, advice--subst-main): Use it. * lisp/emacs-lisp/advice.el: Update commentary.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r--lisp/emacs-lisp/advice.el8
-rw-r--r--lisp/emacs-lisp/nadvice.el39
2 files changed, 22 insertions, 25 deletions
diff --git a/lisp/emacs-lisp/advice.el b/lisp/emacs-lisp/advice.el
index d9d8e4f3b02..07340f06a13 100644
--- a/lisp/emacs-lisp/advice.el
+++ b/lisp/emacs-lisp/advice.el
@@ -589,13 +589,11 @@
;; Advice implements forward advice mainly via the following: 1) Separation
;; of advice definition and activation that makes it possible to accumulate
;; advice information without having the original function already defined,
-;; 2) special versions of the built-in functions `fset/defalias' which check
-;; for advice information whenever they define a function. If advice
-;; information was found then the advice will immediately get activated when
-;; the function gets defined.
+;; 2) Use of the `defalias-fset-function' symbol property which lets
+;; us advise the function when it gets defined.
;; Automatic advice activation means, that whenever a function gets defined
-;; with either `defun', `defmacro', `fset' or by loading a byte-compiled
+;; with either `defun', `defmacro', `defalias' or by loading a byte-compiled
;; file, and the function has some advice-info stored with it then that
;; advice will get activated right away.
diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el
index b4d6fac92a2..1715763d482 100644
--- a/lisp/emacs-lisp/nadvice.el
+++ b/lisp/emacs-lisp/nadvice.el
@@ -167,20 +167,26 @@ WHERE is a symbol to select an entry in `advice--where-alist'."
(setq definition (advice--cdr definition))))
found))
-;;;###autoload
-(defun advice--remove-function (flist function)
+(defun advice--tweak (flist tweaker)
(if (not (advice--p flist))
- flist
+ (funcall tweaker nil flist nil)
(let ((first (advice--car flist))
+ (rest (advice--cdr flist))
(props (advice--props flist)))
- (if (or (equal function first)
- (equal function (cdr (assq 'name props))))
- (advice--cdr flist)
- (let* ((rest (advice--cdr flist))
- (nrest (advice--remove-function rest function)))
- (if (eq rest nrest) flist
- (advice--make-1 (aref flist 1) (aref flist 3)
- first nrest props)))))))
+ (or (funcall tweaker first rest props)
+ (let ((nrest (advice--tweak rest tweaker)))
+ (if (eq rest nrest) flist
+ (advice--make-1 (aref flist 1) (aref flist 3)
+ first nrest props)))))))
+
+;;;###autoload
+(defun advice--remove-function (flist function)
+ (advice--tweak flist
+ (lambda (first rest props)
+ (if (or (not first)
+ (equal function first)
+ (equal function (cdr (assq 'name props))))
+ rest))))
(defvar advice--buffer-local-function-sample nil)
@@ -269,15 +275,8 @@ of the piece of advice."
;;;; Specific application of add-function to `symbol-function' for advice.
(defun advice--subst-main (old new)
- (if (not (advice--p old))
- new
- (let* ((first (advice--car old))
- (rest (advice--cdr old))
- (props (advice--props old))
- (nrest (advice--subst-main rest new)))
- (if (equal rest nrest) old
- (advice--make-1 (aref old 1) (aref old 3)
- first nrest props)))))
+ (advice--tweak old
+ (lambda (first _rest _props) (if (not first) new))))
(defun advice--normalize (symbol def)
(cond