diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2012-11-26 14:56:14 -0500 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2012-11-26 14:56:14 -0500 |
commit | 848a2dd19d1b030303de1b568edf9e33281e4440 (patch) | |
tree | 78cf366a8c94bf407b59024468b190f70fd0de30 /lisp/emacs-lisp/advice.el | |
parent | 551aaa664fcc94c80a7cb4f34bdc12c7dfe18fb2 (diff) | |
download | emacs-848a2dd19d1b030303de1b568edf9e33281e4440.tar.gz |
* 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
Diffstat (limited to 'lisp/emacs-lisp/advice.el')
-rw-r--r-- | lisp/emacs-lisp/advice.el | 55 |
1 files changed, 27 insertions, 28 deletions
diff --git a/lisp/emacs-lisp/advice.el b/lisp/emacs-lisp/advice.el index c2ebb3bbdc6..a947dceccc9 100644 --- a/lisp/emacs-lisp/advice.el +++ b/lisp/emacs-lisp/advice.el @@ -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) |