]> git.eshelyaron.com Git - emacs.git/commitdiff
(call_debugger): When entering the debugger while redisplaying,
authorGerd Moellmann <gerd@gnu.org>
Wed, 8 Dec 1999 12:00:57 +0000 (12:00 +0000)
committerGerd Moellmann <gerd@gnu.org>
Wed, 8 Dec 1999 12:00:57 +0000 (12:00 +0000)
reset redisplaying_p, and go back to the top-level if the debugger
returns.

src/ChangeLog
src/eval.c

index 2989c6a3a3e10248e069d2bfed63efdb5bdee072..e9752f527ccfd4678c5652449c3a19ba338babd3 100644 (file)
@@ -1,3 +1,10 @@
+1999-12-08  Gerd Moellmann  <gerd@gnu.org>
+
+       * eval.c: Remove conditional compilation on `standalone'.
+       (call_debugger): When entering the debugger while redisplaying,
+       reset redisplaying_p, and go back to the top-level if the debugger
+       returns.
+
 1999-12-07  Gerd Moellmann  <gerd@gnu.org>
 
        * xfaces.c (x_set_menu_resources_from_menu_face): Make sure
index f911433e7120668db6f1a4b1661d98547676b0a8..0fb517aef2b72161e0cfb973a71bd2b973978faf 100644 (file)
@@ -20,17 +20,11 @@ Boston, MA 02111-1307, USA.  */
 
 
 #include <config.h>
-
 #include "lisp.h"
 #include "blockinput.h"
-
-#ifndef standalone
 #include "commands.h"
 #include "keyboard.h"
-#else
-#define INTERACTIVE 1
-#endif
-
+#include "dispextern.h"
 #include <setjmp.h>
 
 /* This definition is duplicated in alloc.c and keyboard.c */
@@ -202,13 +196,32 @@ Lisp_Object
 call_debugger (arg)
      Lisp_Object arg;
 {
+  int debug_while_redisplaying;
+  Lisp_Object val;
+  
   if (lisp_eval_depth + 20 > max_lisp_eval_depth)
     max_lisp_eval_depth = lisp_eval_depth + 20;
+  
   if (specpdl_size + 40 > max_specpdl_size)
     max_specpdl_size = specpdl_size + 40;
+  
   debug_on_next_call = 0;
   when_entered_debugger = num_nonmacro_input_events;
-  return apply1 (Vdebugger, arg);
+
+  /* Resetting redisplaying_p to 0 makes sure that debug output is
+     displayed if the debugger is invoked during redisplay.  */
+  debug_while_redisplaying = redisplaying_p;
+  redisplaying_p = 0;
+  
+  val = apply1 (Vdebugger, arg);
+
+  /* Interrupting redisplay and resuming it later is not safe under
+     all circumstances.  So, when the debugger returns, abort the
+     interupted redisplay by going back to the top-level.  */
+  if (debug_while_redisplaying)
+    Ftop_level ();
+
+  return val;
 }
 
 void