Avoid double-decoding in ada_add_global_exceptions

I noticed that ada_add_global_exceptions calls ada_decode on
'search_name' -- and then passes this to name_matches_regex, which
also calls ada_decode.

name_matches_regex is also used later, where the result of
'natural_name ()' is passed to it -- but natural_name also calls
ada_decode.

So, I think the call to ada_decode in name_matches_regex is redundant.
This patch removes it, and turns name_matches_regex into an inner
function to avoid propagating its use.

Note that, right now, the DWARF implementation of
expand_symtabs_matching does not in fact pass an encoded name to this
callback.  So, this code remains slightly (but currently harmlessly)
wrong.  expand_symtabs_matching is fixed by another pending series of
mine.
This commit is contained in:
Tom Tromey
2025-02-24 13:18:27 -07:00
parent 37b0b22f16
commit 5393cfd07a

View File

@@ -12999,15 +12999,6 @@ ada_add_exceptions_from_frame (compiled_regex *preg,
} }
} }
/* Return true if NAME matches PREG or if PREG is NULL. */
static bool
name_matches_regex (const char *name, compiled_regex *preg)
{
return (preg == NULL
|| preg->exec (ada_decode (name).c_str (), 0, NULL, 0) == 0);
}
/* Add all exceptions defined globally whose name name match /* Add all exceptions defined globally whose name name match
a regular expression, excluding standard exceptions. a regular expression, excluding standard exceptions.
@@ -13031,6 +13022,13 @@ static void
ada_add_global_exceptions (compiled_regex *preg, ada_add_global_exceptions (compiled_regex *preg,
std::vector<ada_exc_info> *exceptions) std::vector<ada_exc_info> *exceptions)
{ {
/* Return true if NAME matches PREG or if PREG is NULL. */
auto name_matches_regex = [&] (const char *name)
{
return preg == nullptr || preg->exec (name, 0, NULL, 0) == 0;
};
/* In Ada, the symbol "search name" is a linkage name, whereas the /* In Ada, the symbol "search name" is a linkage name, whereas the
regular expression used to do the matching refers to the natural regular expression used to do the matching refers to the natural
name. So match against the decoded name. */ name. So match against the decoded name. */
@@ -13039,7 +13037,7 @@ ada_add_global_exceptions (compiled_regex *preg,
[&] (const char *search_name) [&] (const char *search_name)
{ {
std::string decoded = ada_decode (search_name); std::string decoded = ada_decode (search_name);
return name_matches_regex (decoded.c_str (), preg); return name_matches_regex (decoded.c_str ());
}, },
NULL, NULL,
SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK, SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK,
@@ -13065,7 +13063,7 @@ ada_add_global_exceptions (compiled_regex *preg,
for (struct symbol *sym : block_iterator_range (b)) for (struct symbol *sym : block_iterator_range (b))
if (ada_is_non_standard_exception_sym (sym) if (ada_is_non_standard_exception_sym (sym)
&& name_matches_regex (sym->natural_name (), preg)) && name_matches_regex (sym->natural_name ()))
{ {
struct ada_exc_info info struct ada_exc_info info
= {sym->print_name (), sym->value_address ()}; = {sym->print_name (), sym->value_address ()};