]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/emacs-lisp/nadvice.el: Add `depth' property to manage ordering.
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 12 Dec 2013 19:47:11 +0000 (14:47 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 12 Dec 2013 19:47:11 +0000 (14:47 -0500)
(advice--make): Pay attention to `depth'.
(advice--make-1): Don't autoload commands eagerly.
* lisp/emacs-lisp/elp.el (elp-instrument-function):
* lisp/emacs-lisp/trace.el (trace-function-internal):
* lisp/emacs-lisp/debug.el (debug-on-entry): Keep them "first".

* lisp/iswitchb.el (iswitchb-mode): Don't belittle ido.

lisp/ChangeLog
lisp/emacs-lisp/debug.el
lisp/emacs-lisp/elp.el
lisp/emacs-lisp/nadvice.el
lisp/emacs-lisp/trace.el
lisp/iswitchb.el

index c761bce7518c09f87ce6b603658d1d758ed82429..59fe5fff0b8b7082b86bf1cb8875fa9af6884f7c 100644 (file)
@@ -1,3 +1,14 @@
+2013-12-12  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * emacs-lisp/nadvice.el: Add `depth' property to manage ordering.
+       (advice--make): Pay attention to `depth'.
+       (advice--make-1): Don't autoload commands eagerly.
+       * emacs-lisp/elp.el (elp-instrument-function):
+       * emacs-lisp/trace.el (trace-function-internal):
+       * emacs-lisp/debug.el (debug-on-entry): Keep them "first".
+
+       * iswitchb.el (iswitchb-mode): Don't belittle ido.
+
 2013-12-12  Eli Zaretskii  <eliz@gnu.org>
 
        * term/w32-win.el (w32-handle-dropped-file):
@@ -15,8 +26,8 @@
 
 2013-12-12  Nathan Trapuzzano  <nbtrap@nbtrap.com>  (tiny change)
 
-       * progmodes/python.el (python-indent-calculate-indentation): When
-       determining indentation, don't treat "return", "pass", etc., as
+       * progmodes/python.el (python-indent-calculate-indentation):
+       When determining indentation, don't treat "return", "pass", etc., as
        operators when they are just string constituents.  (Bug#15812)
 
 2013-12-12  Juri Linkov  <juri@jurta.org>
@@ -56,7 +67,7 @@
 2013-12-11  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * emacs-lisp/smie.el (smie-indent--hanging-p): Don't bother matching
-       comment-start-skip, since it fails when that uses submatch 1 (bug#16041).
+       comment-start-skip, which fails when that uses submatch 1 (bug#16041).
 
        * emulation/cua-base.el (cua-paste): Add `delete-selection' property
        instead of deleting the selection "by hand" (bug#16098).
 
 2013-12-10  Teodor Zlatanov  <tzz@lifelogs.com>
 
-       * emacs-lisp/package.el (package-keyword-button-action): Remove
-       finder.el require dependency.
+       * emacs-lisp/package.el (package-keyword-button-action):
+       Remove finder.el require dependency.
 
 2013-12-09  Teodor Zlatanov  <tzz@lifelogs.com>
 
 
 2013-12-09  Cameron Desautels  <camdez@gmail.com>  (tiny change)
 
-       * progmodes/ruby-mode.el (ruby-forward-string): Document.  Handle
-       caret-delimited strings (Bug#16079).
+       * progmodes/ruby-mode.el (ruby-forward-string): Document.
+       Handle caret-delimited strings (Bug#16079).
 
 2013-12-09  Dmitry Gutov  <dgutov@yandex.ru>
 
-       * progmodes/ruby-mode.el (ruby-accurate-end-of-block): When
-       `ruby-use-smie' is t, use `smie-forward-sexp' instead of
+       * progmodes/ruby-mode.el (ruby-accurate-end-of-block):
+       When `ruby-use-smie' is t, use `smie-forward-sexp' instead of
        `ruby-parse-partial' (Bug#16078).
 
 2013-12-09  Leo Liu  <sdl.web@gmail.com>
        "default" is actually a key in an object literal.
        (js--same-line): New function.
        (js--multi-line-declaration-indentation): Use it.
-       (js--indent-in-array-comp, js--array-comp-indentation): New
-       functions.
+       (js--indent-in-array-comp, js--array-comp-indentation):
+       New functions.
        (js--proper-indentation): Use them, to handle array comprehension
        continuations.
 
index dbd0f092446ada802a8d6b7538b84eed6bb93a95..77abbc96d2d4598cad19e3dfbb46c50b02c5df53 100644 (file)
@@ -798,7 +798,8 @@ Redefining FUNCTION also cancels it."
                         (not (special-form-p symbol))))
                t nil nil (symbol-name fn)))
      (list (if (equal val "") fn (intern val)))))
-  (advice-add function :before #'debug--implement-debug-on-entry)
+  (advice-add function :before #'debug--implement-debug-on-entry
+              '((depth . -100)))
   function)
 
 (defun debug--function-list ()
index f1321eb4e6dac9f514b3275a3d761d722ffb7f37..1187169b034b5f71a1300de873fe148b0c4e74d1 100644 (file)
@@ -251,7 +251,7 @@ FUNSYM must be a symbol of a defined function."
     ;; Set the symbol's new profiling function definition to run
     ;; ELP wrapper.
     (advice-add funsym :around (elp--make-wrapper funsym)
-                `((name . ,elp--advice-name)))))
+                `((name . ,elp--advice-name) (depth . -99)))))
 
 (defun elp--instrumented-p (sym)
   (advice-member-p elp--advice-name sym))
index 0352164caf5f0706196bdac1ede81b9e585f36f5..9f539338b591c9efe1c53c372fd526dabb147ad3 100644 (file)
@@ -129,8 +129,6 @@ Each element has the form (WHERE BYTECODE STACK) where:
   ;; TODO: make it so that interactive spec can be a constant which
   ;; dynamically checks the advice--car/cdr to do its job.
   ;; For that, advice-eval-interactive-spec needs to be more faithful.
-  ;; FIXME: The calls to interactive-form below load autoloaded functions
-  ;; too eagerly.
   (let ((fspec (cadr (interactive-form function))))
     (when (eq 'function (car-safe fspec)) ;; Macroexpanded lambda?
       (setq fspec (nth 1 fspec)))
@@ -147,19 +145,29 @@ Each element has the form (WHERE BYTECODE STACK) where:
          (apply #'make-byte-code 128 byte-code
                 (vector #'apply function main props) stack-depth
                 advice--docstring
-                (when (or (commandp function) (commandp main))
-                  (list (advice--make-interactive-form
-                         function main))))))
+                (and (or (commandp function) (commandp main))
+                    (not (and (symbolp main) ;; Don't autoload too eagerly!
+                              (autoloadp (symbol-function main))))
+                     (list (advice--make-interactive-form
+                            function main))))))
     (when adv-sig (puthash advice adv-sig advertised-signature-table))
     advice))
 
 (defun advice--make (where function main props)
   "Build a function value that adds FUNCTION to MAIN at WHERE.
 WHERE is a symbol to select an entry in `advice--where-alist'."
-  (let ((desc (assq where advice--where-alist)))
-    (unless desc (error "Unknown add-function location `%S'" where))
-    (advice--make-1 (nth 1 desc) (nth 2 desc)
-                    function main props)))
+  (let ((fd (or (cdr (assq 'depth props)) 0))
+        (md (if (advice--p main)
+                (or (cdr (assq 'depth (advice--props main))) 0))))
+    (if (and md (> fd md))
+        ;; `function' should go deeper.
+        (let ((rest (advice--make where function (advice--cdr main) props)))
+          (advice--make-1 (aref main 1) (aref main 3)
+                          (advice--car main) rest (advice--props main)))
+      (let ((desc (assq where advice--where-alist)))
+        (unless desc (error "Unknown add-function location `%S'" where))
+        (advice--make-1 (nth 1 desc) (nth 2 desc)
+                        function main props)))))
 
 (defun advice--member-p (function name definition)
   (let ((found nil))
@@ -216,8 +224,6 @@ different, but `function-equal' will hopefully ignore those differences.")
 ;;;###autoload
 (defmacro add-function (where place function &optional props)
   ;; TODO:
-  ;; - provide some kind of control over ordering.  E.g. debug-on-entry, ELP
-  ;;   and tracing want to stay first.
   ;; - maybe let `where' specify some kind of predicate and use it
   ;;   to implement things like mode-local or eieio-defmethod.
   ;;   Of course, that only makes sense if the predicates of all advices can
@@ -245,6 +251,10 @@ If FUNCTION was already added, do nothing.
 PROPS is an alist of additional properties, among which the following have
 a special meaning:
 - `name': a string or symbol.  It can be used to refer to this piece of advice.
+- `depth': a number indicating a preference w.r.t ordering.
+  The default depth is 0.  By convention, a depth of 100 means that
+  the advice  should be innermost (i.e. at the end of the list),
+  whereas a depth of -100 means that the advice should be outermost.
 
 If PLACE is a simple variable, only its global value will be affected.
 Use (local 'VAR) if you want to apply FUNCTION to VAR buffer-locally.
index 3a2c44a8da69d86acc75d09add6ccb8828cbdaa5..cbbfd268445de1ab3a3234e3b46f6828ba81c471 100644 (file)
@@ -256,7 +256,7 @@ be printed along with the arguments in the trace."
    function :around
    (trace-make-advice function (or buffer trace-buffer) background
                       (or context (lambda () "")))
-   `((name . ,trace-advice-name))))
+   `((name . ,trace-advice-name) (depth . -100))))
 
 (defun trace-is-traced (function)
   (advice-member-p trace-advice-name function))
index 796420a2ede41ae9254473d23c68c2d370457947..b802e7418d7c3e860b63fe4bc95acf914dc92a26 100644 (file)
@@ -1427,7 +1427,8 @@ between buffers using substrings.  See `iswitchb' for details."
       (add-hook 'minibuffer-setup-hook 'iswitchb-minibuffer-setup)
     (remove-hook 'minibuffer-setup-hook 'iswitchb-minibuffer-setup)))
 
-(make-obsolete 'iswitchb-mode 'icomplete-mode "24.4")
+(make-obsolete 'iswitchb-mode
+               "use icomplete-mode or ido-mode instead" "24.4")
 
 (provide 'iswitchb)