aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2023-01-19 18:41:21 -0700
committerTom Tromey <tom@tromey.com>2023-02-19 12:51:06 -0700
commit81326ac076332230286e23d69978cc2698d004b9 (patch)
treec3120542cfdd4f6d797ddc145930db077076635c /gdb
parent0688bf443c618be0a4a22cbc7ffb802dd771801c (diff)
downloadbinutils-81326ac076332230286e23d69978cc2698d004b9.zip
binutils-81326ac076332230286e23d69978cc2698d004b9.tar.gz
binutils-81326ac076332230286e23d69978cc2698d004b9.tar.bz2
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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ada-lang.c4
-rw-r--r--gdb/block.c54
-rw-r--r--gdb/block.h30
3 files changed, 32 insertions, 56 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 8b503b3..0361730 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -6079,9 +6079,9 @@ ada_add_block_symbols (std::vector<struct block_symbol> &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 e56c950..e7a51af 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 5fc41c6..03aeebd 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. */