/* Everything about catch/throw catchpoints, for GDB.
- Copyright (C) 1986-2019 Free Software Foundation, Inc.
+ Copyright (C) 1986-2021 Free Software Foundation, Inc.
This file is part of GDB.
#include "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
&& pc_probe.prob->get_name () != "rethrow"))
error (_("not stopped at a C++ exception catchpoint"));
- n_args = pc_probe.prob->get_argument_count (frame);
+ n_args = pc_probe.prob->get_argument_count (get_frame_arch (frame));
if (n_args < 2)
error (_("C++ exception catchpoint has too few arguments"));
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;
}
}
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);