public inbox for insight@sourceware.org
 help / color / mirror / Atom feed
* [RFA] gdbtk_set_result
@ 2001-11-02 16:20 Martin M. Hunt
  2001-11-04 11:25 ` Keith Seitz
  0 siblings, 1 reply; 5+ messages in thread
From: Martin M. Hunt @ 2001-11-02 16:20 UTC (permalink / raw)
  To: Insight Mailing List

This patch uses the new function gdbtk_set_result() to correctly set return 
strings on errors.

-- 
Martin Hunt
GDB Engineer
Red Hat, Inc.

2001-11-02  Martin M. Hunt  <hunt@redhat.com>
	* generic/gdbtk-cmds.h (gdbtk_set_result): Declare.
	A printf-like function to return error messages.
	* generic/gdbtk-cmds.c (gdbtk_set_result): New
	function.
	(gdb_cmd): Use gdbtk_set_result.
	(gdb_immediate_command): Ditto.
	(gdb_load_info): Ditto.
	(gdb_find_file_command): Ditto.
	(gdb_listfuncs): Ditto.
	(gdb_load_disassembly): Ditto.
	(gdb_loc): Ditto.
	(gdb_set_mem): Ditto.
	(gdb_get_mem): Ditto.
	(gdb_loadfile): Ditto.
	* generic/gdbtk-varobj.c (variable_format): Ditto.
	(variable_value): Ditto.
	* generic/gdbtk-stack.c (gdb_get_vars_command): Ditto.
	* generic/gdbtk-bp.c (gdb_get_breakpoint_info): Ditto.
	(gdb_set_bp): Ditto.
	(gdb_set_bp_addr): Ditto.
	(gdb_get_tracepoint_info): Ditto.

Index: gdbtk-bp.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-bp.c,v
retrieving revision 1.12
diff -u -p -r1.12 gdbtk-bp.c
--- gdbtk-bp.c	2001/10/29 21:45:31	1.12
+++ gdbtk-bp.c	2001/11/02 23:59:40
@@ -309,10 +309,7 @@ gdb_get_breakpoint_info (ClientData clie
   b = (bpnum <= breakpoint_list_size ? breakpoint_list[bpnum] : NULL);
   if (!b || b->type != bp_breakpoint)
     {
-      char *err_buf;
-      xasprintf (&err_buf, "Breakpoint #%d does not exist.", bpnum);
-      Tcl_SetStringObj (result_ptr->obj_ptr, err_buf, -1);
-      free(err_buf);
+      gdbtk_set_result (interp, "Breakpoint #%d does not exist.", bpnum);
       return TCL_ERROR;
     }
 
@@ -513,8 +510,7 @@ gdb_set_bp (ClientData clientData, Tcl_I
     disp = disp_donttouch;
   else
     {
-      Tcl_SetObjResult (interp, 
-			Tcl_NewStringObj ("type must be \"temp\" or \"normal\"", -1));
+      gdbtk_set_result (interp, "type must be \"temp\" or \"normal\"");
       return TCL_ERROR;
     }
 
@@ -587,8 +583,7 @@ gdb_set_bp_addr (ClientData clientData, 
     disp = disp_donttouch;
   else
     {
-      Tcl_SetObjResult (interp, 
-			Tcl_NewStringObj ("type must be \"temp\" or \"normal\"", -1));
+      gdbtk_set_result (interp, "type must be \"temp\" or \"normal\"");
       return TCL_ERROR;
     }
 
@@ -830,10 +825,7 @@ gdb_get_tracepoint_info (ClientData clie
 
   if (tp == NULL)
     {
-      char *buff;
-      xasprintf (&buff, "Tracepoint #%d does not exist", tpnum);
-      Tcl_SetStringObj (result_ptr->obj_ptr, buff, -1);
-      free(buff);
+      gdbtk_set_result (interp, "Tracepoint #%d does not exist", tpnum);
       return TCL_ERROR;
     }
 
Index: gdbtk-cmds.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-cmds.c,v
retrieving revision 1.42
diff -u -p -r1.42 gdbtk-cmds.c
--- gdbtk-cmds.c	2001/10/29 19:37:05	1.42
+++ gdbtk-cmds.c	2001/11/02 23:59:41
@@ -688,8 +688,7 @@ gdb_cmd (clientData, interp, objc, objv)
     {
       if (Tcl_GetBooleanFromObj (NULL, objv[2], &from_tty) != TCL_OK)
 	{
-	  Tcl_SetStringObj (result_ptr->obj_ptr, "from_tty must be a boolean.",
-			    -1);
+	  gdbtk_set_result (interp, "from_tty must be a boolean.");
 	  return TCL_ERROR;
 	}
     }
@@ -758,8 +757,7 @@ gdb_immediate_command (clientData, inter
     {
       if (Tcl_GetBooleanFromObj (NULL, objv[2], &from_tty) != TCL_OK)
 	{
-	  Tcl_SetStringObj (result_ptr->obj_ptr, "from_tty must be a boolean.",
-			    -1);
+	  gdbtk_set_result (interp, "from_tty must be a boolean.");
 	  return TCL_ERROR;
 	}
     }
@@ -923,14 +921,14 @@ gdb_load_info (clientData, interp, objc,
   loadfile_bfd = bfd_openr (filename, gnutarget);
   if (loadfile_bfd == NULL)
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr, "Open failed", -1);
+      gdbtk_set_result (interp, "Open of %s failed", filename);
       return TCL_ERROR;
     }
   old_cleanups = make_cleanup_bfd_close (loadfile_bfd);
 
   if (!bfd_check_format (loadfile_bfd, bfd_object))
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr, "Bad Object File", -1);
+      gdbtk_set_result (interp, "Bad Object File");
       return TCL_ERROR;
     }
 
@@ -1109,8 +1107,7 @@ gdb_find_file_command (clientData, inter
   /* We should always get a symtab. */
   if (!st)
     {
-      Tcl_SetStringObj ( result_ptr->obj_ptr,
-                         "File not found in symtab (2)", -1);
+      gdbtk_set_result (interp, "File not found in symtab (2)");
       return TCL_ERROR;
     }
 
@@ -1282,7 +1279,6 @@ gdb_search (clientData, interp, objc, ob
   if (objc < 3)
     {
       Tcl_WrongNumArgs (interp, 1, objv, "option regexp ?arg ...?");
-      result_ptr->flags |= GDBTK_IN_TCL_RESULT;
       return TCL_ERROR;
     }
 
@@ -1477,10 +1473,11 @@ gdb_listfuncs (clientData, interp, objc,
   symtab = full_lookup_symtab (Tcl_GetStringFromObj (objv[1], NULL));
   if (!symtab)
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr, "No such file", -1);
+      gdbtk_set_result (interp, "No such file (%s)", 
+		  Tcl_GetStringFromObj (objv[1], NULL));
       return TCL_ERROR;
     }
-
+  
   if (mangled == NULL)
     {
       mangled = Tcl_NewBooleanObj (1);
@@ -1651,14 +1648,13 @@ gdb_load_disassembly (ClientData clientD
   if ( Tk_NameToWindow (interp, client_data.widget,
 			Tk_MainWindow (interp)) == NULL)
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr, "Invalid widget name.", -1);
+      gdbtk_set_result (interp, "Invalid widget name.");
       return TCL_ERROR;
     }
 
   if (!Tcl_GetCommandInfo (interp, client_data.widget, &client_data.cmd))
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr, "Can't get widget command info",
-			-1);
+      gdbtk_set_result (interp, "Can't get widget command info");
       return TCL_ERROR;
     }
 
@@ -1669,8 +1665,7 @@ gdb_load_disassembly (ClientData clientD
     mixed_source_and_assembly = 0;
   else
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr,
-			"Second arg must be 'source' or 'nosource'", -1);
+      gdbtk_set_result (interp, "Second arg must be 'source' or 'nosource'");
       return TCL_ERROR;
     }
 
@@ -1695,7 +1690,7 @@ gdb_load_disassembly (ClientData clientD
       
       client_data.map_arr = "map_array";
       if (Tcl_UpVar (interp, "1", map_name, client_data.map_arr, 0) != 
TCL_OK) {
-	Tcl_SetStringObj (result_ptr->obj_ptr, "Can't link map array.", -1);
+	gdbtk_set_result (interp, "Can't link map array.");
 	return TCL_ERROR;
       }
 
@@ -2376,7 +2371,7 @@ gdb_loc (ClientData clientData, Tcl_Inte
 
       if (sals.nelts != 1)
 	{
-	  Tcl_SetStringObj (result_ptr->obj_ptr, "Ambiguous line spec", -1);
+	  gdbtk_set_result (interp, "Ambiguous line spec", -1);
 	  return TCL_ERROR;
 	}
       resolve_sal_pc (&sal);
@@ -2538,11 +2533,7 @@ gdb_set_mem (clientData, interp, objc, o
   if (size < 0)
     {
       /* Error in input */
-      char *res;
-
-      xasprintf (&res, "Invalid hexadecimal input: \"0x%s\"", hexstr);
-      Tcl_SetObjResult (interp, Tcl_NewStringObj (res, -1));
-      free (res);
+      gdbtk_set_result (interp, "Invalid hexadecimal input: \"0x%s\"", 
hexstr);
       return TCL_ERROR;
     }
 
@@ -2589,7 +2580,7 @@ gdb_get_mem (ClientData clientData, Tcl_
     }
   else if (size <= 0)
     {
-      Tcl_SetObjResult (interp, Tcl_NewStringObj ("Invalid size, must be > 
0", -1));
+      gdbtk_set_result (interp, "Invalid size, must be > 0");
       return TCL_ERROR;
     }
 
@@ -2600,8 +2591,7 @@ gdb_get_mem (ClientData clientData, Tcl_
     }
   else if (nbytes <= 0)
     {
-      Tcl_SetObjResult (interp, 
-			Tcl_NewStringObj ("Invalid number of bytes, must be > 0", -1));
+      gdbtk_set_result (interp, "Invalid number of bytes, must be > 0");
       return TCL_ERROR;
     }
 
@@ -2612,8 +2602,7 @@ gdb_get_mem (ClientData clientData, Tcl_
     }
   else if (bpr <= 0)
     {
-      Tcl_SetObjResult (interp,
-			Tcl_NewStringObj ("Invalid bytes per row, must be > 0", -1));
+      gdbtk_set_result (interp, "Invalid bytes per row, must be > 0");
       return TCL_ERROR;
     }
 
@@ -2623,7 +2612,7 @@ gdb_get_mem (ClientData clientData, Tcl_
   mbuf = (char *) malloc (nbytes + 32);
   if (!mbuf)
     {
-      Tcl_SetObjResult (interp, Tcl_NewStringObj ("Out of memory.", -1));
+      gdbtk_set_result (interp, "Out of memory.");
       return TCL_ERROR;
     }
 
@@ -2773,8 +2762,7 @@ gdb_loadfile (ClientData clientData, Tcl
 
   if (!Tcl_GetCommandInfo (interp, widget, &text_cmd))
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr, "Can't get widget command info",
-			-1);
+      gdbtk_set_result (interp, "Can't get widget command info");
       return TCL_ERROR;
     }
   
@@ -2784,15 +2772,14 @@ gdb_loadfile (ClientData clientData, Tcl
   symtab = full_lookup_symtab (file);
   if (!symtab)
     {
-      Tcl_SetStringObj ( result_ptr->obj_ptr, "File not found in symtab", 
-1);
+      gdbtk_set_result (interp, "File not found in symtab");
       return TCL_ERROR;
     }
 
   file = symtab_to_filename ( symtab );
   if ((fp = fopen ( file, "r" )) == NULL)
     {
-      Tcl_SetStringObj ( result_ptr->obj_ptr, "Can't open file for reading",
-			 -1);
+      gdbtk_set_result (interp, "Can't open file for reading");
       return TCL_ERROR;
     }
 
@@ -2823,8 +2810,8 @@ gdb_loadfile (ClientData clientData, Tcl
   ltable = (char *)malloc (LTABLE_SIZE);
   if (ltable == NULL)
     {
-      Tcl_SetStringObj ( result_ptr->obj_ptr, "Out of memory.", -1);
       fclose (fp);
+      gdbtk_set_result (interp, "Out of memory.");
       return TCL_ERROR;
     }
 
@@ -2844,10 +2831,9 @@ gdb_loadfile (ClientData clientData, Tcl
               ltable_size *= 2;
               if (new_ltable == NULL)
                 {
-                  Tcl_SetStringObj ( result_ptr->obj_ptr, "Out of memory.",
-				     -1);
                   free (ltable);
                   fclose (fp);
+		  gdbtk_set_result (interp, "Out of memory.");
                   return TCL_ERROR;
                 }
               ltable = new_ltable;
@@ -3103,4 +3089,17 @@ pc_function_name (pc)
     funcname = "";
 
   return funcname;
+}
+
+void
+gdbtk_set_result (Tcl_Interp *interp, const char *fmt,...)
+{
+  va_list args;
+  char *buf;
+
+  va_start (args, fmt);
+  xvasprintf (&buf, fmt, args);
+  va_end (args);
+  Tcl_SetObjResult (interp, Tcl_NewStringObj (buf, -1));
+  xfree(buf);
 }
Index: gdbtk-cmds.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-cmds.h,v
retrieving revision 1.1
diff -u -p -r1.1 gdbtk-cmds.h
--- gdbtk-cmds.h	2001/05/10 18:04:23	1.1
+++ gdbtk-cmds.h	2001/11/02 23:59:41
@@ -50,6 +50,9 @@ extern char *pc_function_name (CORE_ADDR
    a Tcl list object. */
 extern void sprintf_append_element_to_obj (Tcl_Obj * objp, char *format, 
...);
 
+/* printf-like function to return error messages */
+extern void gdbtk_set_result (Tcl_Interp *interp, const char *fmt,...);
+
 /* Module init routines: Each module of commands should be declared here. */
 extern int Gdbtk_Breakpoint_Init (Tcl_Interp *interp);
 extern int Gdbtk_Stack_Init (Tcl_Interp *interp);
Index: gdbtk-stack.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-stack.c,v
retrieving revision 1.4
diff -u -p -r1.4 gdbtk-stack.c
--- gdbtk-stack.c	2001/10/17 20:35:32	1.4
+++ gdbtk-stack.c	2001/11/02 23:59:42
@@ -101,7 +101,6 @@ gdb_block_vars (clientData, interp, objc
   if (objc < 3)
     {
       Tcl_WrongNumArgs (interp, 1, objv, "startAddr endAddr");
-      result_ptr->flags |= GDBTK_IN_TCL_RESULT;
       return TCL_ERROR;
     }
 
@@ -319,8 +318,7 @@ gdb_get_vars_command (clientData, interp
       sals = decode_line_1 (&args, 1, NULL, 0, &canonical);
       if (sals.nelts == 0)
 	{
-	  Tcl_SetStringObj (result_ptr->obj_ptr,
-			    "error decoding line", -1);
+	  gdbtk_set_result (interp, "error decoding line");
 	  return TCL_ERROR;
 	}
 
@@ -479,7 +477,6 @@ gdb_stack (clientData, interp, objc, obj
   if (objc < 3)
     {
       Tcl_WrongNumArgs (interp, 1, objv, "start count");
-      result_ptr->flags |= GDBTK_IN_TCL_RESULT;
       return TCL_ERROR;
     }
 
Index: gdbtk-varobj.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-varobj.c,v
retrieving revision 1.9
diff -u -p -r1.9 gdbtk-varobj.c
--- gdbtk-varobj.c	2001/10/17 20:35:32	1.9
+++ gdbtk-varobj.c	2001/11/02 23:59:42
@@ -510,11 +510,9 @@ variable_format (interp, objc, objv, var
 	varobj_set_display_format (var, FORMAT_OCTAL);
       else
 	{
-	  Tcl_Obj *obj = Tcl_NewStringObj (NULL, 0);
-	  Tcl_AppendStringsToObj (obj, "unknown display format \"",
-				  fmt, "\": must be: \"natural\", \"binary\""
-		      ", \"decimal\", \"hexadecimal\", or \"octal\"", NULL);
-	  Tcl_SetObjResult (interp, obj);
+	  gdbtk_set_result (interp, "unknown display format \"",
+		      fmt, "\": must be: \"natural\", \"binary\""
+		      ", \"decimal\", \"hexadecimal\", or \"octal\"");
 	  return TCL_ERROR;
 	}
     }
@@ -597,9 +595,7 @@ variable_value (interp, objc, objv, var)
 	  s = Tcl_GetStringFromObj (objv[2], NULL);
 	  if (!varobj_set_value (var, s))
             {
-              r = error_last_message ();
-              Tcl_SetObjResult (interp, Tcl_NewStringObj (r, -1));
-              FREEIF (r);
+	      gdbtk_set_result (interp, "%s", error_last_message());
 	      return TCL_ERROR;
             }
 	}

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA] gdbtk_set_result
  2001-11-02 16:20 [RFA] gdbtk_set_result Martin M. Hunt
@ 2001-11-04 11:25 ` Keith Seitz
  2001-11-05 11:30   ` Martin M. Hunt
  0 siblings, 1 reply; 5+ messages in thread
From: Keith Seitz @ 2001-11-04 11:25 UTC (permalink / raw)
  To: Martin M. Hunt; +Cc: Insight Mailing List

On Fri, 2 Nov 2001, Martin M. Hunt wrote:

> This patch uses the new function gdbtk_set_result() to correctly set return
> strings on errors.

Wow, this looks great. I just have one or two questions...

> Index: gdbtk-varobj.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-varobj.c,v
> retrieving revision 1.9
> diff -u -p -r1.9 gdbtk-varobj.c
> --- gdbtk-varobj.c	2001/10/17 20:35:32	1.9
> +++ gdbtk-varobj.c	2001/11/02 23:59:42
> @@ -597,9 +595,7 @@ variable_value (interp, objc, objv, var)
>  	  s = Tcl_GetStringFromObj (objv[2], NULL);
>  	  if (!varobj_set_value (var, s))
>              {
> -              r = error_last_message ();
> -              Tcl_SetObjResult (interp, Tcl_NewStringObj (r, -1));
> -              FREEIF (r);
> +	      gdbtk_set_result (interp, "%s", error_last_message());
>  	      return TCL_ERROR;
>              }
>  	}

This doesn't look right. Don't we still need to free error_last_message's
return result?

Otherwise, this is just fantastic! I get to knock something off my TODO
list!!

Yippee!!!
Keith


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA] gdbtk_set_result
  2001-11-04 11:25 ` Keith Seitz
@ 2001-11-05 11:30   ` Martin M. Hunt
  2001-11-05 11:34     ` Keith Seitz
  0 siblings, 1 reply; 5+ messages in thread
From: Martin M. Hunt @ 2001-11-05 11:30 UTC (permalink / raw)
  To: Keith Seitz; +Cc: Insight Mailing List

On Sunday 04 November 2001 11:25 am, Keith Seitz wrote:
> On Fri, 2 Nov 2001, Martin M. Hunt wrote:
> > This patch uses the new function gdbtk_set_result() to correctly set
> > return strings on errors.
>
> Wow, this looks great. I just have one or two questions...
>
> > Index: gdbtk-varobj.c
> > ===================================================================
> > RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-varobj.c,v
> > retrieving revision 1.9
> > diff -u -p -r1.9 gdbtk-varobj.c
> > --- gdbtk-varobj.c	2001/10/17 20:35:32	1.9
> > +++ gdbtk-varobj.c	2001/11/02 23:59:42
> > @@ -597,9 +595,7 @@ variable_value (interp, objc, objv, var)
> >  	  s = Tcl_GetStringFromObj (objv[2], NULL);
> >  	  if (!varobj_set_value (var, s))
> >              {
> > -              r = error_last_message ();
> > -              Tcl_SetObjResult (interp, Tcl_NewStringObj (r, -1));
> > -              FREEIF (r);
> > +	      gdbtk_set_result (interp, "%s", error_last_message());
> >  	      return TCL_ERROR;
> >              }
> >  	}
>
> This doesn't look right. Don't we still need to free error_last_message's
> return result?

Yeah, glad you spotted that.  

Should really be xfree() and not FREEIF() shouldn't it.

Here's a revised patch

-- 
Martin Hunt
GDB Engineer
Red Hat, Inc.

Index: generic/gdbtk-bp.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-bp.c,v
retrieving revision 1.12
diff -u -p -r1.12 gdbtk-bp.c
--- gdbtk-bp.c	2001/10/29 21:45:31	1.12
+++ gdbtk-bp.c	2001/11/05 19:27:05
@@ -309,10 +309,7 @@ gdb_get_breakpoint_info (ClientData clie
   b = (bpnum <= breakpoint_list_size ? breakpoint_list[bpnum] : NULL);
   if (!b || b->type != bp_breakpoint)
     {
-      char *err_buf;
-      xasprintf (&err_buf, "Breakpoint #%d does not exist.", bpnum);
-      Tcl_SetStringObj (result_ptr->obj_ptr, err_buf, -1);
-      free(err_buf);
+      gdbtk_set_result (interp, "Breakpoint #%d does not exist.", bpnum);
       return TCL_ERROR;
     }
 
@@ -513,8 +510,7 @@ gdb_set_bp (ClientData clientData, Tcl_I
     disp = disp_donttouch;
   else
     {
-      Tcl_SetObjResult (interp, 
-			Tcl_NewStringObj ("type must be \"temp\" or \"normal\"", -1));
+      gdbtk_set_result (interp, "type must be \"temp\" or \"normal\"");
       return TCL_ERROR;
     }
 
@@ -587,8 +583,7 @@ gdb_set_bp_addr (ClientData clientData, 
     disp = disp_donttouch;
   else
     {
-      Tcl_SetObjResult (interp, 
-			Tcl_NewStringObj ("type must be \"temp\" or \"normal\"", -1));
+      gdbtk_set_result (interp, "type must be \"temp\" or \"normal\"");
       return TCL_ERROR;
     }
 
@@ -830,10 +825,7 @@ gdb_get_tracepoint_info (ClientData clie
 
   if (tp == NULL)
     {
-      char *buff;
-      xasprintf (&buff, "Tracepoint #%d does not exist", tpnum);
-      Tcl_SetStringObj (result_ptr->obj_ptr, buff, -1);
-      free(buff);
+      gdbtk_set_result (interp, "Tracepoint #%d does not exist", tpnum);
       return TCL_ERROR;
     }
 
Index: generic/gdbtk-cmds.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-cmds.c,v
retrieving revision 1.42
diff -u -p -r1.42 gdbtk-cmds.c
--- gdbtk-cmds.c	2001/10/29 19:37:05	1.42
+++ gdbtk-cmds.c	2001/11/05 19:27:07
@@ -688,8 +688,7 @@ gdb_cmd (clientData, interp, objc, objv)
     {
       if (Tcl_GetBooleanFromObj (NULL, objv[2], &from_tty) != TCL_OK)
 	{
-	  Tcl_SetStringObj (result_ptr->obj_ptr, "from_tty must be a boolean.",
-			    -1);
+	  gdbtk_set_result (interp, "from_tty must be a boolean.");
 	  return TCL_ERROR;
 	}
     }
@@ -758,8 +757,7 @@ gdb_immediate_command (clientData, inter
     {
       if (Tcl_GetBooleanFromObj (NULL, objv[2], &from_tty) != TCL_OK)
 	{
-	  Tcl_SetStringObj (result_ptr->obj_ptr, "from_tty must be a boolean.",
-			    -1);
+	  gdbtk_set_result (interp, "from_tty must be a boolean.");
 	  return TCL_ERROR;
 	}
     }
@@ -923,14 +921,14 @@ gdb_load_info (clientData, interp, objc,
   loadfile_bfd = bfd_openr (filename, gnutarget);
   if (loadfile_bfd == NULL)
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr, "Open failed", -1);
+      gdbtk_set_result (interp, "Open of %s failed", filename);
       return TCL_ERROR;
     }
   old_cleanups = make_cleanup_bfd_close (loadfile_bfd);
 
   if (!bfd_check_format (loadfile_bfd, bfd_object))
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr, "Bad Object File", -1);
+      gdbtk_set_result (interp, "Bad Object File");
       return TCL_ERROR;
     }
 
@@ -1109,8 +1107,7 @@ gdb_find_file_command (clientData, inter
   /* We should always get a symtab. */
   if (!st)
     {
-      Tcl_SetStringObj ( result_ptr->obj_ptr,
-                         "File not found in symtab (2)", -1);
+      gdbtk_set_result (interp, "File not found in symtab (2)");
       return TCL_ERROR;
     }
 
@@ -1282,7 +1279,6 @@ gdb_search (clientData, interp, objc, ob
   if (objc < 3)
     {
       Tcl_WrongNumArgs (interp, 1, objv, "option regexp ?arg ...?");
-      result_ptr->flags |= GDBTK_IN_TCL_RESULT;
       return TCL_ERROR;
     }
 
@@ -1477,10 +1473,11 @@ gdb_listfuncs (clientData, interp, objc,
   symtab = full_lookup_symtab (Tcl_GetStringFromObj (objv[1], NULL));
   if (!symtab)
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr, "No such file", -1);
+      gdbtk_set_result (interp, "No such file (%s)", 
+		  Tcl_GetStringFromObj (objv[1], NULL));
       return TCL_ERROR;
     }
-
+  
   if (mangled == NULL)
     {
       mangled = Tcl_NewBooleanObj (1);
@@ -1651,14 +1648,13 @@ gdb_load_disassembly (ClientData clientD
   if ( Tk_NameToWindow (interp, client_data.widget,
 			Tk_MainWindow (interp)) == NULL)
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr, "Invalid widget name.", -1);
+      gdbtk_set_result (interp, "Invalid widget name.");
       return TCL_ERROR;
     }
 
   if (!Tcl_GetCommandInfo (interp, client_data.widget, &client_data.cmd))
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr, "Can't get widget command info",
-			-1);
+      gdbtk_set_result (interp, "Can't get widget command info");
       return TCL_ERROR;
     }
 
@@ -1669,8 +1665,7 @@ gdb_load_disassembly (ClientData clientD
     mixed_source_and_assembly = 0;
   else
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr,
-			"Second arg must be 'source' or 'nosource'", -1);
+      gdbtk_set_result (interp, "Second arg must be 'source' or 'nosource'");
       return TCL_ERROR;
     }
 
@@ -1695,7 +1690,7 @@ gdb_load_disassembly (ClientData clientD
       
       client_data.map_arr = "map_array";
       if (Tcl_UpVar (interp, "1", map_name, client_data.map_arr, 0) != TCL_OK) {
-	Tcl_SetStringObj (result_ptr->obj_ptr, "Can't link map array.", -1);
+	gdbtk_set_result (interp, "Can't link map array.");
 	return TCL_ERROR;
       }
 
@@ -2376,7 +2371,7 @@ gdb_loc (ClientData clientData, Tcl_Inte
 
       if (sals.nelts != 1)
 	{
-	  Tcl_SetStringObj (result_ptr->obj_ptr, "Ambiguous line spec", -1);
+	  gdbtk_set_result (interp, "Ambiguous line spec", -1);
 	  return TCL_ERROR;
 	}
       resolve_sal_pc (&sal);
@@ -2538,11 +2533,7 @@ gdb_set_mem (clientData, interp, objc, o
   if (size < 0)
     {
       /* Error in input */
-      char *res;
-
-      xasprintf (&res, "Invalid hexadecimal input: \"0x%s\"", hexstr);
-      Tcl_SetObjResult (interp, Tcl_NewStringObj (res, -1));
-      free (res);
+      gdbtk_set_result (interp, "Invalid hexadecimal input: \"0x%s\"", hexstr);
       return TCL_ERROR;
     }
 
@@ -2589,7 +2580,7 @@ gdb_get_mem (ClientData clientData, Tcl_
     }
   else if (size <= 0)
     {
-      Tcl_SetObjResult (interp, Tcl_NewStringObj ("Invalid size, must be > 0", -1));
+      gdbtk_set_result (interp, "Invalid size, must be > 0");
       return TCL_ERROR;
     }
 
@@ -2600,8 +2591,7 @@ gdb_get_mem (ClientData clientData, Tcl_
     }
   else if (nbytes <= 0)
     {
-      Tcl_SetObjResult (interp, 
-			Tcl_NewStringObj ("Invalid number of bytes, must be > 0", -1));
+      gdbtk_set_result (interp, "Invalid number of bytes, must be > 0");
       return TCL_ERROR;
     }
 
@@ -2612,8 +2602,7 @@ gdb_get_mem (ClientData clientData, Tcl_
     }
   else if (bpr <= 0)
     {
-      Tcl_SetObjResult (interp,
-			Tcl_NewStringObj ("Invalid bytes per row, must be > 0", -1));
+      gdbtk_set_result (interp, "Invalid bytes per row, must be > 0");
       return TCL_ERROR;
     }
 
@@ -2623,7 +2612,7 @@ gdb_get_mem (ClientData clientData, Tcl_
   mbuf = (char *) malloc (nbytes + 32);
   if (!mbuf)
     {
-      Tcl_SetObjResult (interp, Tcl_NewStringObj ("Out of memory.", -1));
+      gdbtk_set_result (interp, "Out of memory.");
       return TCL_ERROR;
     }
 
@@ -2773,8 +2762,7 @@ gdb_loadfile (ClientData clientData, Tcl
 
   if (!Tcl_GetCommandInfo (interp, widget, &text_cmd))
     {
-      Tcl_SetStringObj (result_ptr->obj_ptr, "Can't get widget command info",
-			-1);
+      gdbtk_set_result (interp, "Can't get widget command info");
       return TCL_ERROR;
     }
   
@@ -2784,15 +2772,14 @@ gdb_loadfile (ClientData clientData, Tcl
   symtab = full_lookup_symtab (file);
   if (!symtab)
     {
-      Tcl_SetStringObj ( result_ptr->obj_ptr, "File not found in symtab", -1);
+      gdbtk_set_result (interp, "File not found in symtab");
       return TCL_ERROR;
     }
 
   file = symtab_to_filename ( symtab );
   if ((fp = fopen ( file, "r" )) == NULL)
     {
-      Tcl_SetStringObj ( result_ptr->obj_ptr, "Can't open file for reading",
-			 -1);
+      gdbtk_set_result (interp, "Can't open file for reading");
       return TCL_ERROR;
     }
 
@@ -2823,8 +2810,8 @@ gdb_loadfile (ClientData clientData, Tcl
   ltable = (char *)malloc (LTABLE_SIZE);
   if (ltable == NULL)
     {
-      Tcl_SetStringObj ( result_ptr->obj_ptr, "Out of memory.", -1);
       fclose (fp);
+      gdbtk_set_result (interp, "Out of memory.");
       return TCL_ERROR;
     }
 
@@ -2844,10 +2831,9 @@ gdb_loadfile (ClientData clientData, Tcl
               ltable_size *= 2;
               if (new_ltable == NULL)
                 {
-                  Tcl_SetStringObj ( result_ptr->obj_ptr, "Out of memory.",
-				     -1);
                   free (ltable);
                   fclose (fp);
+		  gdbtk_set_result (interp, "Out of memory.");
                   return TCL_ERROR;
                 }
               ltable = new_ltable;
@@ -3103,4 +3089,17 @@ pc_function_name (pc)
     funcname = "";
 
   return funcname;
+}
+
+void
+gdbtk_set_result (Tcl_Interp *interp, const char *fmt,...)
+{
+  va_list args;
+  char *buf;
+
+  va_start (args, fmt);
+  xvasprintf (&buf, fmt, args);
+  va_end (args);
+  Tcl_SetObjResult (interp, Tcl_NewStringObj (buf, -1));
+  xfree(buf);
 }
Index: generic/gdbtk-cmds.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-cmds.h,v
retrieving revision 1.1
diff -u -p -r1.1 gdbtk-cmds.h
--- gdbtk-cmds.h	2001/05/10 18:04:23	1.1
+++ gdbtk-cmds.h	2001/11/05 19:27:07
@@ -50,6 +50,9 @@ extern char *pc_function_name (CORE_ADDR
    a Tcl list object. */
 extern void sprintf_append_element_to_obj (Tcl_Obj * objp, char *format, ...);
 
+/* printf-like function to return error messages */
+extern void gdbtk_set_result (Tcl_Interp *interp, const char *fmt,...);
+
 /* Module init routines: Each module of commands should be declared here. */
 extern int Gdbtk_Breakpoint_Init (Tcl_Interp *interp);
 extern int Gdbtk_Stack_Init (Tcl_Interp *interp);
Index: generic/gdbtk-stack.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-stack.c,v
retrieving revision 1.4
diff -u -p -r1.4 gdbtk-stack.c
--- gdbtk-stack.c	2001/10/17 20:35:32	1.4
+++ gdbtk-stack.c	2001/11/05 19:27:07
@@ -101,7 +101,6 @@ gdb_block_vars (clientData, interp, objc
   if (objc < 3)
     {
       Tcl_WrongNumArgs (interp, 1, objv, "startAddr endAddr");
-      result_ptr->flags |= GDBTK_IN_TCL_RESULT;
       return TCL_ERROR;
     }
 
@@ -319,8 +318,7 @@ gdb_get_vars_command (clientData, interp
       sals = decode_line_1 (&args, 1, NULL, 0, &canonical);
       if (sals.nelts == 0)
 	{
-	  Tcl_SetStringObj (result_ptr->obj_ptr,
-			    "error decoding line", -1);
+	  gdbtk_set_result (interp, "error decoding line");
 	  return TCL_ERROR;
 	}
 
@@ -479,7 +477,6 @@ gdb_stack (clientData, interp, objc, obj
   if (objc < 3)
     {
       Tcl_WrongNumArgs (interp, 1, objv, "start count");
-      result_ptr->flags |= GDBTK_IN_TCL_RESULT;
       return TCL_ERROR;
     }
 
Index: generic/gdbtk-varobj.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-varobj.c,v
retrieving revision 1.9
diff -u -p -r1.9 gdbtk-varobj.c
--- gdbtk-varobj.c	2001/10/17 20:35:32	1.9
+++ gdbtk-varobj.c	2001/11/05 19:27:07
@@ -510,11 +510,9 @@ variable_format (interp, objc, objv, var
 	varobj_set_display_format (var, FORMAT_OCTAL);
       else
 	{
-	  Tcl_Obj *obj = Tcl_NewStringObj (NULL, 0);
-	  Tcl_AppendStringsToObj (obj, "unknown display format \"",
-				  fmt, "\": must be: \"natural\", \"binary\""
-		      ", \"decimal\", \"hexadecimal\", or \"octal\"", NULL);
-	  Tcl_SetObjResult (interp, obj);
+	  gdbtk_set_result (interp, "unknown display format \"",
+		      fmt, "\": must be: \"natural\", \"binary\""
+		      ", \"decimal\", \"hexadecimal\", or \"octal\"");
 	  return TCL_ERROR;
 	}
     }
@@ -597,9 +595,9 @@ variable_value (interp, objc, objv, var)
 	  s = Tcl_GetStringFromObj (objv[2], NULL);
 	  if (!varobj_set_value (var, s))
             {
-              r = error_last_message ();
-              Tcl_SetObjResult (interp, Tcl_NewStringObj (r, -1));
-              FREEIF (r);
+	      r = error_last_message();
+	      gdbtk_set_result (interp, "%s", r);
+	      xfree (r);
 	      return TCL_ERROR;
             }
 	}

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA] gdbtk_set_result
  2001-11-05 11:30   ` Martin M. Hunt
@ 2001-11-05 11:34     ` Keith Seitz
  2001-11-05 13:27       ` Fernando Nasser
  0 siblings, 1 reply; 5+ messages in thread
From: Keith Seitz @ 2001-11-05 11:34 UTC (permalink / raw)
  To: Martin M. Hunt; +Cc: Insight Mailing List

On Mon, 5 Nov 2001, Martin M. Hunt wrote:

> Should really be xfree() and not FREEIF() shouldn't it.

Well, yes/no. FREEIF should use xfree (but it doesn't). FREEIF just checks
to make sure that the pointer isn't null, that's all.

Actually, that looks like another cleanup that can be made on varobj:
free->xfree.

Otherwise, looks good. Pleaes commit.
Keith


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA] gdbtk_set_result
  2001-11-05 11:34     ` Keith Seitz
@ 2001-11-05 13:27       ` Fernando Nasser
  0 siblings, 0 replies; 5+ messages in thread
From: Fernando Nasser @ 2001-11-05 13:27 UTC (permalink / raw)
  To: Keith Seitz; +Cc: Martin M. Hunt, Insight Mailing List

Keith Seitz wrote:
> 
> Actually, that looks like another cleanup that can be made on varobj:
> free->xfree.
> 

Yes.

When xfree() was created, (almost) everything in gdb/* got updated.
So varobj.c got free->xfree, but gdbtk/gdbtk-varobj.c did not.

-- 
Fernando Nasser
Red Hat - Toronto                       E-Mail:  fnasser@redhat.com
2323 Yonge Street, Suite #300
Toronto, Ontario   M4P 2C9

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2001-11-05 13:27 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-11-02 16:20 [RFA] gdbtk_set_result Martin M. Hunt
2001-11-04 11:25 ` Keith Seitz
2001-11-05 11:30   ` Martin M. Hunt
2001-11-05 11:34     ` Keith Seitz
2001-11-05 13:27       ` Fernando Nasser

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).