2009-10-01 Phil Muldoon <pmuldoon@redhat.com>
authorPhil Muldoon <pmuldoon@redhat.com>
Thu, 1 Oct 2009 20:09:21 +0000 (20:09 +0000)
committerPhil Muldoon <pmuldoon@redhat.com>
Thu, 1 Oct 2009 20:09:21 +0000 (20:09 +0000)
* infcall.c (call_function_by_hand): Add a new cleanup branch for
std::terminate breakpoints.

gdb/ChangeLog
gdb/infcall.c

index e3196bc494524ebf249f0279c35cb2892f9e47bb..366f0f089beda78633a98914adc4a21a7cb4d8bc 100644 (file)
@@ -1,3 +1,8 @@
+2009-10-01  Phil Muldoon  <pmuldoon@redhat.com>
+
+       * infcall.c (call_function_by_hand): Add a new cleanup branch for
+       std::terminate breakpoints.
+
 2009-09-29  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * ia64-tdep.c (ia64_convert_from_func_ptr_addr): New variable buf.
index c9d98cf65eb2173808a66f48b2ef52fdf5233dd9..277399ac94102492e9c9b2d0cb704b6a0e97b9bc 100644 (file)
@@ -441,6 +441,7 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
   struct gdbarch *gdbarch;
   struct breakpoint *terminate_bp = NULL;
   struct minimal_symbol *tm;
+  struct cleanup *terminate_bp_cleanup = NULL;
   ptid_t call_thread_ptid;
   struct gdb_exception e;
   const char *name;
@@ -772,7 +773,7 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
 
   /* Register a clean-up for unwind_on_terminating_exception_breakpoint.  */
   if (terminate_bp)
-    make_cleanup_delete_breakpoint (terminate_bp);
+    terminate_bp_cleanup = make_cleanup_delete_breakpoint (terminate_bp);
 
   /* - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP -
      If you're looking to implement asynchronous dummy-frames, then
@@ -987,6 +988,11 @@ When the function is done executing, GDB will silently stop."),
       internal_error (__FILE__, __LINE__, _("... should not be here"));
     }
 
+  /* If we get here and the std::terminate() breakpoint has been set,
+     it has to be cleaned manually.  */
+  if (terminate_bp)
+    do_cleanups (terminate_bp_cleanup);
+
   /* If we get here the called FUNCTION ran to completion,
      and the dummy frame has already been popped.  */