From 29380dcd30523e057d8fd45106f1d077e4212198 Mon Sep 17 00:00:00 2001 From: Michael Heerdegen Date: Thu, 14 Nov 2019 17:47:51 +0100 Subject: [PATCH] WIP: Try to fix edebug-remove-instrumentation for advised funs --- lisp/emacs-lisp/edebug.el | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el index 5d52704410..e0fcdf0f86 100644 --- a/lisp/emacs-lisp/edebug.el +++ b/lisp/emacs-lisp/edebug.el @@ -4571,6 +4571,23 @@ edebug-unload-function ;; Continue standard unloading. nil) +(defun edebug--unwrap*-symbol-function (symbol) + ;; Try to unwrap SYMBOL's symbol function. The result is suitable + ;; to be fbound to SYMBOL with `defalias'. When no unwrapping could + ;; be done return nil. + (pcase (symbol-function symbol) + ((or (and `(macro . ,(and (pred advice--p) ad)) (let was-macro t)) + (and (pred advice--p) ad (let was-macro nil))) + ;; `defalias' takes care of any advises so we can just strip them + (let* ((orig-f (advice--cd*r ad)) + (unwrapped (edebug-unwrap* orig-f))) + (cond + ((equal unwrapped orig-f) nil) + (was-macro `(macro . ,unwrapped)) + (t unwrapped)))) + (sym-fun (let ((unwrapped (edebug-unwrap* sym-fun))) + (if (equal sym-fun unwrapped) nil unwrapped))))) + (defun edebug-remove-instrumentation (functions) "Remove Edebug instrumentation from FUNCTIONS. Interactively, the user is prompted for the function to remove @@ -4582,10 +4599,10 @@ edebug-remove-instrumentation (lambda (symbol) (when (and (get symbol 'edebug) (or (functionp symbol) - (macrop symbol))) - (let ((unwrapped (edebug-unwrap* (symbol-function symbol)))) - (unless (equal unwrapped (symbol-function symbol)) - (push symbol functions))))) + (macrop symbol)) + (edebug--unwrap*-symbol-function + symbol)) + (push symbol functions))) obarray) (unless functions (error "Found no functions to remove instrumentation from")) @@ -4599,8 +4616,9 @@ edebug-remove-instrumentation functions))))) ;; Remove instrumentation. (dolist (symbol functions) - (setf (symbol-function symbol) - (edebug-unwrap* (symbol-function symbol)))) + (when-let ((unwrapped + (edebug--unwrap*-symbol-function symbol))) + (defalias symbol unwrapped))) (message "Removed edebug instrumentation from %s" (mapconcat #'symbol-name functions ", "))) -- 2.24.0