2011-08-04 Pedro Alves <pedro@codesourcery.com>
authorPedro Alves <palves@redhat.com>
Thu, 4 Aug 2011 18:19:27 +0000 (18:19 +0000)
committerPedro Alves <palves@redhat.com>
Thu, 4 Aug 2011 18:19:27 +0000 (18:19 +0000)
* exceptions.c (struct catcher): Remove saved_uiout field.
(exceptions_state_mc_init): Remove the `func_uiout' parameter, and
no longer save/resvore the global ui_out builder.
(catch_exceptions_with_msg): Save/override/restore the global
ui_out builder manually instead of relying on TRY_CATCH to do it.
(catch_errors): Save/restore the global ui_out builder manually
instead of relying on TRY_CATCH to do it.
* exceptions.h (exceptions_state_mc_init): Remove the `func_uiout'
parameter.
(TRY_CATCH): Adjust.
* cli/cli-interp.c (safe_execute_command): Save/override/restore
the global ui_out builder manually instead of relying on TRY_CATCH
to do it.

gdb/ChangeLog
gdb/cli/cli-interp.c
gdb/exceptions.c
gdb/exceptions.h

index 358f51564826f9328fb686f67a78acc560ca12a0..570fca8b38dd534982b0ca85fb4bf8a7ef8f54c4 100644 (file)
@@ -1,3 +1,19 @@
+2011-08-04  Pedro Alves  <pedro@codesourcery.com>
+
+       * exceptions.c (struct catcher): Remove saved_uiout field.
+       (exceptions_state_mc_init): Remove the `func_uiout' parameter, and
+       no longer save/resvore the global ui_out builder.
+       (catch_exceptions_with_msg): Save/override/restore the global
+       ui_out builder manually instead of relying on TRY_CATCH to do it.
+       (catch_errors): Save/restore the global ui_out builder manually
+       instead of relying on TRY_CATCH to do it.
+       * exceptions.h (exceptions_state_mc_init): Remove the `func_uiout'
+       parameter.
+       (TRY_CATCH): Adjust.
+       * cli/cli-interp.c (safe_execute_command): Save/override/restore
+       the global ui_out builder manually instead of relying on TRY_CATCH
+       to do it.
+
 2011-08-03  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
 
        * breakpoint.c (update_global_location_list): Ensure
index 88a570cc8343bd5f36cf164b3d532d4eee65ec90..32883cfbe5310c0b53612adba5bb2c30da53001c 100644 (file)
@@ -112,14 +112,23 @@ cli_interpreter_exec (void *data, const char *command_str)
 }
 
 static struct gdb_exception
-safe_execute_command (struct ui_out *uiout, char *command, int from_tty)
+safe_execute_command (struct ui_out *command_uiout, char *command, int from_tty)
 {
   volatile struct gdb_exception e;
+  struct ui_out *saved_uiout;
+
+  /* Save and override the global ``struct ui_out'' builder.  */
+  saved_uiout = uiout;
+  uiout = command_uiout;
 
   TRY_CATCH (e, RETURN_MASK_ALL)
     {
       execute_command (command, from_tty);
     }
+
+  /* Restore the global builder.  */
+  uiout = saved_uiout;
+
   /* FIXME: cagney/2005-01-13: This shouldn't be needed.  Instead the
      caller should print the exception.  */
   exception_print (gdb_stderr, e);
index ce86f481072f81608e43db8f7b61f94538fa5c7e..6704f93e8ddbe2aa97be586e7d872f6bc1383afb 100644 (file)
@@ -60,7 +60,6 @@ struct catcher
   volatile struct gdb_exception *exception;
   /* Saved/current state.  */
   int mask;
-  struct ui_out *saved_uiout;
   struct cleanup *saved_cleanup_chain;
   /* Back link.  */
   struct catcher *prev;
@@ -70,8 +69,7 @@ struct catcher
 static struct catcher *current_catcher;
 
 EXCEPTIONS_SIGJMP_BUF *
-exceptions_state_mc_init (struct ui_out *func_uiout,
-                         volatile struct gdb_exception *exception,
+exceptions_state_mc_init (volatile struct gdb_exception *exception,
                          return_mask mask)
 {
   struct catcher *new_catcher = XZALLOC (struct catcher);
@@ -84,10 +82,6 @@ exceptions_state_mc_init (struct ui_out *func_uiout,
 
   new_catcher->mask = mask;
 
-  /* Override the global ``struct ui_out'' builder.  */
-  new_catcher->saved_uiout = uiout;
-  uiout = func_uiout;
-
   /* Prevent error/quit during FUNC from calling cleanups established
      prior to here.  */
   new_catcher->saved_cleanup_chain = save_cleanups ();
@@ -112,8 +106,6 @@ catcher_pop (void)
 
   restore_cleanups (old_catcher->saved_cleanup_chain);
 
-  uiout = old_catcher->saved_uiout;
-
   xfree (old_catcher);
 }
 
@@ -459,7 +451,7 @@ catch_exceptions (struct ui_out *uiout,
 }
 
 int
-catch_exceptions_with_msg (struct ui_out *uiout,
+catch_exceptions_with_msg (struct ui_out *func_uiout,
                           catch_exceptions_ftype *func,
                           void *func_args,
                           char **gdberrmsg,
@@ -467,11 +459,27 @@ catch_exceptions_with_msg (struct ui_out *uiout,
 {
   volatile struct gdb_exception exception;
   volatile int val = 0;
+  struct ui_out *saved_uiout;
 
-  TRY_CATCH (exception, mask)
+  /* Save and override the global ``struct ui_out'' builder.  */
+  saved_uiout = uiout;
+  uiout = func_uiout;
+
+  TRY_CATCH (exception, RETURN_MASK_ALL)
     {
       val = (*func) (uiout, func_args);
     }
+
+  /* Restore the global builder.  */
+  uiout = saved_uiout;
+
+  if (exception.reason < 0 && (mask & RETURN_MASK (exception.reason)) == 0)
+    {
+      /* The caller didn't request that the event be caught.
+        Rethrow.  */
+      throw_exception (exception);
+    }
+
   print_any_exception (gdb_stderr, NULL, exception);
   gdb_assert (val >= 0);
   gdb_assert (exception.reason <= 0);
@@ -500,11 +508,26 @@ catch_errors (catch_errors_ftype *func, void *func_args, char *errstring,
 {
   volatile int val = 0;
   volatile struct gdb_exception exception;
+  struct ui_out *saved_uiout;
 
-  TRY_CATCH (exception, mask)
+  /* Save the global ``struct ui_out'' builder.  */
+  saved_uiout = uiout;
+
+  TRY_CATCH (exception, RETURN_MASK_ALL)
     {
       val = func (func_args);
     }
+
+  /* Restore the global builder.  */
+  uiout = saved_uiout;
+
+  if (exception.reason < 0 && (mask & RETURN_MASK (exception.reason)) == 0)
+    {
+      /* The caller didn't request that the event be caught.
+        Rethrow.  */
+      throw_exception (exception);
+    }
+
   print_any_exception (gdb_stderr, errstring, exception);
   if (exception.reason != 0)
     return 0;
index c1bc605563f1fdf592e23484cf06641a1879ff32..9e306e4d381485de051cb09eb57ceda2264f1150 100644 (file)
@@ -114,8 +114,7 @@ extern const struct gdb_exception exception_none;
 
 /* Functions to drive the exceptions state m/c (internal to
    exceptions).  */
-EXCEPTIONS_SIGJMP_BUF *exceptions_state_mc_init (struct ui_out *func_uiout,
-                                                volatile struct
+EXCEPTIONS_SIGJMP_BUF *exceptions_state_mc_init (volatile struct
                                                 gdb_exception *exception,
                                                 return_mask mask);
 int exceptions_state_mc_action_iter (void);
@@ -146,7 +145,7 @@ int exceptions_state_mc_action_iter_1 (void);
 #define TRY_CATCH(EXCEPTION,MASK) \
      { \
        EXCEPTIONS_SIGJMP_BUF *buf = \
-        exceptions_state_mc_init (uiout, &(EXCEPTION), (MASK)); \
+        exceptions_state_mc_init (&(EXCEPTION), (MASK)); \
        EXCEPTIONS_SIGSETJMP (*buf); \
      } \
      while (exceptions_state_mc_action_iter ()) \