From 5c4258f4c051a31d7209712ecd28830c55a92034 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 9 Oct 2020 08:27:30 -0600 Subject: [PATCH] Return std::string from ada_encode This changes ada_encode to return a std::string. This simplifies it somewhat, removes a use of GROW_VECT, and is also simpler for callers to use. gdb/ChangeLog 2020-10-09 Tom Tromey * ada-lang.h (ada_encode): Return std::string. * ada-lang.c (ada_encode_1): Return std::string. (ada_encode): Likewise. (type_from_tag, ada_lookup_name_info::ada_lookup_name_info): Update. * ada-exp.y (block_lookup, write_var_or_type): Update. --- gdb/ChangeLog | 9 +++++++++ gdb/ada-exp.y | 13 +++++++++---- gdb/ada-lang.c | 50 +++++++++++++++----------------------------------- gdb/ada-lang.h | 2 +- 4 files changed, 34 insertions(+), 40 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5df537c2792..01bca5c5842 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2020-10-09 Tom Tromey + + * ada-lang.h (ada_encode): Return std::string. + * ada-lang.c (ada_encode_1): Return std::string. + (ada_encode): Likewise. + (type_from_tag, ada_lookup_name_info::ada_lookup_name_info): + Update. + * ada-exp.y (block_lookup, write_var_or_type): Update. + 2020-10-09 Hannes Domani PR exp/26714 diff --git a/gdb/ada-exp.y b/gdb/ada-exp.y index 57d89b01fec..d09b43ea9ca 100644 --- a/gdb/ada-exp.y +++ b/gdb/ada-exp.y @@ -953,13 +953,17 @@ block_lookup (const struct block *context, const char *raw_name) struct symtab *symtab; const struct block *result = NULL; + std::string name_storage; if (raw_name[0] == '\'') { raw_name += 1; name = raw_name; } else - name = ada_encode (raw_name); + { + name_storage = ada_encode (raw_name); + name = name_storage.c_str (); + } nsyms = ada_lookup_symbol_list (name, context, VAR_DOMAIN, &syms); @@ -1201,9 +1205,10 @@ write_var_or_type (struct parser_state *par_state, if (block == NULL) block = par_state->expression_context_block; - encoded_name = ada_encode (name0.ptr); - name_len = strlen (encoded_name); - encoded_name = obstack_strndup (&temp_parse_space, encoded_name, name_len); + std::string name_storage = ada_encode (name0.ptr); + name_len = name_storage.size (); + encoded_name = obstack_strndup (&temp_parse_space, name_storage.c_str (), + name_len); for (depth = 0; depth < MAX_RENAMING_CHAIN_LENGTH; depth += 1) { int tail_index; diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 0df406bff48..fbce14bbe42 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -918,33 +918,21 @@ const struct ada_opname_map ada_opname_table[] = { {NULL, NULL} }; -/* The "encoded" form of DECODED, according to GNAT conventions. The - result is valid until the next call to ada_encode. If +/* The "encoded" form of DECODED, according to GNAT conventions. If THROW_ERRORS, throw an error if invalid operator name is found. - Otherwise, return NULL in that case. */ + Otherwise, return the empty string in that case. */ -static char * +static std::string ada_encode_1 (const char *decoded, bool throw_errors) { - static char *encoding_buffer = NULL; - static size_t encoding_buffer_size = 0; - const char *p; - int k; - if (decoded == NULL) - return NULL; - - GROW_VECT (encoding_buffer, encoding_buffer_size, - 2 * strlen (decoded) + 10); + return {}; - k = 0; - for (p = decoded; *p != '\0'; p += 1) + std::string encoding_buffer; + for (const char *p = decoded; *p != '\0'; p += 1) { if (*p == '.') - { - encoding_buffer[k] = encoding_buffer[k + 1] = '_'; - k += 2; - } + encoding_buffer.append ("__"); else if (*p == '"') { const struct ada_opname_map *mapping; @@ -958,27 +946,21 @@ ada_encode_1 (const char *decoded, bool throw_errors) if (throw_errors) error (_("invalid Ada operator name: %s"), p); else - return NULL; + return {}; } - strcpy (encoding_buffer + k, mapping->encoded); - k += strlen (mapping->encoded); + encoding_buffer.append (mapping->encoded); break; } else - { - encoding_buffer[k] = *p; - k += 1; - } + encoding_buffer.push_back (*p); } - encoding_buffer[k] = '\0'; return encoding_buffer; } -/* The "encoded" form of DECODED, according to GNAT conventions. - The result is valid until the next call to ada_encode. */ +/* The "encoded" form of DECODED, according to GNAT conventions. */ -char * +std::string ada_encode (const char *decoded) { return ada_encode_1 (decoded, true); @@ -6384,7 +6366,7 @@ type_from_tag (struct value *tag) gdb::unique_xmalloc_ptr type_name = ada_tag_name (tag); if (type_name != NULL) - return ada_find_any_type (ada_encode (type_name.get ())); + return ada_find_any_type (ada_encode (type_name.get ()).c_str ()); return NULL; } @@ -13613,10 +13595,8 @@ ada_lookup_name_info::ada_lookup_name_info (const lookup_name_info &lookup_name) if (!m_encoded_p) { const char *folded = ada_fold_name (user_name); - const char *encoded = ada_encode_1 (folded, false); - if (encoded != NULL) - m_encoded_name = encoded; - else + m_encoded_name = ada_encode_1 (folded, false); + if (m_encoded_name.empty ()) m_encoded_name = gdb::to_string (user_name); } else diff --git a/gdb/ada-lang.h b/gdb/ada-lang.h index ae313ce700a..93319267654 100644 --- a/gdb/ada-lang.h +++ b/gdb/ada-lang.h @@ -318,7 +318,7 @@ extern struct type *ada_get_base_type (struct type *); extern struct type *ada_check_typedef (struct type *); -extern char *ada_encode (const char *); +extern std::string ada_encode (const char *); extern const char *ada_enum_name (const char *); -- 2.30.2