* inf-loop.c (inferior_event_handler): Run all continuations and
authorPedro Alves <palves@redhat.com>
Tue, 6 May 2008 18:49:19 +0000 (18:49 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 6 May 2008 18:49:19 +0000 (18:49 +0000)
print any language change before running the breakpoint commands.

gdb/ChangeLog
gdb/inf-loop.c

index 87950a44ebf200cf194deec171fa9a372480a484..7eb3b7bd68cf5c1b4e7a4d185a10adfe12e537ad 100644 (file)
@@ -1,3 +1,8 @@
+2008-05-06  Pedro Alves  <pedro@codesourcery.com>
+
+       * inf-loop.c (inferior_event_handler): Run all continuations and
+       print any language change before running the breakpoint commands.
+
 2008-05-06  Joel Brobecker  <brobecker@adacore.com>
 
        * frame-unwind.c (frame_unwind_got_bytes): New function.
index 4889c6f11764bb075cffd4cdc9ea01595d582869..f77bc65ac6dd807cbb714036ce673628766b86b7 100644 (file)
@@ -92,30 +92,35 @@ inferior_event_handler (enum inferior_event_type event_type,
       was_sync = sync_execution;
       async_enable_stdin ();
 
-      /* If there's an error doing breakpoint commands, we don't
-        want to throw -- continuation might still do something.  */
-      TRY_CATCH (e, RETURN_MASK_ALL)
-       {
-         bpstat_do_actions (&stop_bpstat);
-       }
       /* If we were doing a multi-step (eg: step n, next n), but it
         got interrupted by a breakpoint, still do the pending
         continuations.  The continuation itself is responsible for
-        distinguishing the cases.  */
+        distinguishing the cases.  The continuations are allowed to
+        touch the inferior memory, e.g. to remove breakpoints, so run
+        them before running breakpoint commands, which may resume the
+        target.  */
       do_all_intermediate_continuations (0);
 
+      /* Always finish the previous command before running any
+        breakpoint commands.  Any stop cancels the previous command.
+        E.g. a "finish" or "step-n" command interrupted by an
+        unrelated breakpoint is canceled.  */
       do_all_continuations (0);
 
-      if (current_language != expected_language)
+      if (current_language != expected_language
+         && language_mode == language_mode_auto)
+       language_info (1);      /* Print what changed.  */
+
+      /* Don't propagate breakpoint commands errors.  Either we're
+        stopping or some command resumes the inferior.  The user will
+        be informed.  */
+      TRY_CATCH (e, RETURN_MASK_ALL)
        {
-         if (language_mode == language_mode_auto)
-           {
-             language_info (1);        /* Print what changed.  */
-           }
+         bpstat_do_actions (&stop_bpstat);
        }
 
-      /* If the continuation did not start the target again,
-        prepare for interation with the user.  */
+      /* If no breakpoint command resumed the inferior, prepare for
+        interaction with the user.  */
       if (!target_executing)
        {              
          if (was_sync)