* ui-out.c (do_list_end): New function.
authorMark Kettenis <kettenis@gnu.org>
Sat, 27 Jan 2001 17:57:53 +0000 (17:57 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 27 Jan 2001 17:57:53 +0000 (17:57 +0000)
(make_cleanup_ui_out_list_end): New function.
* ui-out.h: Provide prototype for make_cleanup_ui_out_list_end.
* stack.c (print_frame) [UI_OUT]: Call
make_cleanup_ui_out_list_end to make sure we mark the end of the
list if we do a non-local exit.  At the end of the function,
instead of calling ui_out_list_end directly, let do_cleanups
handle it.

gdb/ChangeLog
gdb/stack.c
gdb/ui-out.c
gdb/ui-out.h

index e8afaf5..b4aae02 100644 (file)
@@ -1,3 +1,14 @@
+2001-01-27  Mark Kettenis  <kettenis@gnu.org>
+
+       * ui-out.c (do_list_end): New function.
+       (make_cleanup_ui_out_list_end): New function.
+       * ui-out.h: Provide prototype for make_cleanup_ui_out_list_end.
+       * stack.c (print_frame) [UI_OUT]: Call
+       make_cleanup_ui_out_list_end to make sure we mark the end of the
+       list if we do a non-local exit.  At the end of the function,
+       instead of calling ui_out_list_end directly, let do_cleanups
+       handle it.
+
 2001-01-26  Fernando Nasser  <fnasser@redhat.com>
 
        Fix double parsing of filenames passed as command line arguments
index 85f37d8..5bc044f 100644 (file)
@@ -1,5 +1,6 @@
 /* Print and select stack frames for GDB, the GNU debugger.
-   Copyright 1986, 1987, 1989, 1991-1996, 1998-2000 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
+   1998, 1999, 2000, 2001 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -448,6 +449,7 @@ print_frame (struct frame_info *fi,
 #ifdef UI_OUT
   struct ui_stream *stb;
   struct cleanup *old_chain;
+  struct cleanup *list_chain;
 
   stb = ui_out_stream_new (uiout);
   old_chain = make_cleanup_ui_out_stream_delete (stb);
@@ -532,6 +534,7 @@ print_frame (struct frame_info *fi,
 
 #ifdef UI_OUT
   ui_out_list_begin (uiout, "frame");
+  list_chain = make_cleanup_ui_out_list_end (uiout);
 #endif
 
   if (level >= 0)
@@ -661,7 +664,8 @@ print_frame (struct frame_info *fi,
 #endif /* PC_SOLIB */
 
 #ifdef UI_OUT
-  ui_out_list_end (uiout);
+  /* do_cleanups will call ui_out_list_end() for us.  */
+  do_cleanups (list_chain);
   ui_out_text (uiout, "\n");
   do_cleanups (old_chain);
 #else
index 7953326..0d36639 100644 (file)
@@ -281,6 +281,18 @@ ui_out_list_end (struct ui_out *uiout)
   uiout->list_flag--;
 }
 
+static void
+do_list_end (void *uiout)
+{
+  ui_out_list_end (uiout);
+}
+
+struct cleanup *
+make_cleanup_ui_out_list_end (struct ui_out *uiout)
+{
+  return make_cleanup (do_list_end, uiout);
+}
+
 void
 ui_out_field_int (struct ui_out *uiout, char *fldname, int value)
 {
index 4a45dc8..17454d2 100644 (file)
@@ -81,6 +81,8 @@ extern void ui_out_list_begin (struct ui_out *uiout, char *lstid);
 
 extern void ui_out_list_end (struct ui_out *uiout);
 
+extern struct cleanup *make_cleanup_ui_out_list_end (struct ui_out *uiout);
+
 extern void ui_out_field_int (struct ui_out *uiout, char *fldname, int value);
 
 extern void ui_out_field_core_addr (struct ui_out *uiout, char *fldname,