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]

[commit/mi] Simplify MI error handling


Hello,

This patch modifies the gdb.h interfaces so that they explicitly return the error message in addition to the status (why it didn't do that from day one I don't know).

With that in place it becomes possible to simplify the MI's error code (it was handling MI and GDB errors very differently) so that it uses a single mechanism. Ya!

committed,
Andrew

(What was happening was evil. It was trusting that error_last_message hung around for longer then the next catch exception call :-()
2005-01-13  Andrew Cagney  <cagney@gnu.org>

	* breakpoint.c (gdb_breakpoint_query): Update, use
	catch_exceptions_with_msg.
	(do_captured_breakpoint): Add uiout parameter.
	(gdb_breakpoint): Update, use catch_exceptions_with_msg.
	* mi/mi-main.c (mi_cmd_thread_select): Pass mi_error_message to
	gdb_thread_select.  Return MI_CMD_ERROR instead of
	MI_CMD_CAUGHT_ERROR.
	(mi_cmd_thread_list_ids): Ditto for gdb_list_thread_ids.
	(enum captured_mi_execute_command_actions): Delete
	EXECUTE_COMMAND_DISPLAY_ERROR.
	(captured_mi_execute_command): Delete code handling
	MI_CMD_CAUGHT_ERROR.
	(mi_execute_command): Don't check for
	EXECUTE_COMMAND_DISPLAY_ERROR.
	* mi/mi-cmd-break.c (breakpoint_notify): Update call to
	gdb_breakpoint_query.
	(mi_cmd_break_insert): Pass mi_error_message to gdb_breakpoint.
	* mi/mi-cmds.h (enum mi_cmd_result): Delete MI_CMD_CAUGHT_ERROR.
	* gdb.h (gdb_thread_select, gdb_list_thread_ids)
	(gdb_breakpoint, gdb_breakpoint_query): Add error_message
	parameter.
	* thread.c (thread_command): Update call.
	(gdb_thread_select, gdb_list_thread_ids): Update, call
	catch_exceptions_with_msg.

Index: breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.189
diff -p -u -r1.189 breakpoint.c
--- breakpoint.c	13 Jan 2005 00:12:48 -0000	1.189
+++ breakpoint.c	13 Jan 2005 22:06:24 -0000
@@ -3603,14 +3603,14 @@ do_captured_breakpoint_query (struct ui_
 }
 
 enum gdb_rc
-gdb_breakpoint_query (struct ui_out *uiout, int bnum)
+gdb_breakpoint_query (struct ui_out *uiout, int bnum, char **error_message)
 {
   struct captured_breakpoint_query_args args;
   args.bnum = bnum;
   /* For the moment we don't trust print_one_breakpoint() to not throw
      an error. */
-  return catch_exceptions (uiout, do_captured_breakpoint_query, &args,
-			   NULL, RETURN_MASK_ALL);
+  return catch_exceptions_with_msg (uiout, do_captured_breakpoint_query, &args,
+				    NULL, error_message, RETURN_MASK_ALL);
 }
 
 /* Return non-zero if B is user settable (breakpoints, watchpoints,
@@ -5334,7 +5334,7 @@ struct captured_breakpoint_args
   };
 
 static int
-do_captured_breakpoint (void *data)
+do_captured_breakpoint (struct ui_out *uiout, void *data)
 {
   struct captured_breakpoint_args *args = data;
   struct symtabs_and_lines sals;
@@ -5432,7 +5432,8 @@ do_captured_breakpoint (void *data)
 enum gdb_rc
 gdb_breakpoint (char *address, char *condition,
 		int hardwareflag, int tempflag,
-		int thread, int ignore_count)
+		int thread, int ignore_count,
+		char **error_message)
 {
   struct captured_breakpoint_args args;
   args.address = address;
@@ -5441,8 +5442,8 @@ gdb_breakpoint (char *address, char *con
   args.tempflag = tempflag;
   args.thread = thread;
   args.ignore_count = ignore_count;
-  return catch_errors (do_captured_breakpoint, &args,
-		       NULL, RETURN_MASK_ALL);
+  return catch_exceptions_with_msg (uiout, do_captured_breakpoint, &args,
+				    NULL, error_message, RETURN_MASK_ALL);
 }
 
 
Index: gdb.h
===================================================================
RCS file: /cvs/src/src/gdb/gdb.h,v
retrieving revision 1.3
diff -p -u -r1.3 gdb.h
--- gdb.h	12 Apr 2003 17:41:25 -0000	1.3
+++ gdb.h	13 Jan 2005 22:06:24 -0000
@@ -29,8 +29,9 @@ struct ui_out;
 
 enum gdb_rc {
   /* The operation failed.  The failure message can be fetched by
-     calling ``char *error_last_message(void)''. The value is
-     determined by the catch_errors() interface. */
+     calling ``char *error_last_message(void)''.  The value is
+     determined by the catch_errors() interface.  The MSG parameter is
+     set to a freshly allocated copy of the error message.  */
   /* NOTE: Since ``defs.h:catch_errors()'' does not return an error /
      internal / quit indication it is not possible to return that
      here. */
@@ -46,17 +47,21 @@ enum gdb_rc {
 
 /* Print the specified breakpoint on GDB_STDOUT. (Eventually this
    function will ``print'' the object on ``output''). */
-enum gdb_rc gdb_breakpoint_query (struct ui_out *uiout, int bnum);
+enum gdb_rc gdb_breakpoint_query (struct ui_out *uiout, int bnum,
+				  char **error_message);
 
 /* Create a breakpoint at ADDRESS (a GDB source and line). */
 enum gdb_rc gdb_breakpoint (char *address, char *condition,
 			    int hardwareflag, int tempflag,
-			    int thread, int ignore_count);
+			    int thread, int ignore_count,
+			    char **error_message);
 
 /* Switch thread and print notification. */
-enum gdb_rc gdb_thread_select (struct ui_out *uiout, char *tidstr);
+enum gdb_rc gdb_thread_select (struct ui_out *uiout, char *tidstr,
+			       char **error_message);
 
 /* Print a list of known thread ids. */
-enum gdb_rc gdb_list_thread_ids (struct ui_out *uiout);
+enum gdb_rc gdb_list_thread_ids (struct ui_out *uiout,
+				 char **error_message);
 
 #endif
Index: thread.c
===================================================================
RCS file: /cvs/src/src/gdb/thread.c,v
retrieving revision 1.40
diff -p -u -r1.40 thread.c
--- thread.c	12 Jan 2005 18:31:33 -0000	1.40
+++ thread.c	13 Jan 2005 22:06:24 -0000
@@ -282,10 +282,10 @@ do_captured_list_thread_ids (struct ui_o
 /* Official gdblib interface function to get a list of thread ids and
    the total number. */
 enum gdb_rc
-gdb_list_thread_ids (struct ui_out *uiout)
+gdb_list_thread_ids (struct ui_out *uiout, char **error_message)
 {
-  return catch_exceptions (uiout, do_captured_list_thread_ids, NULL,
-			   NULL, RETURN_MASK_ALL);
+  return catch_exceptions_with_msg (uiout, do_captured_list_thread_ids, NULL,
+				    NULL, error_message, RETURN_MASK_ALL);
 }
 
 /* Load infrun state for the thread PID.  */
@@ -635,7 +635,7 @@ thread_command (char *tidstr, int from_t
       return;
     }
 
-  gdb_thread_select (uiout, tidstr);
+  gdb_thread_select (uiout, tidstr, NULL);
 }
 
 static int
@@ -667,10 +667,10 @@ do_captured_thread_select (struct ui_out
 }
 
 enum gdb_rc
-gdb_thread_select (struct ui_out *uiout, char *tidstr)
+gdb_thread_select (struct ui_out *uiout, char *tidstr, char **error_message)
 {
-  return catch_exceptions (uiout, do_captured_thread_select, tidstr,
-			   NULL, RETURN_MASK_ALL);
+  return catch_exceptions_with_msg (uiout, do_captured_thread_select, tidstr,
+				    NULL, error_message, RETURN_MASK_ALL);
 }
 
 /* Commands with a prefix of `thread'.  */
Index: mi/mi-cmd-break.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-cmd-break.c,v
retrieving revision 1.9
diff -p -u -r1.9 mi-cmd-break.c
--- mi/mi-cmd-break.c	26 Jun 2004 20:37:13 -0000	1.9
+++ mi/mi-cmd-break.c	13 Jan 2005 22:06:25 -0000
@@ -39,7 +39,7 @@ enum
 static void
 breakpoint_notify (int b)
 {
-  gdb_breakpoint_query (uiout, b);
+  gdb_breakpoint_query (uiout, b, NULL);
 }
 
 
@@ -140,12 +140,14 @@ mi_cmd_break_insert (char *command, char
     case REG_BP:
       rc = gdb_breakpoint (address, condition,
 			   0 /*hardwareflag */ , temp_p,
-			   thread, ignore_count);
+			   thread, ignore_count,
+			   &mi_error_message);
       break;
     case HW_BP:
       rc = gdb_breakpoint (address, condition,
 			   1 /*hardwareflag */ , temp_p,
-			   thread, ignore_count);
+			   thread, ignore_count,
+			   &mi_error_message);
       break;
 #if 0
     case REGEXP_BP:
@@ -163,7 +165,7 @@ mi_cmd_break_insert (char *command, char
   deprecated_set_gdb_event_hooks (old_hooks);
 
   if (rc == GDB_RC_FAIL)
-    return MI_CMD_CAUGHT_ERROR;
+    return MI_CMD_ERROR;
   else
     return MI_CMD_DONE;
 }
Index: mi/mi-cmds.h
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-cmds.h,v
retrieving revision 1.14
diff -p -u -r1.14 mi-cmds.h
--- mi/mi-cmds.h	10 Jun 2004 20:05:45 -0000	1.14
+++ mi/mi-cmds.h	13 Jan 2005 22:06:25 -0000
@@ -38,10 +38,6 @@ enum mi_cmd_result
        asprintf'd into the mi_error_message buffer.  The main loop will
        display the error message and the completion prompt. */
     MI_CMD_ERROR,
-    /* An error condition was detected and caught.  The error message is
-       in the global error message buffer. The main loop will display
-       the error message and the completion prompt. */
-    MI_CMD_CAUGHT_ERROR,
     /* The MI command has already displayed its completion message.
        Main loop will not display a completion message but will display
        the completion prompt. */
Index: mi/mi-main.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-main.c,v
retrieving revision 1.69
diff -p -u -r1.69 mi-main.c
--- mi/mi-main.c	13 Jan 2005 18:15:02 -0000	1.69
+++ mi/mi-main.c	13 Jan 2005 22:06:25 -0000
@@ -61,8 +61,7 @@ enum
 enum captured_mi_execute_command_actions
   {
     EXECUTE_COMMAND_DISPLAY_PROMPT,
-    EXECUTE_COMMAND_SUPRESS_PROMPT,
-    EXECUTE_COMMAND_DISPLAY_ERROR
+    EXECUTE_COMMAND_SUPRESS_PROMPT
   };
 
 /* This structure is used to pass information from captured_mi_execute_command
@@ -233,12 +232,12 @@ mi_cmd_thread_select (char *command, cha
       return MI_CMD_ERROR;
     }
   else
-    rc = gdb_thread_select (uiout, argv[0]);
+    rc = gdb_thread_select (uiout, argv[0], &mi_error_message);
 
   /* RC is enum gdb_rc if it is successful (>=0)
      enum return_reason if not (<0). */
   if ((int) rc < 0 && (enum return_reason) rc == RETURN_ERROR)
-    return MI_CMD_CAUGHT_ERROR;
+    return MI_CMD_ERROR;
   else if ((int) rc >= 0 && rc == GDB_RC_FAIL)
     return MI_CMD_ERROR;
   else
@@ -256,10 +255,10 @@ mi_cmd_thread_list_ids (char *command, c
       return MI_CMD_ERROR;
     }
   else
-    rc = gdb_list_thread_ids (uiout);
+    rc = gdb_list_thread_ids (uiout, &mi_error_message);
 
   if (rc == GDB_RC_FAIL)
-    return MI_CMD_CAUGHT_ERROR;
+    return MI_CMD_ERROR;
   else
     return MI_CMD_DONE;
 }
@@ -1091,12 +1090,6 @@ captured_mi_execute_command (struct ui_o
 		}
 	      mi_out_rewind (uiout);
 	    }
-	  else if (args->rc == MI_CMD_CAUGHT_ERROR)
-	    {
-	      mi_out_rewind (uiout);
-	      args->action = EXECUTE_COMMAND_DISPLAY_ERROR;
-	      return;
-	    }
 	  else
 	    mi_out_rewind (uiout);
 	}
@@ -1171,8 +1164,7 @@ mi_execute_command (char *cmd, int from_
 	  mi_parse_free (command);
 	  return;
 	}
-      if (args.action == EXECUTE_COMMAND_DISPLAY_ERROR
-	  || result.reason < 0)
+      if (result.reason < 0)
 	{
 	  char *msg = result.message;
 	  struct cleanup *cleanup = make_cleanup (xfree, msg);

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