unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Lisp debugger problems.
@ 2005-02-24  0:16 Lute Kamstra
  2005-02-28  1:37 ` Lute Kamstra
  2005-02-28 11:26 ` Richard Stallman
  0 siblings, 2 replies; 10+ messages in thread
From: Lute Kamstra @ 2005-02-24  0:16 UTC (permalink / raw)


I'm checking the documentation of the lisp debugger
(lispref/debugging.texi) and I ran into some problems.

The first problem is with canceling the effect of debug-on-error by
redefining a function.  The lisp manual currently explains that I can
use debug-on-entry to let a function enter the debugger and that using
cancel-debug-on-entry or redefining the function cancels this effect.
However, in some cases, the debugger can cancel the effect of
redefining a function behind your back.  Here is an example:

  (defun fun1 () 1) => fun1
  (defun fun2 () t) => fun2
  (debug-on-entry 'fun1) => fun1
  (symbol-function 'fun1) => (lambda nil (debug (quote debug)) 1)

fun1 is now set up to break on entry.

  (defun fun1 () 2) => fun1
  (symbol-function 'fun1) => (lambda nil 2)

Redefining fun1 cancelled the effect of debug-on-entry.

(debug-on-entry 'fun2) => fun2
(symbol-function 'fun1) =>  (lambda nil (debug (quote debug)) 2)

debug-on-entry on fun2, caused fun1 to be set up to break on entry as
well.  This is confusing.

The root of this problem appears to be the use of debug-function-list.
The debugger uses this variable to store a list of functions that are
set to break on entry.  debug-on-entry adds its argument to this list
and cancel-debug-on-entry removes its argument from this list.
Redefining a function does not modify this list, however.  So the
debug-function-list might not reflect the actual situation.

I think that it's probably a good idea to add a function that checks
debug-function-list and removes any function that is not set to break
on entry and to call this function before debug-function-list is used.
I have some problems understanding the code in
lisp/emacs-lisp/debug.el, however.

There is this function debugger-reenable that sets all functions in
debug-function-list to break on entry.  I assume that this function is
meant to work together with debugger-jump which cancels the effect of
debug-on-entry for all functions in debug-function-list but does not
modify the list itself.  So the next time debug is called (scheduled
by debugger-jump by means of debug-frame), it calls debugger-reenable
to make the cancellation effect of debugger-jump temporary.  This make
sense to me.

What I don't understand in why debug-on-entry and
cancel-debug-on-entry call debugger-reenable as well (thus causing the
strange behavior in the example above).  What am I missing?

A second problem I encountered is with debugger-jump.  It is currently
not documented in the lisp manual so I'm trying to figure out what it
does.  From what I understand, it is intended to work just like
debugger-continue with the difference that it temporarily cancels the
effect of debug-on-entry for all functions.  This is not the case
however:

  (defun funa () 1)
  (debug-on-entry 'funa)
  (funa)

enters the debugger:

------ Buffer: *Backtrace* ------
Debugger entered--entering a function:
* funa()
  eval((funa))
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp)
------ Buffer: *Backtrace* ------

When I now press j to invoke debugger-jump, I see:

------ Buffer: *Backtrace* ------
Debugger entered--returning value: nil
  funa()
  eval((funa))
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp)
------ Buffer: *Backtrace* ------

I would expect a return value of 1.  When I press c instead of j (to
invoke debugger-continue), the debugger does give a return value of 1.
Is this a bug?

Lute.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Lisp debugger problems.
  2005-02-24  0:16 Lisp debugger problems Lute Kamstra
@ 2005-02-28  1:37 ` Lute Kamstra
  2005-02-28  9:44   ` Lute Kamstra
  2005-02-28 11:26 ` Richard Stallman
  1 sibling, 1 reply; 10+ messages in thread
From: Lute Kamstra @ 2005-02-28  1:37 UTC (permalink / raw)


Lute Kamstra <Lute.Kamstra.lists@xs4all.nl> writes:

[...]

> A second problem I encountered is with debugger-jump.  It is currently
> not documented in the lisp manual so I'm trying to figure out what it
> does.  From what I understand, it is intended to work just like
> debugger-continue with the difference that it temporarily cancels the
> effect of debug-on-entry for all functions.  This is not the case
> however:
>
>   (defun funa () 1)
>   (debug-on-entry 'funa)
>   (funa)
>
> enters the debugger:
>
> ------ Buffer: *Backtrace* ------
> Debugger entered--entering a function:
> * funa()
>   eval((funa))
>   eval-last-sexp-1(nil)
>   eval-last-sexp(nil)
>   call-interactively(eval-last-sexp)
> ------ Buffer: *Backtrace* ------
>
> When I now press j to invoke debugger-jump, I see:
>
> ------ Buffer: *Backtrace* ------
> Debugger entered--returning value: nil
>   funa()
>   eval((funa))
>   eval-last-sexp-1(nil)
>   eval-last-sexp(nil)
>   call-interactively(eval-last-sexp)
> ------ Buffer: *Backtrace* ------
>
> I would expect a return value of 1.  When I press c instead of j (to
> invoke debugger-continue), the debugger does give a return value of 1.
> Is this a bug?

I investigated this problem a bit more.  It seems that the bug only
happens when the body of a function contains just one sexp.  For
example, when I do:

  (defun fun (a) "Docstring." (interactive) (1+ a))
  (debug-on-entry 'fun)
  (fun 1)

to enter the debugger and then type j to invoke debugger-jump, then
the return value is nil (wrong).  But when I do:

  (defun fun (a) "Docstring." (interactive) a (1+ a))
  (debug-on-entry 'fun)
  (fun 1)

to enter the debugger and then type j to invoke debugger-jump, then
the return value is 2 (right).

debug-on-entry inserts (debug 'debug) into the definition of fun:

  (defun fun (a) "Docstring." (interactive) (1+ a))
  (symbol-function 'fun)
    => (lambda (a) "Docstring." (interactive) (1+ a))
  (debug-on-entry 'fun)
  (symbol-function 'fun)
    => (lambda (a) "Docstring." (interactive) (debug (quote debug)) (1+ a))

So when fun is called, it invokes the debugger.  Then the debugger
calls debugger-jump, which changes the definition of fun by removing
(debug 'debug).  So the definition of fun is changed in the middle of
a call to fun.  My guess is that this somehow confuses the lisp
interpreter (in case the body of fun consists of just one sexp) and
causes it to produce the wrong return value.

Maybe somebody with more experience with the lisp interpreter's
internals can debug this further?

Lute.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Lisp debugger problems.
  2005-02-28  1:37 ` Lute Kamstra
@ 2005-02-28  9:44   ` Lute Kamstra
  0 siblings, 0 replies; 10+ messages in thread
From: Lute Kamstra @ 2005-02-28  9:44 UTC (permalink / raw)


Lute Kamstra <Lute.Kamstra.lists@xs4all.nl> writes:

[...]

> I investigated this problem a bit more.  It seems that the bug only
> happens when the body of a function contains just one sexp.  For
> example, when I do:
>
>   (defun fun (a) "Docstring." (interactive) (1+ a))
>   (debug-on-entry 'fun)
>   (fun 1)
>
> to enter the debugger and then type j to invoke debugger-jump, then
> the return value is nil (wrong).  But when I do:
>
>   (defun fun (a) "Docstring." (interactive) a (1+ a))
>   (debug-on-entry 'fun)
>   (fun 1)
>
> to enter the debugger and then type j to invoke debugger-jump, then
> the return value is 2 (right).
>
> debug-on-entry inserts (debug 'debug) into the definition of fun:
>
>   (defun fun (a) "Docstring." (interactive) (1+ a))
>   (symbol-function 'fun)
>     => (lambda (a) "Docstring." (interactive) (1+ a))
>   (debug-on-entry 'fun)
>   (symbol-function 'fun)
>     => (lambda (a) "Docstring." (interactive) (debug (quote debug)) (1+ a))
>
> So when fun is called, it invokes the debugger.  Then the debugger
> calls debugger-jump, which changes the definition of fun by removing
> (debug 'debug).  So the definition of fun is changed in the middle
> of a call to fun.  My guess is that this somehow confuses the lisp
> interpreter (in case the body of fun consists of just one sexp) and
> causes it to produce the wrong return value.

What actually happens is that removing (debug 'debug) causes the sexp
immediately following it not to be evaluated.  The following patch
fixes this.  (As a bonus, checking for functions with an empty body is
not necessary anymore.)  Shall I commit it?

Lute.


*** lisp/emacs-lisp/debug.el	27 Feb 2005 09:57:51 -0000	1.67
--- lisp/emacs-lisp/debug.el	28 Feb 2005 09:29:13 -0000
***************
*** 25,31 ****
  
  ;;; Commentary:
  
! ;; This is a major mode documented in the Emacs manual.
  
  ;;; Code:
  
--- 25,31 ----
  
  ;;; Commentary:
  
! ;; This is a major mode documented in the Emacs Lisp manual.
  
  ;;; Code:
  
***************
*** 476,483 ****
  	(insert ? )))
    (beginning-of-line))
  
- 
- 
  (put 'debugger-env-macro 'lisp-indent-function 0)
  (defmacro debugger-env-macro (&rest body)
    "Run BODY in original environment."
--- 476,481 ----
***************
*** 698,719 ****
  	(debug-on-entry-1 function (cdr defn) flag)
        (or (eq (car defn) 'lambda)
  	  (error "%s not user-defined Lisp function" function))
!       (let ((tail (cddr defn)))
  	;; Skip the docstring.
! 	(if (stringp (car tail)) (setq tail (cdr tail)))
  	;; Skip the interactive form.
! 	(if (eq 'interactive (car-safe (car tail))) (setq tail (cdr tail)))
! 	(unless (eq flag (equal (car tail) '(debug 'debug)))
! 	  ;; If the function has no body, add nil as a body element.
! 	  (when (null tail)
! 	    (setq tail (list nil))
! 	    (nconc defn tail))
  	  ;; Add/remove debug statement as needed.
! 	  (if (not flag)
! 	      (progn (setcar tail (cadr tail))
! 		     (setcdr tail (cddr tail)))
! 	    (setcdr tail (cons (car tail) (cdr tail)))
! 	    (setcar tail '(debug 'debug))))
  	defn))))
  
  (defun debugger-list-functions ()
--- 696,711 ----
  	(debug-on-entry-1 function (cdr defn) flag)
        (or (eq (car defn) 'lambda)
  	  (error "%s not user-defined Lisp function" function))
!       (let ((tail (cdr defn)))
  	;; Skip the docstring.
! 	(when (stringp (cadr tail)) (setq tail (cdr tail)))
  	;; Skip the interactive form.
! 	(when (eq 'interactive (car-safe (cadr tail))) (setq tail (cdr tail)))
! 	(unless (eq flag (equal (cadr tail) '(debug 'debug)))
  	  ;; Add/remove debug statement as needed.
! 	  (if flag
! 	      (setcdr tail (cons '(debug 'debug) (cdr tail)))
! 	    (setcdr tail (cddr tail))))
  	defn))))
  
  (defun debugger-list-functions ()

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Lisp debugger problems.
  2005-02-24  0:16 Lisp debugger problems Lute Kamstra
  2005-02-28  1:37 ` Lute Kamstra
@ 2005-02-28 11:26 ` Richard Stallman
  2005-02-28 17:01   ` Lute Kamstra
  2005-03-01 14:50   ` Lute Kamstra
  1 sibling, 2 replies; 10+ messages in thread
From: Richard Stallman @ 2005-02-28 11:26 UTC (permalink / raw)
  Cc: emacs-devel

    What I don't understand in why debug-on-entry and
    cancel-debug-on-entry call debugger-reenable as well (thus causing the
    strange behavior in the example above).  What am I missing?

I am not certain.  Perhaps the idea was in case you do
debugger-jump but you don't reenter the debugger.
In that case, debugger entry would be turned off permanently
in those functions.

If so, this solution is just a half measure.  We really should arrange
to reenable debugger entry for these functions whenever control gets
back to the command level outside the debugger.  This could be done
by frobbing post-command-hook somehow.

Meanwhile, it would be nice and clean if redefining a function
with defun, defmacro, defsubst or defalias were smart enough
to turn debug-on-entry back on if it was on before.

Want to do that?

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Lisp debugger problems.
  2005-02-28 11:26 ` Richard Stallman
@ 2005-02-28 17:01   ` Lute Kamstra
  2005-02-28 18:10     ` Stefan Monnier
  2005-03-01 14:50   ` Lute Kamstra
  1 sibling, 1 reply; 10+ messages in thread
From: Lute Kamstra @ 2005-02-28 17:01 UTC (permalink / raw)
  Cc: emacs-devel

Richard Stallman <rms@gnu.org> writes:

>     What I don't understand in why debug-on-entry and
>     cancel-debug-on-entry call debugger-reenable as well (thus causing the
>     strange behavior in the example above).  What am I missing?
>
> I am not certain.  Perhaps the idea was in case you do
> debugger-jump but you don't reenter the debugger.
> In that case, debugger entry would be turned off permanently
> in those functions.
>
> If so, this solution is just a half measure.  We really should arrange
> to reenable debugger entry for these functions whenever control gets
> back to the command level outside the debugger.  This could be done
> by frobbing post-command-hook somehow.

I'll work on that.

> Meanwhile, it would be nice and clean if redefining a function
> with defun, defmacro, defsubst or defalias were smart enough
> to turn debug-on-entry back on if it was on before.
>
> Want to do that?

Ok, I'll look into it.

Lute.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Lisp debugger problems.
  2005-02-28 17:01   ` Lute Kamstra
@ 2005-02-28 18:10     ` Stefan Monnier
  2005-03-02 11:22       ` Richard Stallman
  0 siblings, 1 reply; 10+ messages in thread
From: Stefan Monnier @ 2005-02-28 18:10 UTC (permalink / raw)
  Cc: rms, emacs-devel

>> Meanwhile, it would be nice and clean if redefining a function
>> with defun, defmacro, defsubst or defalias were smart enough
>> to turn debug-on-entry back on if it was on before.
>> Want to do that?
> Ok, I'll look into it.

IIRC defadvice has some support for such things (e.g. you can add an advice
even before the function is defined).  Maybe it'd be a good idea to
implement debug.el in terms of advice.


        Stefan

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Lisp debugger problems.
  2005-02-28 11:26 ` Richard Stallman
  2005-02-28 17:01   ` Lute Kamstra
@ 2005-03-01 14:50   ` Lute Kamstra
  1 sibling, 0 replies; 10+ messages in thread
From: Lute Kamstra @ 2005-03-01 14:50 UTC (permalink / raw)
  Cc: emacs-devel

Richard Stallman <rms@gnu.org> writes:

>     What I don't understand in why debug-on-entry and
>     cancel-debug-on-entry call debugger-reenable as well (thus causing the
>     strange behavior in the example above).  What am I missing?
>
> I am not certain.  Perhaps the idea was in case you do
> debugger-jump but you don't reenter the debugger.
> In that case, debugger entry would be turned off permanently
> in those functions.
>
> If so, this solution is just a half measure.  We really should arrange
> to reenable debugger entry for these functions whenever control gets
> back to the command level outside the debugger.  This could be done
> by frobbing post-command-hook somehow.

Something like this?

Lute.


Index: lisp/ChangeLog
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/ChangeLog,v
retrieving revision 1.7045
diff -c -r1.7045 ChangeLog
*** lisp/ChangeLog	1 Mar 2005 13:02:37 -0000	1.7045
--- lisp/ChangeLog	1 Mar 2005 14:47:18 -0000
***************
*** 1,6 ****
  2005-03-01  Robert J. Chassell  <bob@rattlesnake.com>
  
! 	* textmodes/texinfmt.el: (texinfo-no-refill-regexp): Comment out
  	inclusion of "itemize\\|", which may be unnecessary, is certainly
  	inelegant, and stops refilling in itemize lists when formatting
  	Japanese Texinfo files to Info.
--- 1,18 ----
+ 2005-03-01  Lute Kamstra  <lute@gnu.org>
+ 
+ 	* emacs-lisp/debug.el (inhibit-debug-on-entry): Add docstring.
+ 	(debugger-jumping-flag): New var.
+ 	(debug-entry-code): Use it.
+ 	(debugger-jump): Use debugger-jumping-flag and add
+ 	debugger-reenable to post-command-hook.
+ 	(debugger-reenable): Use debugger-jumping-flag and remove itself
+ 	from post-command-hook.
+ 	(debug, debug-on-entry, cancel-debug-on-entry): Remove call to
+ 	debugger-reenable.
+ 
  2005-03-01  Robert J. Chassell  <bob@rattlesnake.com>
  
! 	* textmodes/texinfmt.el (texinfo-no-refill-regexp): Comment out
  	inclusion of "itemize\\|", which may be unnecessary, is certainly
  	inelegant, and stops refilling in itemize lists when formatting
  	Japanese Texinfo files to Info.
Index: lisp/emacs-lisp/debug.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/emacs-lisp/debug.el,v
retrieving revision 1.70
diff -c -r1.70 debug.el
*** lisp/emacs-lisp/debug.el	1 Mar 2005 13:00:30 -0000	1.70
--- lisp/emacs-lisp/debug.el	1 Mar 2005 14:47:19 -0000
***************
*** 93,103 ****
  (defvar debugger-outer-inhibit-redisplay)
  (defvar debugger-outer-cursor-in-echo-area)
  
! (defvar inhibit-debug-on-entry nil)
  
  ;; When you change this, you may also need to change the number of
  ;; frames that the debugger skips.
! (defconst debug-entry-code '(if inhibit-debug-on-entry nil (debug 'debug))
    "Code added to a function to cause it to call the debugger upon entry.")
  
  ;;;###autoload
--- 93,111 ----
  (defvar debugger-outer-inhibit-redisplay)
  (defvar debugger-outer-cursor-in-echo-area)
  
! (defvar inhibit-debug-on-entry nil
!   "Non-nil means that debug-on-entry is disabled.")
! 
! (defvar debugger-jumping-flag nil
!   "Non-nil means that debug-on-entry is disabled.
! This variable is used by `debugger-jump' and `debugger-reenable'.")
  
  ;; When you change this, you may also need to change the number of
  ;; frames that the debugger skips.
! (defconst debug-entry-code
!   '(if (or inhibit-debug-on-entry debugger-jumping-flag)
!        nil
!      (debug 'debug))
    "Code added to a function to cause it to call the debugger upon entry.")
  
  ;;;###autoload
***************
*** 197,203 ****
  		    ;; Skip the frames for backtrace-debug, byte-code,
  		    ;; and debug-entry-code.
  		    (backtrace-debug 4 t))
- 		(debugger-reenable)
  		(message "")
  		(let ((standard-output nil)
  		      (buffer-read-only t))
--- 205,210 ----
***************
*** 406,430 ****
    "Continue to exit from this frame, with all debug-on-entry suspended."
    (interactive)
    (debugger-frame)
!   ;; Turn off all debug-on-entry functions
!   ;; but leave them in the list.
!   (let ((list debug-function-list))
!     (while list
!       (fset (car list)
! 	    (debug-on-entry-1 (car list) (symbol-function (car list)) nil))
!       (setq list (cdr list))))
    (message "Continuing through this frame")
    (exit-recursive-edit))
  
  (defun debugger-reenable ()
!   "Turn all debug-on-entry functions back on."
!   (let ((list debug-function-list))
!     (while list
!       (or (consp (symbol-function (car list)))
! 	  (debug-convert-byte-code (car list)))
!       (fset (car list)
! 	    (debug-on-entry-1 (car list) (symbol-function (car list)) t))
!       (setq list (cdr list)))))
  
  (defun debugger-frame-number ()
    "Return number of frames in backtrace before the one point points at."
--- 413,429 ----
    "Continue to exit from this frame, with all debug-on-entry suspended."
    (interactive)
    (debugger-frame)
!   (setq debugger-jumping-flag t)
!   (add-hook 'post-command-hook 'debugger-reenable)
    (message "Continuing through this frame")
    (exit-recursive-edit))
  
  (defun debugger-reenable ()
!   "Turn all debug-on-entry functions back on.
! This function is put on `post-command-hook' by `debugger-jump' and
! removes itself from that hook."
!   (setq debugger-jumping-flag nil)
!   (remove-hook 'post-command-hook 'debugger-reenable))
  
  (defun debugger-frame-number ()
    "Return number of frames in backtrace before the one point points at."
***************
*** 634,640 ****
  Use \\[cancel-debug-on-entry] to cancel the effect of this command.
  Redefining FUNCTION also cancels it."
    (interactive "aDebug on entry (to function): ")
-   (debugger-reenable)
    ;; Handle a function that has been aliased to some other function.
    (if (and (subrp (symbol-function function))
  	   (eq (cdr (subr-arity (symbol-function function))) 'unevalled))
--- 633,638 ----
***************
*** 665,671 ****
  				 (mapcar 'symbol-name debug-function-list)
  				 nil t nil)))
  	   (if name (intern name)))))
-   (debugger-reenable)
    (if (and function (not (string= function "")))
        (progn
  	(let ((f (debug-on-entry-1 function (symbol-function function) nil)))
--- 663,668 ----
Index: lispref/ChangeLog
===================================================================
RCS file: /cvsroot/emacs/emacs/lispref/ChangeLog,v
retrieving revision 1.321
diff -c -r1.321 ChangeLog
*** lispref/ChangeLog	1 Mar 2005 08:42:23 -0000	1.321
--- lispref/ChangeLog	1 Mar 2005 14:47:22 -0000
***************
*** 1,3 ****
--- 1,7 ----
+ 2005-03-01  Lute Kamstra  <lute@gnu.org>
+ 
+ 	* debugging.texi (Debugger Commands): Update `j'.
+ 
  2005-02-28  Lute Kamstra  <lute@gnu.org>
  
  	* debugging.texi (Debugging): Fix typo.
Index: lispref/debugging.texi
===================================================================
RCS file: /cvsroot/emacs/emacs/lispref/debugging.texi,v
retrieving revision 1.26
diff -c -r1.26 debugging.texi
*** lispref/debugging.texi	1 Mar 2005 08:41:52 -0000	1.26
--- lispref/debugging.texi	1 Mar 2005 14:47:23 -0000
***************
*** 388,398 ****
  @item j
  Flag the current frame like @kbd{b}.  Then continue execution like
  @kbd{c}, but temporarily disable break-on-entry for all functions that
! are set up to do so by @code{debug-on-entry}.  The temporarily disabled
! functions are set up to debug on entry again when the debugger is
! entered or when @code{debug-on-entry} is called;
! @code{cancel-debug-on-entry} also re-enables these functions before it
! disables any functions that its argument says it should disable.
  
  @item e
  Read a Lisp expression in the minibuffer, evaluate it, and print the
--- 388,394 ----
  @item j
  Flag the current frame like @kbd{b}.  Then continue execution like
  @kbd{c}, but temporarily disable break-on-entry for all functions that
! are set up to do so by @code{debug-on-entry}.
  
  @item e
  Read a Lisp expression in the minibuffer, evaluate it, and print the

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Lisp debugger problems.
  2005-02-28 18:10     ` Stefan Monnier
@ 2005-03-02 11:22       ` Richard Stallman
  2005-03-02 16:15         ` Lute Kamstra
  0 siblings, 1 reply; 10+ messages in thread
From: Richard Stallman @ 2005-03-02 11:22 UTC (permalink / raw)
  Cc: Lute.Kamstra.lists, emacs-devel

    IIRC defadvice has some support for such things (e.g. you can add an advice
    even before the function is defined).  Maybe it'd be a good idea to
    implement debug.el in terms of advice.

Right now, the code to implement debug on entry is so simple that it
would be a shame to use something as heavyweight as the advice
mechanism.  However, if these new changes add a lot of complexity,
maybe using the advice mechanism will become the simplest way.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Lisp debugger problems.
  2005-03-02 11:22       ` Richard Stallman
@ 2005-03-02 16:15         ` Lute Kamstra
  2005-03-03 20:57           ` Richard Stallman
  0 siblings, 1 reply; 10+ messages in thread
From: Lute Kamstra @ 2005-03-02 16:15 UTC (permalink / raw)
  Cc: Stefan Monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

>     IIRC defadvice has some support for such things (e.g. you can
>     add an advice even before the function is defined).  Maybe it'd
>     be a good idea to implement debug.el in terms of advice.
>
> Right now, the code to implement debug on entry is so simple that it
> would be a shame to use something as heavyweight as the advice
> mechanism.  However, if these new changes add a lot of complexity,
> maybe using the advice mechanism will become the simplest way.

What about advising the primitives that define functions to add
debug-entry-code when a function is in debug-function-list?  Would
that work?

Lute.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Lisp debugger problems.
  2005-03-02 16:15         ` Lute Kamstra
@ 2005-03-03 20:57           ` Richard Stallman
  0 siblings, 0 replies; 10+ messages in thread
From: Richard Stallman @ 2005-03-03 20:57 UTC (permalink / raw)
  Cc: monnier, emacs-devel

    What about advising the primitives that define functions to add
    debug-entry-code when a function is in debug-function-list?  Would
    that work?

Please do not think of making any part of Emacs advise primitives.
That technique should never be used, because it causes confusion.  All
code in Emacs that advises other parts of Emacs was installed without
my knowledge.  It is a bug that ought to be fixed.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2005-03-03 20:57 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-02-24  0:16 Lisp debugger problems Lute Kamstra
2005-02-28  1:37 ` Lute Kamstra
2005-02-28  9:44   ` Lute Kamstra
2005-02-28 11:26 ` Richard Stallman
2005-02-28 17:01   ` Lute Kamstra
2005-02-28 18:10     ` Stefan Monnier
2005-03-02 11:22       ` Richard Stallman
2005-03-02 16:15         ` Lute Kamstra
2005-03-03 20:57           ` Richard Stallman
2005-03-01 14:50   ` Lute Kamstra

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).