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.
+
* mi/mi-main.c (mi_execute_command): Use catch_exception,
eliminate call to error_last_message.
(captured_mi_execute_command): Change return type to void.
}
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,
};
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;
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;
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);
}
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. */
/* 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
static void
breakpoint_notify (int b)
{
- gdb_breakpoint_query (uiout, b);
+ gdb_breakpoint_query (uiout, b, NULL);
}
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:
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;
}
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. */
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
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
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;
}
}
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);
}
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);
/* 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. */
return;
}
- gdb_thread_select (uiout, tidstr);
+ gdb_thread_select (uiout, tidstr, NULL);
}
static int
}
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'. */