From 81326ac076332230286e23d69978cc2698d004b9 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 19 Jan 2023 18:41:21 -0700 Subject: [PATCH] Combine both styles of block iterator This merges the two styles of block iterator, having the initialization API decide which to use based on an optional parameter. --- gdb/ada-lang.c | 4 ++-- gdb/block.c | 54 ++++++++++++++++++++------------------------------ gdb/block.h | 30 ++++++++-------------------- 3 files changed, 32 insertions(+), 56 deletions(-) diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 8b503b35ed5..0361730bda0 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -6079,9 +6079,9 @@ ada_add_block_symbols (std::vector &result, arg_sym = NULL; found_sym = false; - for (sym = block_iter_match_first (block, lookup_name, &iter); + for (sym = block_iterator_first (block, &iter, &lookup_name); sym != NULL; - sym = block_iter_match_next (&iter)) + sym = block_iterator_next (&iter)) { if (symbol_matches_domain (sym->language (), sym->domain (), domain)) { diff --git a/gdb/block.c b/gdb/block.c index e56c95013b8..e7a51af8cea 100644 --- a/gdb/block.c +++ b/gdb/block.c @@ -556,31 +556,6 @@ block_iterator_step (struct block_iterator *iterator, int first) } } -/* See block.h. */ - -struct symbol * -block_iterator_first (const struct block *block, - struct block_iterator *iterator) -{ - initialize_block_iterator (block, iterator); - - if (iterator->which == FIRST_LOCAL_BLOCK) - return mdict_iterator_first (block->multidict (), &iterator->mdict_iter); - - return block_iterator_step (iterator, 1); -} - -/* See block.h. */ - -struct symbol * -block_iterator_next (struct block_iterator *iterator) -{ - if (iterator->which == FIRST_LOCAL_BLOCK) - return mdict_iterator_next (&iterator->mdict_iter); - - return block_iterator_step (iterator, 0); -} - /* Perform a single step for a "match" block iterator, iterating across symbol tables as needed. Returns the next symbol, or NULL when iteration is complete. */ @@ -626,14 +601,23 @@ block_iter_match_step (struct block_iterator *iterator, /* See block.h. */ struct symbol * -block_iter_match_first (const struct block *block, - const lookup_name_info &name, - struct block_iterator *iterator) +block_iterator_first (const struct block *block, + struct block_iterator *iterator, + const lookup_name_info *name) { - initialize_block_iterator (block, iterator, &name); + initialize_block_iterator (block, iterator, name); + + if (name == nullptr) + { + if (iterator->which == FIRST_LOCAL_BLOCK) + return mdict_iterator_first (block->multidict (), + &iterator->mdict_iter); + + return block_iterator_step (iterator, 1); + } if (iterator->which == FIRST_LOCAL_BLOCK) - return mdict_iter_match_first (block->multidict (), name, + return mdict_iter_match_first (block->multidict (), *name, &iterator->mdict_iter); return block_iter_match_step (iterator, 1); @@ -642,9 +626,15 @@ block_iter_match_first (const struct block *block, /* See block.h. */ struct symbol * -block_iter_match_next (struct block_iterator *iterator) +block_iterator_next (struct block_iterator *iterator) { - gdb_assert (iterator->name != nullptr); + if (iterator->name == nullptr) + { + if (iterator->which == FIRST_LOCAL_BLOCK) + return mdict_iterator_next (&iterator->mdict_iter); + + return block_iterator_step (iterator, 0); + } if (iterator->which == FIRST_LOCAL_BLOCK) return mdict_iter_match_next (*iterator->name, &iterator->mdict_iter); diff --git a/gdb/block.h b/gdb/block.h index 5fc41c6df02..03aeebddc6b 100644 --- a/gdb/block.h +++ b/gdb/block.h @@ -471,10 +471,13 @@ struct block_iterator }; /* Initialize ITERATOR to point at the first symbol in BLOCK, and - return that first symbol, or NULL if BLOCK is empty. */ + return that first symbol, or NULL if BLOCK is empty. If NAME is + not NULL, only return symbols matching that name. */ -extern struct symbol *block_iterator_first (const struct block *block, - struct block_iterator *iterator); +extern struct symbol *block_iterator_first + (const struct block *block, + struct block_iterator *iterator, + const lookup_name_info *name = nullptr); /* Advance ITERATOR, and return the next symbol, or NULL if there are no more symbols. Don't call this if you've previously received @@ -483,23 +486,6 @@ extern struct symbol *block_iterator_first (const struct block *block, extern struct symbol *block_iterator_next (struct block_iterator *iterator); -/* Initialize ITERATOR to point at the first symbol in BLOCK whose - search_name () matches NAME, and return that first symbol, or - NULL if there are no such symbols. */ - -extern struct symbol *block_iter_match_first (const struct block *block, - const lookup_name_info &name, - struct block_iterator *iterator); - -/* Advance ITERATOR to point at the next symbol in BLOCK whose - search_name () matches NAME, or NULL if there are no more such - symbols. Don't call this if you've previously received NULL from - block_iterator_match_first or block_iterator_match_next on this - iteration. And don't call it unless ITERATOR was created by a - previous call to block_iter_match_first. */ - -extern struct symbol *block_iter_match_next (struct block_iterator *iterator); - /* Return true if symbol A is the best match possible for DOMAIN. */ extern bool best_symbol (struct symbol *a, const domain_enum domain); @@ -574,9 +560,9 @@ extern int block_find_non_opaque_type_preferred (struct symbol *sym, current symbol. */ #define ALL_BLOCK_SYMBOLS_WITH_NAME(block, name, iter, sym) \ - for ((sym) = block_iter_match_first ((block), (name), &(iter)); \ + for ((sym) = block_iterator_first ((block), &(iter), &(name)); \ (sym) != NULL; \ - (sym) = block_iter_match_next (&(iter))) + (sym) = block_iterator_next (&(iter))) /* Given a vector of pairs, allocate and build an obstack allocated blockranges struct for a block. */ -- 2.30.2