This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC/A] gdb/680: ui_out_reset?


Hi,

Following up to gdb/680 where the MI register commands cause assertion 
failures with errors...

There are several ways to approach this. One is to make sure that 
everytime ui_out_{list,tuple}_begin is called, there is a 
ui_out_{list,tuple}_end. This leads to code like (from 
mi_data_list_register_values):

  ui_out_list_begin (uiout, "register-values");

  if (argc == 1)		/* No args, beside the format: do all the regs */
    {
      for (regnum = 0;
	   regnum < numregs;
	   regnum++)
	{
	  if (REGISTER_NAME (regnum) == NULL
	      || *(REGISTER_NAME (regnum)) == '\0')
	    continue;
	  ui_out_tuple_begin (uiout, NULL);
	  ui_out_field_int (uiout, "number", regnum);
	  result = get_register (regnum, format);
	  if (result == -1)
	    {
	      ui_out_tuple_end (uiout);
	      ui_out_list_end (uiout);
	      return MI_CMD_ERROR;
	    }
	  ui_out_tuple_end (uiout);
	}
    }
    /* snip */

I'd rather just propose a new ui-out function, ui_out_reset, which can be 
called to "cleanup" the uiout in case of errors. In this case, 
mi_out_rewind could call ui_out_reset and reset the "levels" field.

Of course, I think that Kevin also proposed something in the longjmp case 
which is needed in these functions, afaict, but that's another bug/patch.

What do people think? Explicitly call ui_out_{list,tuple}_end before 
returning an error code or add ui_out_reset? Perhaps another solution I've 
overlooked?

Keith

ChangeLog
2002-09-05  Keith Seitz  <keiths@redhat.com>

        * ui-out.c (ui_out_reset): New function.
        (ui_out_new): Use ui_out_reset.
        * ui-out.h (ui_out_reset): Add declaration.

mi/ChangeLog
2002-09-05  Keith Seitz  <keiths@redhat.com>

        * mi-out.c (mi_out_rewind): Call ui_out_reset to reset
        the uiout in case of errors.

Patch
Index: ui-out.c
===================================================================
RCS file: /cvs/src/src/gdb/ui-out.c,v
retrieving revision 1.23
diff -p -r1.23 ui-out.c
*** ui-out.c	27 Jul 2002 01:54:15 -0000	1.23
--- ui-out.c	5 Sep 2002 15:02:46 -0000
*************** ui_out_data (struct ui_out *uiout)
*** 1119,1124 ****
--- 1119,1136 ----
    return uiout->data;
  }
  
+ void
+ ui_out_reset (struct ui_out *uiout)
+ {
+   uiout->table.flag = 0;
+   uiout->table.body_flag = 0;
+   uiout->level = 0;
+   memset (uiout->levels, 0, sizeof (uiout->levels));
+   uiout->table.header_first = NULL;
+   uiout->table.header_last = NULL;
+   uiout->table.header_next = NULL;
+ }
+ 
  /* initalize private members at startup */
  
  struct ui_out *
*************** ui_out_new (struct ui_out_impl *impl,
*** 1130,1142 ****
    uiout->data = data;
    uiout->impl = impl;
    uiout->flags = flags;
!   uiout->table.flag = 0;
!   uiout->table.body_flag = 0;
!   uiout->level = 0;
!   memset (uiout->levels, 0, sizeof (uiout->levels));
!   uiout->table.header_first = NULL;
!   uiout->table.header_last = NULL;
!   uiout->table.header_next = NULL;
    return uiout;
  }
  
--- 1142,1148 ----
    uiout->data = data;
    uiout->impl = impl;
    uiout->flags = flags;
!   ui_out_reset (uiout);
    return uiout;
  }
  
Index: ui-out.h
===================================================================
RCS file: /cvs/src/src/gdb/ui-out.h,v
retrieving revision 1.15
diff -p -r1.15 ui-out.h
*** ui-out.h	6 Jul 2001 03:53:11 -0000	1.15
--- ui-out.h	5 Sep 2002 15:02:46 -0000
*************** extern struct ui_out *ui_out_new (struct
*** 272,275 ****
--- 272,278 ----
  				  struct ui_out_data *data,
  				  int flags);
  
+ /* Reset the ui_out object. This is useful when dealing with errors. */
+ extern void ui_out_reset (struct ui_out *uiout);
+ 
  #endif /* UI_OUT_H */
Index: mi/mi-out.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-out.c,v
retrieving revision 1.23
diff -p -r1.23 mi-out.c
*** mi/mi-out.c	19 Mar 2002 02:51:08 -0000	1.23
--- mi/mi-out.c	5 Sep 2002 15:02:46 -0000
*************** mi_out_rewind (struct ui_out *uiout)
*** 409,414 ****
--- 409,417 ----
  {
    struct ui_out_data *data = ui_out_data (uiout);
    ui_file_rewind (data->buffer);
+ 
+   /* Reset the uiout in case there was an error. */
+   ui_out_reset (uiout);
  }
  
  /* dump the buffer onto the specified stream */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]