/* Everything about catch/throw catchpoints, for GDB.
- Copyright (C) 1986-2020 Free Software Foundation, Inc.
+ Copyright (C) 1986-2022 Free Software Foundation, Inc.
This file is part of GDB.
#include "valprint.h"
#include "cli/cli-utils.h"
#include "completer.h"
-#include "gdb_obstack.h"
+#include "gdbsupport/gdb_obstack.h"
#include "mi/mi-common.h"
#include "linespec.h"
#include "probe.h"
#include "objfiles.h"
#include "cp-abi.h"
-#include "gdb_regex.h"
+#include "gdbsupport/gdb_regex.h"
#include "cp-support.h"
#include "location.h"
+#include "cli/cli-decode.h"
/* Each spot where we may place an exception-related catchpoint has
two names: the SDT probe point and the function name. This
/* Implement the 'check_status' method. */
static void
-check_status_exception_catchpoint (struct bpstats *bs)
+check_status_exception_catchpoint (struct bpstat *bs)
{
struct exception_catchpoint *self
= (struct exception_catchpoint *) bs->breakpoint_at;
if (self->pattern == NULL)
return;
+ const char *name = nullptr;
+ gdb::unique_xmalloc_ptr<char> canon;
try
{
struct value *typeinfo_arg;
- std::string canon;
fetch_probe_arguments (NULL, &typeinfo_arg);
type_name = cplus_typename_from_type_info (typeinfo_arg);
canon = cp_canonicalize_string (type_name.c_str ());
- if (!canon.empty ())
- std::swap (type_name, canon);
+ name = (canon != nullptr
+ ? canon.get ()
+ : type_name.c_str ());
}
catch (const gdb_exception_error &e)
{
exception_print (gdb_stderr, e);
}
- if (!type_name.empty ())
+ if (name != nullptr)
{
- if (self->pattern->exec (type_name.c_str (), 0, NULL, 0) != 0)
+ if (self->pattern->exec (name, 0, NULL, 0) != 0)
bs->stop = 0;
}
}
}
static enum print_stop_action
-print_it_exception_catchpoint (bpstat bs)
+print_it_exception_catchpoint (bpstat *bs)
{
struct ui_out *uiout = current_uiout;
struct breakpoint *b = bs->breakpoint_at;
if (!cp->exception_rx.empty ())
{
uiout->text (_("\tmatching: "));
- uiout->field_string ("regexp", cp->exception_rx.c_str ());
+ uiout->field_string ("regexp", cp->exception_rx);
uiout->text ("\n");
}
}
catch_catch_command (const char *arg, int from_tty,
struct cmd_list_element *command)
{
- bool tempflag = get_cmd_context (command) == CATCH_TEMPORARY;
+ bool tempflag = command->context () == CATCH_TEMPORARY;
catch_exception_event (EX_EVENT_CATCH, arg, tempflag, from_tty);
}
catch_throw_command (const char *arg, int from_tty,
struct cmd_list_element *command)
{
- bool tempflag = get_cmd_context (command) == CATCH_TEMPORARY;
+ bool tempflag = command->context () == CATCH_TEMPORARY;
catch_exception_event (EX_EVENT_THROW, arg, tempflag, from_tty);
}
catch_rethrow_command (const char *arg, int from_tty,
struct cmd_list_element *command)
{
- bool tempflag = get_cmd_context (command) == CATCH_TEMPORARY;
+ bool tempflag = command->context () == CATCH_TEMPORARY;
catch_exception_event (EX_EVENT_RETHROW, arg, tempflag, from_tty);
}
ops->allocate_location = allocate_location_exception_catchpoint;
}
+void _initialize_break_catch_throw ();
void
-_initialize_break_catch_throw (void)
+_initialize_break_catch_throw ()
{
initialize_throw_catchpoint_ops ();
add_catch_command ("catch", _("\
Catch an exception, when caught."),
catch_catch_command,
- NULL,
+ NULL,
CATCH_PERMANENT,
CATCH_TEMPORARY);
add_catch_command ("throw", _("\
Catch an exception, when thrown."),
catch_throw_command,
- NULL,
+ NULL,
CATCH_PERMANENT,
CATCH_TEMPORARY);
add_catch_command ("rethrow", _("\
Catch an exception, when rethrown."),
catch_rethrow_command,
- NULL,
+ NULL,
CATCH_PERMANENT,
CATCH_TEMPORARY);