emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: more candidates for obsoletion


From: Lars Magne Ingebrigtsen
Subject: Re: more candidates for obsoletion
Date: Sun, 13 May 2012 20:34:46 +0200
User-agent: Gnus/5.130006 (Ma Gnus v0.6) Emacs/24.1.50 (gnu/linux)

Stefan Monnier <address@hidden> writes:

>> That is, say `M-x backtrace-message RET obsolete RET', and then get a
>> backtrace whenever a string matching "obsolete" is messaged.
>
> Sounds good (tho I'd call it debug-on-message or something like that).
> Patch welcome,

If we want to get all the messages, I think set_message might be the
most likely place to put this.

The main problem is then how to avoid debugging recursively forever.
The following works, but surely there's an easier way to do this...

Proof of concept patch follows.  The real one would be structured
slightly differently:

=== modified file 'src/xdisp.c'
--- src/xdisp.c 2012-05-11 06:39:26 +0000
+++ src/xdisp.c 2012-05-13 18:32:19 +0000
@@ -10407,11 +10407,22 @@
    Doesn't GC, as with_echo_area_buffer binds Qinhibit_modification_hooks
    to t before calling set_message_1 (which calls insert).
   */
+Lisp_Object call_debugger (Lisp_Object arg);
+static int debugging = 0;
+
+Lisp_Object
+undo_debugging (Lisp_Object arg)
+{
+  debugging = 0;
+  return Qnil;
+}
 
 static void
 set_message (const char *s, Lisp_Object string,
             EMACS_INT nbytes, int multibyte_p)
 {
+  int count = SPECPDL_INDEX ();
+
   message_enable_multibyte
     = ((s && multibyte_p)
        || (STRINGP (string) && STRING_MULTIBYTE (string)));
@@ -10420,6 +10431,19 @@
                         (intptr_t) s, string, nbytes, multibyte_p);
   message_buf_print = 0;
   help_echo_showing_p = 0;
+
+  record_unwind_save_match_data ();
+
+  if (! debugging &&
+      ! NILP (Vdebug_on_message) &&
+      STRINGP (Vdebug_on_message) &&
+      ! NILP (Fstring_match (Vdebug_on_message, string, Qnil))) {
+    debugging = 1;
+    record_unwind_protect (undo_debugging, Qnil);
+    call_debugger (Fcons (Qerror, Fcons (string, Qnil)));
+  }
+
+  unbind_to (count, Qnil);
 }
 
 
@@ -28824,6 +28848,10 @@
   Vglyphless_char_display = Fmake_char_table (Qglyphless_char_display, Qnil);
   Fset_char_table_extra_slot (Vglyphless_char_display, make_number (0),
                              Qempty_box);
+
+  DEFVAR_LISP ("debug-on-message", Vdebug_on_message,
+    doc: /* If non-nil, debug if a message matching this regexp is displayed.  
*/);
+  Vdebug_on_message = Qnil;
 }
 
 



-- 
(domestic pets only, the antidote for overdose, milk.)
  bloggy blog http://lars.ingebrigtsen.no/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]