From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Michael Heerdegen Newsgroups: gmane.emacs.bugs Subject: bug#54119: 29.0.50; Edebug: Jumping commands in recursive definitions Date: Fri, 25 Feb 2022 04:36:47 +0100 Message-ID: <8735k7ty5s.fsf@web.de> References: <87czjez0jg.fsf@web.de> Mime-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="40244"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) To: 54119@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Feb 25 04:39:32 2022 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nNRS7-000AHa-NU for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 25 Feb 2022 04:39:31 +0100 Original-Received: from localhost ([::1]:48664 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nNRS1-0004dc-Ag for geb-bug-gnu-emacs@m.gmane-mx.org; Thu, 24 Feb 2022 22:39:25 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:52452) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nNRPi-0002u3-8b for bug-gnu-emacs@gnu.org; Thu, 24 Feb 2022 22:37:05 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:57065) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nNRPh-0004dJ-Rd for bug-gnu-emacs@gnu.org; Thu, 24 Feb 2022 22:37:01 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1nNRPh-0001aC-Q0 for bug-gnu-emacs@gnu.org; Thu, 24 Feb 2022 22:37:01 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Michael Heerdegen Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 25 Feb 2022 03:37:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 54119 X-GNU-PR-Package: emacs Original-Received: via spool by 54119-submit@debbugs.gnu.org id=B54119.16457602176072 (code B ref 54119); Fri, 25 Feb 2022 03:37:01 +0000 Original-Received: (at 54119) by debbugs.gnu.org; 25 Feb 2022 03:36:57 +0000 Original-Received: from localhost ([127.0.0.1]:50962 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nNRPd-0001Zs-0j for submit@debbugs.gnu.org; Thu, 24 Feb 2022 22:36:57 -0500 Original-Received: from mout.web.de ([212.227.15.14]:44179) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nNRPa-0001Zd-Uu for 54119@debbugs.gnu.org; Thu, 24 Feb 2022 22:36:55 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1645760208; bh=qabkPSi2IoH0JDhdKnI9RIB5ow0Ie76zEUax3BcWRtI=; h=X-UI-Sender-Class:From:To:Subject:References:Date:In-Reply-To; b=cyz/bcS/gi7M+XnsGhwWAjNIAhyGVUojfHP9+gWkd0t+ZKSzXPH94o8/uFL0KuOia WpL7Pia2w7HERXRLytPEh7kFusF2HvVsI0/d21rCqVsza/znsEfXdPTSxHGkJFvfqw +ZP1ejB3934evSTPpvAyn5Vz8/sQPBMtGClBXJBE= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Original-Received: from drachen.dragon ([84.60.174.212]) by smtp.web.de (mrweb005 [213.165.67.108]) with ESMTPSA (Nemesis) id 1MTfon-1nmy5d2m7B-00TjWD for <54119@debbugs.gnu.org>; Fri, 25 Feb 2022 04:36:48 +0100 In-Reply-To: <87czjez0jg.fsf@web.de> (Michael Heerdegen's message of "Wed, 23 Feb 2022 05:09:39 +0100") X-Provags-ID: V03:K1:3cX4WPEabsEwDXr6XwCArwCcMKXMl47aEXQp9qFFMVdpDoMDNbr P52FWDX3cd4sqiTDdhrHl9J8QadG77gh4bQr0bzAt32HepSL494PByrcbGIq0sFN4xVBsZM ad88hePsEOYVVfGfnD//Nq6oJdZ/gheagpEDd9MZRwp2yi0OmLlgapLdEP78TF0fV907B4W MZc7vV2P4D+StXE03J7rQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:CDM+mmuK/YE=:kMcBcCEf2KEJWrRKVUnbkv 9V4BikC/yQKu9OsutjkeDTBIhJQ25MrFyFae65vmMzEo111jV8Nrzt0wdvSLG/FKa/GKmlT3u k4m9a3kvn495BgBx893tElVCpv933+FP6k8z+/QzWFPwi9C5SBzjCw2voKmC+91cGZTf5NHuZ vjeaYIdl/Zl58CR22q8KtWa5r+nzSQzgmHEk0hAFGdSiA8VsOQad1WHPmuOH6i7VLtSc82kXC qtSjzgFKW8pygR43QfQaIBCjSZdHifeT7gbArteqZhfbqFWcXW99BaygOeBLkBJ9FR4KcjCjf p/iE4SGDsw3cKPEuRI8hrQ7WfwbsAfyGr3LiSCTC3TUpR5lFz1jduqhGMpmY2q1gDAzCYV83n zkaKlTHMbKQqdzsJvjgiKqX84lLlFuMkzDgsm6RIsDwmxyiPUdbQyG1tZLlsKgqnntmdIj2z3 zI0W3IAENboxBvuQReIcGDt0cXNCWGy4p4iFeU51I9dwj1lZgYdW0kE6XxIcPX1UFIgtR+iOP UjcGJfXItOu282zX0bBUkin5QnFN4wIwQHiPsP6ctGKd8TP+5sLxwtdE9sj1EKnPoqjXN/j9c KGVq+4f+Hnhtbtpi4kx4RkbH2V4hQbZ3NcEXn3vV9IURdITO0Q+E9+uIbIA4Mlwmm30Q2Xd4J tOy8lv93mRzNWOmOvbMjHeS/qe/AsAYuDkdSflDxspI/h9yUQtI2scqvBRTqA7JB54invKCMx H0JmGo0H+fUKOU1qb9u/9qrdQ9g0JMO1k7DuONVF1bTsUXsgB+5L35FfG/vCg9zNdZ1a6X0I X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:227612 Archived-At: Michael Heerdegen writes: > #+begin_src emacs-lisp > (defun my-factorial (n) (if (< n 2) 1 (* n (my-factorial (1- n))))) > #+end_src We could exploit the fact that the function is already instrumented. Every function call of the definition is then wrapped in an `edebug-after' call: #+begin_src emacs-lisp (symbol-function 'my-factorial) =3D=3D> (closure (t) (n) (edebug-enter 'my-factorial (list n) #'(lambda nil (edebug-after (edebug-before 0) 12 (if (edebug-after (edebug-before 1) 3 (< (edebug-after 0 2 n) 2)) 1 (edebug-after (edebug-before 4) 11 (* etc...))))))) #+end_src We could solve this bug if we temporarily change the function binding of `edebug-after'. This is a bit tricky, though, mainly because it's not trivial to restore the original setup: - two places must be updated: (symbol-function 'edebug-after) and the entry in `edebug-behavior-alist' - `edebug-forward-sexp' terminates immediately, it's on the "meta level", undoing the change in that function is too early, since we must expect recursive calls of `edebug-after'. - the actual code is evaluated as an argument of `edebug-after', so the replacement can also not restore the original function binding Which means: either we also redefine `edebug-before', or we use something very different. Here is a proof of concept using `post-command-hook' for restoring: #+begin_src emacs-lisp (defun my-edebug-forward-sexp--around-ad (f &rest args) (cl-macrolet ((after-fun () '(nth 2 (cdr (assq 'edebug edebug-behavior-alist))))) (let ((orig-after-fun (after-fun))) (cl-labels ((set-after-fun (f) (setf (symbol-function 'edebug-after) (setf (after-fun) f))) (reset-after-fun () (remove-hook 'post-command-hook #'reset-after-fun) (set-after-fun orig-after-fun))) (set-after-fun #'edebug-fast-after) (add-hook 'post-command-hook #'reset-after-fun) (apply f args))))) (advice-add 'edebug-forward-sexp :around #'my-edebug-forward-sexp--around-= ad) (advice-add 'edebug-step-out :around #'my-edebug-forward-sexp--around-= ad) #+end_src Seems to do the job. A patch would not need an advice of course. Better ideas welcome. Michael.