1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-09 07:40:39 -08:00

* lisp/emacs-lisp/advice.el (ad-should-compile): Don't compile advice if the

base function is not yet defined.
(ad-activate-advised-definition): Use ad-compile-function.
(ad-activate): Use cond.

Fixes: debbugs:12965
This commit is contained in:
Stefan Monnier 2012-11-26 14:56:14 -05:00
parent 551aaa664f
commit 848a2dd19d
2 changed files with 41 additions and 35 deletions

View file

@ -2900,19 +2900,18 @@ If COMPILE is non-nil and not a negative number then it returns t.
If COMPILE is a negative number then it returns nil.
If COMPILE is nil then the result depends on the value of
`ad-default-compilation-action' (which see)."
(if (integerp compile)
(>= compile 0)
(if compile
compile
(cond ((eq ad-default-compilation-action 'never)
nil)
((eq ad-default-compilation-action 'always)
t)
((eq ad-default-compilation-action 'like-original)
(or (ad-subr-p (ad-get-orig-definition function))
(ad-compiled-p (ad-get-orig-definition function))))
;; everything else means `maybe':
(t (featurep 'byte-compile))))))
(cond
;; Don't compile until the real function definition is known (bug#12965).
((not (ad-real-orig-definition function)) nil)
((integerp compile) (>= compile 0))
(compile)
((eq ad-default-compilation-action 'never) nil)
((eq ad-default-compilation-action 'always) t)
((eq ad-default-compilation-action 'like-original)
(or (ad-subr-p (ad-get-orig-definition function))
(ad-compiled-p (ad-get-orig-definition function))))
;; everything else means `maybe':
(t (featurep 'byte-compile))))
(defun ad-activate-advised-definition (function compile)
"Redefine FUNCTION with its advised definition from cache or scratch.
@ -2927,7 +2926,7 @@ The current definition and its cache-id will be put into the cache."
(ad-make-advised-definition function)))
(advice-add function :around advicefunname)
(if (ad-should-compile function compile)
(byte-compile advicefunname))
(ad-compile-function function))
(if verified-cached-definition
(if (not (eq verified-cached-definition
(symbol-function advicefunname)))
@ -3003,20 +3002,20 @@ definition will always be cached for later usage."
(interactive
(list (ad-read-advised-function "Activate advice of")
current-prefix-arg))
(if (not (ad-is-advised function))
(error "ad-activate: `%s' is not advised" function)
;; Just return for forward advised and not yet defined functions:
(if (ad-get-orig-definition function)
(if (not (ad-has-any-advice function))
(ad-unadvise function)
;; Otherwise activate the advice:
(cond ((ad-has-redefining-advice function)
(ad-activate-advised-definition function compile)
(ad-set-advice-info-field function 'active t)
(eval (ad-make-hook-form function 'activation))
function)
;; Here we are if we have all disabled advices:
(t (ad-deactivate function)))))))
(cond
((not (ad-is-advised function))
(error "ad-activate: `%s' is not advised" function))
;; Just return for forward advised and not yet defined functions:
((not (ad-get-orig-definition function)) nil)
((not (ad-has-any-advice function)) (ad-unadvise function))
;; Otherwise activate the advice:
((ad-has-redefining-advice function)
(ad-activate-advised-definition function compile)
(ad-set-advice-info-field function 'active t)
(eval (ad-make-hook-form function 'activation))
function)
;; Here we are if we have all disabled advices:
(t (ad-deactivate function))))
(defalias 'ad-activate-on 'ad-activate)