From: Stefan Monnier Date: Mon, 26 Nov 2012 19:56:14 +0000 (-0500) Subject: * lisp/emacs-lisp/advice.el (ad-should-compile): Don't compile advice if the X-Git-Tag: emacs-24.3.90~173^2~9^2~141^2~4 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=848a2dd19d1b030303de1b568edf9e33281e4440;p=emacs.git * 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 --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 9e403af6416..2771ca42f25 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2012-11-26 Stefan Monnier + + * emacs-lisp/advice.el (ad-should-compile): Don't compile advice if the + base function is not yet defined (bug#12965). + (ad-activate-advised-definition): Use ad-compile-function. + (ad-activate): Use cond. + 2012-11-25 Leo Liu * textmodes/sgml-mode.el (sgml-tag): Fix indentation for closing tag. @@ -10,14 +17,14 @@ Texinfo integration. * textmodes/reftex.el (reftex-section-pre-regexp) - (reftex-section-post-regexp, reftex-section-info-function): New - variable. - (reftex-compile-variables): Use variables - reftex-section-pre-regexp, reftex-section-post-regexp, and - reftex-section-info-function in order to be compatible with Texinfo integration. + (reftex-section-post-regexp, reftex-section-info-function): + New variable. + (reftex-compile-variables): Use variables reftex-section-pre-regexp, + reftex-section-post-regexp, and reftex-section-info-function in order + to be compatible with Texinfo integration. - * textmodes/reftex-toc.el (reftex-toc-promote-action): use - reftex-section-pre-regexp variable in order to be compatible with + * textmodes/reftex-toc.el (reftex-toc-promote-action): + use reftex-section-pre-regexp variable in order to be compatible with Texinfo integration. 2012-11-25 Chong Yidong 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)