This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFA 2/2] C++-ify break-catch-throw
- From: Pedro Alves <palves at redhat dot com>
- To: Tom Tromey <tom at tromey dot com>, gdb-patches at sourceware dot org
- Date: Mon, 5 Jun 2017 11:33:57 +0100
- Subject: Re: [RFA 2/2] C++-ify break-catch-throw
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=palves at redhat dot com
- Dkim-filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 4334280460
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 4334280460
- References: <20170604225353.18008-1-tom@tromey.com> <20170604225353.18008-3-tom@tromey.com> <ea509791-c718-a22e-28ed-439c6d5b6e08@redhat.com>
On 06/05/2017 11:21 AM, Pedro Alves wrote:
> On 06/04/2017 11:53 PM, Tom Tromey wrote:
>> @@ -452,17 +450,14 @@ catch_exception_command_1 (enum exception_event_kind ex_event,
>> char *arg_entry,
>> int tempflag, int from_tty)
>> {
>> - char *except_rx;
>> const char *cond_string = NULL;
>> - struct cleanup *cleanup;
>> const char *arg = arg_entry;
>>
>> if (!arg)
>> arg = "";
>> arg = skip_spaces_const (arg);
>>
>> - except_rx = extract_exception_regexp (&arg);
>> - cleanup = make_cleanup (xfree, except_rx);
>> + std::string except_rx = extract_exception_regexp (&arg);
>>
>> cond_string = ep_parse_optional_if_clause (&arg);
>>
>> @@ -474,10 +469,8 @@ catch_exception_command_1 (enum exception_event_kind ex_event,
>> && ex_event != EX_EVENT_RETHROW)
>> error (_("Unsupported or unknown exception event; cannot catch it"));
>>
>> - handle_gnu_v3_exceptions (tempflag, except_rx, cond_string,
>> + handle_gnu_v3_exceptions (tempflag, std::move (except_rx), cond_string,
>> ex_event, from_tty);
>> -
>> - discard_cleanups (cleanup);
>> }
>
> Something looks suspicious to me -- compile_rx_or_error returns with
> an installed cleanup that calls regfree, and handle_gnu_v3_exceptions
> leaves it installed too.
Maybe the cleanest would be to add a wrapper around regex_t,
and replace compile_rx_or_error with a ctor that throws,
like:
class gdb_regex
{
public:
// replaces old compile_rx_or_error
gdb_regex (const char *rx, const char *message)
{
gdb_assert (rx != NULL);
int code = regcomp (&m_pattern, rx, REG_NOSUB);
if (code != 0)
{
gdb::unique_xmalloc_ptr<char> err
= get_regcomp_error (code, &m_pattern);
error (("%s: %s"), message, err.get ());
}
}
~gdb_regex ()
{
regfree (&m_pattern);
}
// add convenience methods as needed.
private:
regex_t m_pattern;
};
and use it throughout.
Thanks,
Pedro Alves