Use gdb::function_view in iterate_over_symtabs & co
authorPedro Alves <palves@redhat.com>
Wed, 22 Feb 2017 14:43:35 +0000 (14:43 +0000)
committerPedro Alves <palves@redhat.com>
Thu, 23 Feb 2017 16:16:06 +0000 (16:16 +0000)
I wanted to pass a lambda to iterate_over_symtabs (see following
patch), so I converted it to function_view, and then the rest is
cascaded from that.

This gets rid of a bunch of single-use callback functions and
corresponding manually managed callback capture types
(add_partial_datum, search_symbols_data, etc.) in favor of letting the
compiler generate them for us by using lambdas with a capture.  In a
couple cases, it was more natural to convert the existing function
callbacks to function objects (i.e., operator(), e.g.,
decode_compound_collector).

gdb/ChangeLog:
2017-02-23  Pedro Alves  <palves@redhat.com>

* ada-lang.c: Include "common/function-view.h".
(ada_iterate_over_symbols): Adjust to use function_view as
callback type.
(struct add_partial_datum, ada_complete_symbol_matcher): Delete.
(ada_make_symbol_completion_list): Use a lambda.
(ada_exc_search_name_matches): Delete.
(name_matches_regex): New.
(ada_add_global_exceptions): Use a lambda and name_matches_regex.
* compile/compile-c-support.c: Include "common/function-view.h".
(print_one_macro): Change prototype to accept a ui_file pointer.
(write_macro_definitions): Use a lambda.
* dwarf2read.c: Include "common/function-view.h".
(dw2_map_expand_apply, dw2_map_symtabs_matching_filename)
(dw2_expand_symtabs_matching): Adjust to use function_view as
callback type.
* language.h: Include "common/function-view.h".
(struct language_defn) <la_iterate_over_symbols>: Adjust to use
function_view as callback type.
(LA_ITERATE_OVER_SYMBOLS): Remove DATA parameter.
* linespec.c: Include "common/function-view.h".
(collect_info::add_symbol): New method.
(struct symbol_and_data_callback, iterate_inline_only, struct
symbol_matcher_data, iterate_name_matcher): Delete.
(iterate_over_all_matching_symtabs): Adjust to use function_view
as callback type and lambdas.
(iterate_over_file_blocks): Adjust to use function_view as
callback type.
(decode_compound_collector): Now a class with private fields.
(decode_compound_collector::release_symbols): New method.
(collect_one_symbol): Rename to...
(decode_compound_collector::operator()): ... this and adjust.
(lookup_prefix_sym): decode_compound_collector construction bits
move to decode_compound_collector ctor.  Pass the
decode_compound_collector object directly as callback.  Remove
cleanups and use decode_compound_collector::release_symbols
instead.
(symtab_collector): Now a class with private fields.
(symtab_collector::release_symtabs): New method.
(add_symtabs_to_list): Rename to...
(symtab_collector::operator()): ... this and adjust.
(collect_symtabs_from_filename): symtab_collector construction
bits move to symtab_collector ctor.  Pass the symtab_collector
object directly as callback.  Remove cleanups and use
symtab_collector::release_symtabs instead.
(collect_symbols): Delete.
(add_matching_symbols_to_info): Use lambdas.
* macrocmd.c (print_macro_callback): Delete.
(info_macro_command): Use a lambda.
(info_macros_command): Pass print_macro_definition as callable
directly.
(print_one_macro): Remove 'ignore' parameter.
(macro_list_command): Adjust.
* macrotab.c (macro_for_each_data::fn): Now a function_view.
(macro_for_each_data::user_data): Delete field.
(foreach_macro): Adjust to call the function_view.
(macro_for_each): Adjust to use function_view as callback type.
(foreach_macro_in_scope): Adjust to call the function_view.
(macro_for_each_in_scope): Adjust to use function_view as callback
type.
* macrotab.h: Include "common/function-view.h".
(macro_callback_fn): Declare a prototype instead of a pointer.
Remove "user_data" parameter.
(macro_for_each, macro_for_each_in_scope): Adjust to use
function_view as callback type.
* psymtab.c (partial_map_expand_apply)
(psym_map_symtabs_matching_filename, recursively_search_psymtabs):
Adjust to use function_view as callback type and to return bool.
(psym_expand_symtabs_matching): Adjust to use function_view as
callback types.
* symfile-debug.c (debug_qf_map_symtabs_matching_filename): Adjust
to use function_view as callback type and to return bool.
(debug_qf_expand_symtabs_matching): Adjust to use function_view as
callback types.
* symfile.c (expand_symtabs_matching): Adjust to use function_view
as callback types.
* symfile.h: Include "common/function-view.h".
(expand_symtabs_file_matcher_ftype)
(expand_symtabs_symbol_matcher_ftype)
(expand_symtabs_exp_notify_ftype): Remove "data" parameter and
return bool.
(quick_symbol_functions::map_symtabs_matching_filename)
(quick_symbol_functions::expand_symtabs_matching): Adjust to use
function_view as callback type and return bool.
(expand_symtabs_matching): Adjust to use function_view as callback
type.
(maintenance_expand_name_matcher)
(maintenance_expand_file_matcher): Delete.
(maintenance_expand_symtabs): Use lambdas.
* symtab.c (iterate_over_some_symtabs): Adjust to use
function_view as callback types and return bool.
(iterate_over_symtabs): Likewise.  Use unique_xmalloc_ptr instead
of a cleanup.
(lookup_symtab_callback): Delete.
(lookup_symtab): Use a lambda.
(iterate_over_symbols): Adjust to use function_view as callback
type.
(struct search_symbols_data, search_symbols_file_matches)
(search_symbols_name_matches): Delete.
(search_symbols): Use a pair of lambdas.
(struct add_name_data, add_macro_name, symbol_completion_matcher)
(symtab_expansion_callback): Delete.
(default_make_symbol_completion_list_break_on_1): Use lambdas.
* symtab.h: Include "common/function-view.h".
(iterate_over_some_symtabs): Adjust to use function_view as
callback type and return bool.
(iterate_over_symtabs): Adjust to use function_view as callback
type.
(symbol_found_callback_ftype): Remove 'data' parameter and return
bool.
(iterate_over_symbols): Adjust to use function_view as callback
type.

16 files changed:
gdb/ChangeLog
gdb/ada-lang.c
gdb/compile/compile-c-support.c
gdb/dwarf2read.c
gdb/language.h
gdb/linespec.c
gdb/macrocmd.c
gdb/macrotab.c
gdb/macrotab.h
gdb/psymtab.c
gdb/symfile-debug.c
gdb/symfile.c
gdb/symfile.h
gdb/symmisc.c
gdb/symtab.c
gdb/symtab.h

index 77e7ef8abfd25e82515b7aa44c87e202be5678a5..f4d7087403792878641606f7ed7deac92a94ef2f 100644 (file)
@@ -1,3 +1,117 @@
+2017-02-23  Pedro Alves  <palves@redhat.com>
+
+       * ada-lang.c: Include "common/function-view.h".
+       (ada_iterate_over_symbols): Adjust to use function_view as
+       callback type.
+       (struct add_partial_datum, ada_complete_symbol_matcher): Delete.
+       (ada_make_symbol_completion_list): Use a lambda.
+       (ada_exc_search_name_matches): Delete.
+       (name_matches_regex): New.
+       (ada_add_global_exceptions): Use a lambda and name_matches_regex.
+       * compile/compile-c-support.c: Include "common/function-view.h".
+       (print_one_macro): Change prototype to accept a ui_file pointer.
+       (write_macro_definitions): Use a lambda.
+       * dwarf2read.c: Include "common/function-view.h".
+       (dw2_map_expand_apply, dw2_map_symtabs_matching_filename)
+       (dw2_expand_symtabs_matching): Adjust to use function_view as
+       callback type.
+       * language.h: Include "common/function-view.h".
+       (struct language_defn) <la_iterate_over_symbols>: Adjust to use
+       function_view as callback type.
+       (LA_ITERATE_OVER_SYMBOLS): Remove DATA parameter.
+       * linespec.c: Include "common/function-view.h".
+       (collect_info::add_symbol): New method.
+       (struct symbol_and_data_callback, iterate_inline_only, struct
+       symbol_matcher_data, iterate_name_matcher): Delete.
+       (iterate_over_all_matching_symtabs): Adjust to use function_view
+       as callback type and lambdas.
+       (iterate_over_file_blocks): Adjust to use function_view as
+       callback type.
+       (decode_compound_collector): Now a class with private fields.
+       (decode_compound_collector::release_symbols): New method.
+       (collect_one_symbol): Rename to...
+       (decode_compound_collector::operator()): ... this and adjust.
+       (lookup_prefix_sym): decode_compound_collector construction bits
+       move to decode_compound_collector ctor.  Pass the
+       decode_compound_collector object directly as callback.  Remove
+       cleanups and use decode_compound_collector::release_symbols
+       instead.
+       (symtab_collector): Now a class with private fields.
+       (symtab_collector::release_symtabs): New method.
+       (add_symtabs_to_list): Rename to...
+       (symtab_collector::operator()): ... this and adjust.
+       (collect_symtabs_from_filename): symtab_collector construction
+       bits move to symtab_collector ctor.  Pass the symtab_collector
+       object directly as callback.  Remove cleanups and use
+       symtab_collector::release_symtabs instead.
+       (collect_symbols): Delete.
+       (add_matching_symbols_to_info): Use lambdas.
+       * macrocmd.c (print_macro_callback): Delete.
+       (info_macro_command): Use a lambda.
+       (info_macros_command): Pass print_macro_definition as callable
+       directly.
+       (print_one_macro): Remove 'ignore' parameter.
+       (macro_list_command): Adjust.
+       * macrotab.c (macro_for_each_data::fn): Now a function_view.
+       (macro_for_each_data::user_data): Delete field.
+       (foreach_macro): Adjust to call the function_view.
+       (macro_for_each): Adjust to use function_view as callback type.
+       (foreach_macro_in_scope): Adjust to call the function_view.
+       (macro_for_each_in_scope): Adjust to use function_view as callback
+       type.
+       * macrotab.h: Include "common/function-view.h".
+       (macro_callback_fn): Declare a prototype instead of a pointer.
+       Remove "user_data" parameter.
+       (macro_for_each, macro_for_each_in_scope): Adjust to use
+       function_view as callback type.
+       * psymtab.c (partial_map_expand_apply)
+       (psym_map_symtabs_matching_filename, recursively_search_psymtabs):
+       Adjust to use function_view as callback type and to return bool.
+       (psym_expand_symtabs_matching): Adjust to use function_view as
+       callback types.
+       * symfile-debug.c (debug_qf_map_symtabs_matching_filename): Adjust
+       to use function_view as callback type and to return bool.
+       (debug_qf_expand_symtabs_matching): Adjust to use function_view as
+       callback types.
+       * symfile.c (expand_symtabs_matching): Adjust to use function_view
+       as callback types.
+       * symfile.h: Include "common/function-view.h".
+       (expand_symtabs_file_matcher_ftype)
+       (expand_symtabs_symbol_matcher_ftype)
+       (expand_symtabs_exp_notify_ftype): Remove "data" parameter and
+       return bool.
+       (quick_symbol_functions::map_symtabs_matching_filename)
+       (quick_symbol_functions::expand_symtabs_matching): Adjust to use
+       function_view as callback type and return bool.
+       (expand_symtabs_matching): Adjust to use function_view as callback
+       type.
+       (maintenance_expand_name_matcher)
+       (maintenance_expand_file_matcher): Delete.
+       (maintenance_expand_symtabs): Use lambdas.
+       * symtab.c (iterate_over_some_symtabs): Adjust to use
+       function_view as callback types and return bool.
+       (iterate_over_symtabs): Likewise.  Use unique_xmalloc_ptr instead
+       of a cleanup.
+       (lookup_symtab_callback): Delete.
+       (lookup_symtab): Use a lambda.
+       (iterate_over_symbols): Adjust to use function_view as callback
+       type.
+       (struct search_symbols_data, search_symbols_file_matches)
+       (search_symbols_name_matches): Delete.
+       (search_symbols): Use a pair of lambdas.
+       (struct add_name_data, add_macro_name, symbol_completion_matcher)
+       (symtab_expansion_callback): Delete.
+       (default_make_symbol_completion_list_break_on_1): Use lambdas.
+       * symtab.h: Include "common/function-view.h".
+       (iterate_over_some_symtabs): Adjust to use function_view as
+       callback type and return bool.
+       (iterate_over_symtabs): Adjust to use function_view as callback
+       type.
+       (symbol_found_callback_ftype): Remove 'data' parameter and return
+       bool.
+       (iterate_over_symbols): Adjust to use function_view as callback
+       type.
+
 2017-02-23  Pedro Alves  <palves@redhat.com>
 
        * Makefile.in (SUBDIR_UNITTESTS_SRCS, SUBDIR_UNITTESTS_OBS): New.
index 502710a462fdb80db3f613092d1a78273f5695c5..753409cdbf582cfdbc66233965bc8fbaac2cf663 100644 (file)
@@ -60,6 +60,7 @@
 #include "mi/mi-common.h"
 #include "arch-utils.h"
 #include "cli/cli-utils.h"
+#include "common/function-view.h"
 
 /* Define whether or not the C operator '/' truncates towards zero for
    differently signed operands (truncation direction is undefined in C).
@@ -5850,10 +5851,9 @@ ada_lookup_symbol_list (const char *name0, const struct block *block0,
 /* Implementation of the la_iterate_over_symbols method.  */
 
 static void
-ada_iterate_over_symbols (const struct block *block,
-                         const char *name, domain_enum domain,
-                         symbol_found_callback_ftype *callback,
-                         void *data)
+ada_iterate_over_symbols
+  (const struct block *block, const char *name, domain_enum domain,
+   gdb::function_view<symbol_found_callback_ftype> callback)
 {
   int ndefs, i;
   struct block_symbol *results;
@@ -5861,7 +5861,7 @@ ada_iterate_over_symbols (const struct block *block,
   ndefs = ada_lookup_symbol_list_worker (name, block, domain, &results, 0);
   for (i = 0; i < ndefs; ++i)
     {
-      if (! (*callback) (results[i].symbol, data))
+      if (!callback (results[i].symbol))
        break;
     }
 }
@@ -6497,30 +6497,6 @@ symbol_completion_add (VEC(char_ptr) **sv,
   VEC_safe_push (char_ptr, *sv, completion);
 }
 
-/* An object of this type is passed as the user_data argument to the
-   expand_symtabs_matching method.  */
-struct add_partial_datum
-{
-  VEC(char_ptr) **completions;
-  const char *text;
-  int text_len;
-  const char *text0;
-  const char *word;
-  int wild_match;
-  int encoded;
-};
-
-/* A callback for expand_symtabs_matching.  */
-
-static int
-ada_complete_symbol_matcher (const char *name, void *user_data)
-{
-  struct add_partial_datum *data = (struct add_partial_datum *) user_data;
-  
-  return symbol_completion_match (name, data->text, data->text_len,
-                                  data->wild_match, data->encoded) != NULL;
-}
-
 /* Return a list of possible symbol names completing TEXT0.  WORD is
    the entire command on which completion is made.  */
 
@@ -6569,19 +6545,16 @@ ada_make_symbol_completion_list (const char *text0, const char *word,
     }
 
   /* First, look at the partial symtab symbols.  */
-  {
-    struct add_partial_datum data;
-
-    data.completions = &completions;
-    data.text = text;
-    data.text_len = text_len;
-    data.text0 = text0;
-    data.word = word;
-    data.wild_match = wild_match_p;
-    data.encoded = encoded_p;
-    expand_symtabs_matching (NULL, ada_complete_symbol_matcher, NULL,
-                            ALL_DOMAIN, &data);
-  }
+  expand_symtabs_matching (NULL,
+                          [&] (const char *symname)
+                          {
+                            return symbol_completion_match (symname,
+                                                            text, text_len,
+                                                            wild_match_p,
+                                                            encoded_p);
+                          },
+                          NULL,
+                          ALL_DOMAIN);
 
   /* At this point scan through the misc symbol vectors and add each
      symbol you find to the list.  Eventually we want to ignore
@@ -13267,30 +13240,6 @@ sort_remove_dups_ada_exceptions_list (VEC(ada_exc_info) **exceptions,
   VEC_truncate(ada_exc_info, *exceptions, skip + to_sort_len);
 }
 
-/* A function intended as the "name_matcher" callback in the struct
-   quick_symbol_functions' expand_symtabs_matching method.
-
-   SEARCH_NAME is the symbol's search name.
-
-   If USER_DATA is not NULL, it is a pointer to a regext_t object
-   used to match the symbol (by natural name).  Otherwise, when USER_DATA
-   is null, no filtering is performed, and all symbols are a positive
-   match.  */
-
-static int
-ada_exc_search_name_matches (const char *search_name, void *user_data)
-{
-  regex_t *preg = (regex_t *) user_data;
-
-  if (preg == NULL)
-    return 1;
-
-  /* In Ada, the symbol "search name" is a linkage name, whereas
-     the regular expression used to do the matching refers to
-     the natural name.  So match against the decoded name.  */
-  return (regexec (preg, ada_decode (search_name), 0, NULL, 0) == 0);
-}
-
 /* Add all exceptions defined by the Ada standard whose name match
    a regular expression.
 
@@ -13370,6 +13319,15 @@ ada_add_exceptions_from_frame (regex_t *preg, struct frame_info *frame,
     }
 }
 
+/* Return true if NAME matches PREG or if PREG is NULL.  */
+
+static bool
+name_matches_regex (const char *name, regex_t *preg)
+{
+  return (preg == NULL
+         || regexec (preg, ada_decode (name), 0, NULL, 0) == 0);
+}
+
 /* Add all exceptions defined globally whose name name match
    a regular expression, excluding standard exceptions.
 
@@ -13395,8 +13353,17 @@ ada_add_global_exceptions (regex_t *preg, VEC(ada_exc_info) **exceptions)
   struct objfile *objfile;
   struct compunit_symtab *s;
 
-  expand_symtabs_matching (NULL, ada_exc_search_name_matches, NULL,
-                          VARIABLES_DOMAIN, preg);
+  /* In Ada, the symbol "search name" is a linkage name, whereas the
+     regular expression used to do the matching refers to the natural
+     name.  So match against the decoded name.  */
+  expand_symtabs_matching (NULL,
+                          [&] (const char *search_name)
+                          {
+                            const char *decoded = ada_decode (search_name);
+                            return name_matches_regex (decoded, preg);
+                          },
+                          NULL,
+                          VARIABLES_DOMAIN);
 
   ALL_COMPUNITS (objfile, s)
     {
@@ -13411,9 +13378,7 @@ ada_add_global_exceptions (regex_t *preg, VEC(ada_exc_info) **exceptions)
 
          ALL_BLOCK_SYMBOLS (b, iter, sym)
            if (ada_is_non_standard_exception_sym (sym)
-               && (preg == NULL
-                   || regexec (preg, SYMBOL_NATURAL_NAME (sym),
-                               0, NULL, 0) == 0))
+               && name_matches_regex (SYMBOL_NATURAL_NAME (sym), preg))
              {
                struct ada_exc_info info
                  = {SYMBOL_PRINT_NAME (sym), SYMBOL_VALUE_ADDRESS (sym)};
index 7ad0a872f23162430a6f26daa2a037a7b4e266cb..c969b423682ff253973bd0cf6cafb54f45bd41d1 100644 (file)
@@ -25,6 +25,7 @@
 #include "macrotab.h"
 #include "macroscope.h"
 #include "regcache.h"
+#include "common/function-view.h"
 
 /* See compile-internal.h.  */
 
@@ -122,10 +123,8 @@ c_get_compile_context (void)
 static void
 print_one_macro (const char *name, const struct macro_definition *macro,
                 struct macro_source_file *source, int line,
-                void *user_data)
+                ui_file *file)
 {
-  struct ui_file *file = (struct ui_file *) user_data;
-
   /* Don't print command-line defines.  They will be supplied another
      way.  */
   if (line == 0)
@@ -168,7 +167,16 @@ write_macro_definitions (const struct block *block, CORE_ADDR pc,
     scope = user_macro_scope ();
 
   if (scope != NULL && scope->file != NULL && scope->file->table != NULL)
-    macro_for_each_in_scope (scope->file, scope->line, print_one_macro, file);
+    {
+      macro_for_each_in_scope (scope->file, scope->line,
+                              [&] (const char *name,
+                                   const macro_definition *macro,
+                                   macro_source_file *source,
+                                   int line)
+       {
+         print_one_macro (name, macro, source, line, file);
+       });
+    }
 }
 
 /* Helper function to construct a header scope for a block of code.
index 9654fa535ef5dd6a74f782066c9de4c1318ab9f3..f1197509727c75e7e30253eb303f90555d814aa7 100644 (file)
@@ -70,6 +70,7 @@
 #include "build-id.h"
 #include "namespace.h"
 #include "common/gdb_unlinker.h"
+#include "common/function-view.h"
 
 #include <fcntl.h>
 #include <sys/types.h>
@@ -3490,8 +3491,7 @@ static int
 dw2_map_expand_apply (struct objfile *objfile,
                      struct dwarf2_per_cu_data *per_cu,
                      const char *name, const char *real_path,
-                     int (*callback) (struct symtab *, void *),
-                     void *data)
+                     gdb::function_view<bool (symtab *)> callback)
 {
   struct compunit_symtab *last_made = objfile->compunit_symtabs;
 
@@ -3503,17 +3503,16 @@ dw2_map_expand_apply (struct objfile *objfile,
      all of them.  */
   dw2_instantiate_symtab (per_cu);
 
-  return iterate_over_some_symtabs (name, real_path, callback, data,
-                                   objfile->compunit_symtabs, last_made);
+  return iterate_over_some_symtabs (name, real_path, objfile->compunit_symtabs,
+                                   last_made, callback);
 }
 
 /* Implementation of the map_symtabs_matching_filename method.  */
 
-static int
-dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
-                                  const char *real_path,
-                                  int (*callback) (struct symtab *, void *),
-                                  void *data)
+static bool
+dw2_map_symtabs_matching_filename
+  (struct objfile *objfile, const char *name, const char *real_path,
+   gdb::function_view<bool (symtab *)> callback)
 {
   int i;
   const char *name_basename = lbasename (name);
@@ -3545,8 +3544,8 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
          if (compare_filenames_for_search (this_name, name))
            {
              if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
-                                       callback, data))
-               return 1;
+                                       callback))
+               return true;
              continue;
            }
 
@@ -3560,8 +3559,8 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
          if (compare_filenames_for_search (this_real_name, name))
            {
              if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
-                                       callback, data))
-               return 1;
+                                       callback))
+               return true;
              continue;
            }
 
@@ -3573,15 +3572,15 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
                  && FILENAME_CMP (real_path, this_real_name) == 0)
                {
                  if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
-                                           callback, data))
-                   return 1;
+                                           callback))
+                   return true;
                  continue;
                }
            }
        }
     }
 
-  return 0;
+  return false;
 }
 
 /* Struct used to manage iterating over all CUs looking for a symbol.  */
@@ -3919,11 +3918,10 @@ dw2_map_matching_symbols (struct objfile *objfile,
 static void
 dw2_expand_symtabs_matching
   (struct objfile *objfile,
-   expand_symtabs_file_matcher_ftype *file_matcher,
-   expand_symtabs_symbol_matcher_ftype *symbol_matcher,
-   expand_symtabs_exp_notify_ftype *expansion_notify,
-   enum search_domain kind,
-   void *data)
+   gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
+   gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
+   gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
+   enum search_domain kind)
 {
   int i;
   offset_type iter;
@@ -3979,7 +3977,7 @@ dw2_expand_symtabs_matching
            {
              const char *this_real_name;
 
-             if (file_matcher (file_data->file_names[j], data, 0))
+             if (file_matcher (file_data->file_names[j], false))
                {
                  per_cu->v.quick->mark = 1;
                  break;
@@ -3989,11 +3987,11 @@ dw2_expand_symtabs_matching
                 files are involved, do a quick comparison of the basenames.  */
              if (!basenames_may_differ
                  && !file_matcher (lbasename (file_data->file_names[j]),
-                                   data, 1))
+                                   true))
                continue;
 
              this_real_name = dw2_get_real_path (objfile, file_data, j);
-             if (file_matcher (this_real_name, data, 0))
+             if (file_matcher (this_real_name, false))
                {
                  per_cu->v.quick->mark = 1;
                  break;
@@ -4022,7 +4020,7 @@ dw2_expand_symtabs_matching
 
       name = index->constant_pool + MAYBE_SWAP (index->symbol_table[idx]);
 
-      if (! (*symbol_matcher) (name, data))
+      if (!symbol_matcher (name))
        continue;
 
       /* The name was matched, now expand corresponding CUs that were
@@ -4100,8 +4098,7 @@ dw2_expand_symtabs_matching
                  && symtab_was_null
                  && per_cu->v.quick->compunit_symtab != NULL)
                {
-                 expansion_notify (per_cu->v.quick->compunit_symtab,
-                                   data);
+                 expansion_notify (per_cu->v.quick->compunit_symtab);
                }
            }
        }
index b808c9e91af933cd12e70f26261ee6dd4c18ceb5..3d21e4e388070d207c904ce1ea41b19f03994cba 100644 (file)
@@ -24,6 +24,7 @@
 #define LANGUAGE_H 1
 
 #include "symtab.h"
+#include "common/function-view.h"
 
 /* Forward decls for prototypes.  */
 struct value;
@@ -372,18 +373,15 @@ struct language_defn
        The caller is responsible for iterating up through superblocks
        if desired.
 
-       For each one, call CALLBACK with the symbol and the DATA
-       argument.  If CALLBACK returns zero, the iteration ends at that
-       point.
+       For each one, call CALLBACK with the symbol.  If CALLBACK
+       returns false, the iteration ends at that point.
 
        This field may not be NULL.  If the language does not need any
        special processing here, 'iterate_over_symbols' should be
        used as the definition.  */
-    void (*la_iterate_over_symbols) (const struct block *block,
-                                    const char *name,
-                                    domain_enum domain,
-                                    symbol_found_callback_ftype *callback,
-                                    void *data);
+    void (*la_iterate_over_symbols)
+      (const struct block *block, const char *name, domain_enum domain,
+       gdb::function_view<symbol_found_callback_ftype> callback);
 
     /* Various operations on varobj.  */
     const struct lang_varobj_ops *la_varobj_ops;
@@ -527,9 +525,8 @@ extern enum language set_language (enum language);
 #define LA_PRINT_ARRAY_INDEX(index_value, stream, options) \
   (current_language->la_print_array_index(index_value, stream, options))
 
-#define LA_ITERATE_OVER_SYMBOLS(BLOCK, NAME, DOMAIN, CALLBACK, DATA) \
-  (current_language->la_iterate_over_symbols (BLOCK, NAME, DOMAIN, CALLBACK, \
-                                             DATA))
+#define LA_ITERATE_OVER_SYMBOLS(BLOCK, NAME, DOMAIN, CALLBACK) \
+  (current_language->la_iterate_over_symbols (BLOCK, NAME, DOMAIN, CALLBACK))
 
 /* Test a character to decide whether it can be printed in literal form
    or needs to be printed in another representation.  For example,
index 630802690de5983dc82c700f1eaa486c1c146d95..72bcd604ff7dea86737025c751088b257e7be887 100644 (file)
@@ -44,6 +44,7 @@
 #include "ada-lang.h"
 #include "stack.h"
 #include "location.h"
+#include "common/function-view.h"
 
 typedef struct symbol *symbolp;
 DEF_VEC_P (symbolp);
@@ -171,8 +172,23 @@ struct collect_info
     VEC (symbolp) *symbols;
     VEC (bound_minimal_symbol_d) *minimal_symbols;
   } result;
+
+  /* Possibly add a symbol to the results.  */
+  bool add_symbol (symbol *sym);
 };
 
+bool
+collect_info::add_symbol (symbol *sym)
+{
+  /* In list mode, add all matching symbols, regardless of class.
+     This allows the user to type "list a_global_variable".  */
+  if (SYMBOL_CLASS (sym) == LOC_BLOCK || this->state->list_mode)
+    VEC_safe_push (symbolp, this->result.symbols, sym);
+
+  /* Continue iterating.  */
+  return true;
+}
+
 /* Token types  */
 
 enum ls_token_type
@@ -264,10 +280,9 @@ typedef struct ls_parser linespec_parser;
 
 /* Prototypes for local functions.  */
 
-static void iterate_over_file_blocks (struct symtab *symtab,
-                                     const char *name, domain_enum domain,
-                                     symbol_found_callback_ftype *callback,
-                                     void *data);
+static void iterate_over_file_blocks
+  (struct symtab *symtab, const char *name, domain_enum domain,
+   gdb::function_view<symbol_found_callback_ftype> callback);
 
 static void initialize_defaults (struct symtab **default_symtab,
                                 int *default_line);
@@ -916,83 +931,26 @@ maybe_add_address (htab_t set, struct program_space *pspace, CORE_ADDR addr)
   return 1;
 }
 
-/* A callback function and the additional data to call it with.  */
-
-struct symbol_and_data_callback
-{
-  /* The callback to use.  */
-  symbol_found_callback_ftype *callback;
-
-  /* Data to be passed to the callback.  */
-  void *data;
-};
-
-/* A helper for iterate_over_all_matching_symtabs that is used to
-   restrict calls to another callback to symbols representing inline
-   symbols only.  */
-
-static int
-iterate_inline_only (struct symbol *sym, void *d)
-{
-  if (SYMBOL_INLINED (sym))
-    {
-      struct symbol_and_data_callback *cad
-       = (struct symbol_and_data_callback *) d;
-
-      return cad->callback (sym, cad->data);
-    }
-  return 1; /* Continue iterating.  */
-}
-
-/* Some data for the expand_symtabs_matching callback.  */
-
-struct symbol_matcher_data
-{
-  /* The lookup name against which symbol name should be compared.  */
-  const char *lookup_name;
-
-  /* The routine to be used for comparison.  */
-  symbol_name_cmp_ftype symbol_name_cmp;
-};
-
-/* A helper for iterate_over_all_matching_symtabs that is passed as a
-   callback to the expand_symtabs_matching method.  */
-
-static int
-iterate_name_matcher (const char *name, void *d)
-{
-  const struct symbol_matcher_data *data
-    = (const struct symbol_matcher_data *) d;
-
-  if (data->symbol_name_cmp (name, data->lookup_name) == 0)
-    return 1; /* Expand this symbol's symbol table.  */
-  return 0; /* Skip this symbol.  */
-}
-
 /* A helper that walks over all matching symtabs in all objfiles and
    calls CALLBACK for each symbol matching NAME.  If SEARCH_PSPACE is
    not NULL, then the search is restricted to just that program
-   space.  If INCLUDE_INLINE is nonzero then symbols representing
+   space.  If INCLUDE_INLINE is true then symbols representing
    inlined instances of functions will be included in the result.  */
 
 static void
-iterate_over_all_matching_symtabs (struct linespec_state *state,
-                                  const char *name,
-                                  const domain_enum domain,
-                                  symbol_found_callback_ftype *callback,
-                                  void *data,
-                                  struct program_space *search_pspace,
-                                  int include_inline)
+iterate_over_all_matching_symtabs
+  (struct linespec_state *state, const char *name, const domain_enum domain,
+   struct program_space *search_pspace, bool include_inline,
+   gdb::function_view<symbol_found_callback_ftype> callback)
 {
   struct objfile *objfile;
   struct program_space *pspace;
-  struct symbol_matcher_data matcher_data;
 
-  matcher_data.lookup_name = name;
-  matcher_data.symbol_name_cmp =
-    state->language->la_get_symbol_name_cmp != NULL
-    ? state->language->la_get_symbol_name_cmp (name)
-    : strcmp_iw;
+  /* The routine to be used for comparison.  */
+  symbol_name_cmp_ftype symbol_name_cmp
+    = (state->language->la_get_symbol_name_cmp != NULL
+       ? state->language->la_get_symbol_name_cmp (name)
+       : strcmp_iw);
 
   ALL_PSPACES (pspace)
   {
@@ -1008,20 +966,24 @@ iterate_over_all_matching_symtabs (struct linespec_state *state,
       struct compunit_symtab *cu;
 
       if (objfile->sf)
-       objfile->sf->qf->expand_symtabs_matching (objfile, NULL,
-                                                 iterate_name_matcher,
-                                                 NULL, ALL_DOMAIN,
-                                                 &matcher_data);
+       objfile->sf->qf->expand_symtabs_matching
+         (objfile,
+          NULL,
+          [&] (const char *symbol_name)
+          {
+            return symbol_name_cmp (symbol_name, name) == 0;
+          },
+          NULL,
+          ALL_DOMAIN);
 
       ALL_OBJFILE_COMPUNITS (objfile, cu)
        {
          struct symtab *symtab = COMPUNIT_FILETABS (cu);
 
-         iterate_over_file_blocks (symtab, name, domain, callback, data);
+         iterate_over_file_blocks (symtab, name, domain, callback);
 
          if (include_inline)
            {
-             struct symbol_and_data_callback cad = { callback, data };
              struct block *block;
              int i;
 
@@ -1031,7 +993,14 @@ iterate_over_all_matching_symtabs (struct linespec_state *state,
                {
                  block = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (symtab), i);
                  state->language->la_iterate_over_symbols
-                   (block, name, domain, iterate_inline_only, &cad);
+                   (block, name, domain, [&] (symbol *sym)
+                    {
+                      /* Restrict calls to CALLBACK to symbols
+                         representing inline symbols only.  */
+                      if (SYMBOL_INLINED (sym))
+                        return callback (sym);
+                      return true;
+                    });
                }
            }
        }
@@ -1060,16 +1029,16 @@ get_current_search_block (void)
 /* Iterate over static and global blocks.  */
 
 static void
-iterate_over_file_blocks (struct symtab *symtab,
-                         const char *name, domain_enum domain,
-                         symbol_found_callback_ftype *callback, void *data)
+iterate_over_file_blocks
+  (struct symtab *symtab, const char *name, domain_enum domain,
+   gdb::function_view<symbol_found_callback_ftype> callback)
 {
   struct block *block;
 
   for (block = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (symtab), STATIC_BLOCK);
        block != NULL;
        block = BLOCK_SUPERBLOCK (block))
-    LA_ITERATE_OVER_SYMBOLS (block, name, domain, callback, data);
+    LA_ITERATE_OVER_SYMBOLS (block, name, domain, callback);
 }
 
 /* A helper for find_method.  This finds all methods in type T which
@@ -2824,60 +2793,70 @@ decode_objc (struct linespec_state *self, linespec_p ls, const char *arg)
   return values;
 }
 
-/* An instance of this type is used when collecting prefix symbols for
-   decode_compound.  */
-
-struct decode_compound_collector
+/* A function object that serves as symbol_found_callback_ftype
+   callback for iterate_over_symbols.  This is used by
+   lookup_prefix_sym to collect type symbols.  */
+class decode_compound_collector
 {
-  /* The result vector.  */
-  VEC (symbolp) *symbols;
-
-  /* A hash table of all symbols we found.  We use this to avoid
-     adding any symbol more than once.  */
-  htab_t unique_syms;
-
+public:
   decode_compound_collector ()
-  : symbols (NULL),
-    unique_syms (NULL)
+    : m_symbols (NULL)
   {
+    m_unique_syms = htab_create_alloc (1, htab_hash_pointer,
+                                      htab_eq_pointer, NULL,
+                                      xcalloc, xfree);
   }
 
   ~decode_compound_collector ()
   {
-    if (unique_syms != NULL)
-      htab_delete (unique_syms);
+    if (m_unique_syms != NULL)
+      htab_delete (m_unique_syms);
   }
-};
 
-/* A callback for iterate_over_symbols that is used by
-   lookup_prefix_sym to collect type symbols.  */
+  /* Releases ownership of the collected symbols and returns them.  */
+  VEC (symbolp) *release_symbols ()
+  {
+    VEC (symbolp) *res = m_symbols;
+    m_symbols = NULL;
+    return res;
+  }
 
-static int
-collect_one_symbol (struct symbol *sym, void *d)
+  /* Callable as a symbol_found_callback_ftype callback.  */
+  bool operator () (symbol *sym);
+
+private:
+  /* A hash table of all symbols we found.  We use this to avoid
+     adding any symbol more than once.  */
+  htab_t m_unique_syms;
+
+  /* The result vector.  */
+  VEC (symbolp) *m_symbols;
+};
+
+bool
+decode_compound_collector::operator () (symbol *sym)
 {
-  struct decode_compound_collector *collector
-    = (struct decode_compound_collector *) d;
   void **slot;
   struct type *t;
 
   if (SYMBOL_CLASS (sym) != LOC_TYPEDEF)
-    return 1; /* Continue iterating.  */
+    return true; /* Continue iterating.  */
 
   t = SYMBOL_TYPE (sym);
   t = check_typedef (t);
   if (TYPE_CODE (t) != TYPE_CODE_STRUCT
       && TYPE_CODE (t) != TYPE_CODE_UNION
       && TYPE_CODE (t) != TYPE_CODE_NAMESPACE)
-    return 1; /* Continue iterating.  */
+    return true; /* Continue iterating.  */
 
-  slot = htab_find_slot (collector->unique_syms, sym, INSERT);
+  slot = htab_find_slot (m_unique_syms, sym, INSERT);
   if (!*slot)
     {
       *slot = sym;
-      VEC_safe_push (symbolp, collector->symbols, sym);
+      VEC_safe_push (symbolp, m_symbols, sym);
     }
 
-  return 1; /* Continue iterating.  */
+  return true; /* Continue iterating.  */
 }
 
 /* Return any symbols corresponding to CLASS_NAME in FILE_SYMTABS.  */
@@ -2888,27 +2867,16 @@ lookup_prefix_sym (struct linespec_state *state, VEC (symtab_ptr) *file_symtabs,
 {
   int ix;
   struct symtab *elt;
-  struct decode_compound_collector collector;
-  struct cleanup *outer;
-  struct cleanup *cleanup;
-
-  collector.symbols = NULL;
-  outer = make_cleanup (VEC_cleanup (symbolp), &collector.symbols);
-
-  collector.unique_syms = htab_create_alloc (1, htab_hash_pointer,
-                                            htab_eq_pointer, NULL,
-                                            xcalloc, xfree);
+  decode_compound_collector collector;
 
   for (ix = 0; VEC_iterate (symtab_ptr, file_symtabs, ix, elt); ++ix)
     {
       if (elt == NULL)
        {
          iterate_over_all_matching_symtabs (state, class_name, STRUCT_DOMAIN,
-                                            collect_one_symbol, &collector,
-                                            NULL, 0);
+                                            NULL, false, collector);
          iterate_over_all_matching_symtabs (state, class_name, VAR_DOMAIN,
-                                            collect_one_symbol, &collector,
-                                            NULL, 0);
+                                            NULL, false, collector);
        }
       else
        {
@@ -2916,15 +2884,12 @@ lookup_prefix_sym (struct linespec_state *state, VEC (symtab_ptr) *file_symtabs,
             been filtered out earlier.  */
          gdb_assert (!SYMTAB_PSPACE (elt)->executing_startup);
          set_current_program_space (SYMTAB_PSPACE (elt));
-         iterate_over_file_blocks (elt, class_name, STRUCT_DOMAIN,
-                                   collect_one_symbol, &collector);
-         iterate_over_file_blocks (elt, class_name, VAR_DOMAIN,
-                                   collect_one_symbol, &collector);
+         iterate_over_file_blocks (elt, class_name, STRUCT_DOMAIN, collector);
+         iterate_over_file_blocks (elt, class_name, VAR_DOMAIN, collector);
        }
     }
 
-  discard_cleanups (outer);
-  return collector.symbols;
+  return collector.release_symbols ();
 }
 
 /* A qsort comparison function for symbols.  The resulting order does
@@ -3130,45 +3095,57 @@ find_method (struct linespec_state *self, VEC (symtab_ptr) *file_symtabs,
 
 \f
 
-/* This object is used when collecting all matching symtabs.  */
+/* This function object is a callback for iterate_over_symtabs, used
+   when collecting all matching symtabs.  */
 
-struct symtab_collector
+class symtab_collector
 {
-  /* The result vector of symtabs.  */
-  VEC (symtab_ptr) *symtabs;
-
-  /* This is used to ensure the symtabs are unique.  */
-  htab_t symtab_table;
-
+public:
   symtab_collector ()
-  : symtabs (NULL),
-    symtab_table (NULL)
   {
+    m_symtabs = NULL;
+    m_symtab_table = htab_create (1, htab_hash_pointer, htab_eq_pointer,
+                                 NULL);
   }
 
   ~symtab_collector ()
   {
-    if (symtab_table != NULL)
-      htab_delete (symtab_table);
+    if (m_symtab_table != NULL)
+      htab_delete (m_symtab_table);
   }
-};
 
-/* Callback for iterate_over_symtabs.  */
+  /* Callable as a symbol_found_callback_ftype callback.  */
+  bool operator () (symtab *sym);
 
-static int
-add_symtabs_to_list (struct symtab *symtab, void *d)
+  /* Releases ownership of the collected symtabs and returns them.  */
+  VEC (symtab_ptr) *release_symtabs ()
+  {
+    VEC (symtab_ptr) *res = m_symtabs;
+    m_symtabs = NULL;
+    return res;
+  }
+
+private:
+  /* The result vector of symtabs.  */
+  VEC (symtab_ptr) *m_symtabs;
+
+  /* This is used to ensure the symtabs are unique.  */
+  htab_t m_symtab_table;
+};
+
+bool
+symtab_collector::operator () (struct symtab *symtab)
 {
-  struct symtab_collector *data = (struct symtab_collector *) d;
   void **slot;
 
-  slot = htab_find_slot (data->symtab_table, symtab, INSERT);
+  slot = htab_find_slot (m_symtab_table, symtab, INSERT);
   if (!*slot)
     {
       *slot = symtab;
-      VEC_safe_push (symtab_ptr, data->symtabs, symtab);
+      VEC_safe_push (symtab_ptr, m_symtabs, symtab);
     }
 
-  return 0;
+  return false;
 }
 
 /* Given a file name, return a VEC of all matching symtabs.  If
@@ -3179,33 +3156,29 @@ static VEC (symtab_ptr) *
 collect_symtabs_from_filename (const char *file,
                               struct program_space *search_pspace)
 {
-  struct symtab_collector collector;
-  struct cleanup *cleanups;
-  struct program_space *pspace;
-
-  collector.symtabs = NULL;
-  collector.symtab_table = htab_create (1, htab_hash_pointer, htab_eq_pointer,
-                                       NULL);
+  symtab_collector collector;
 
   /* Find that file's data.  */
   if (search_pspace == NULL)
     {
+      struct program_space *pspace;
+
       ALL_PSPACES (pspace)
         {
          if (pspace->executing_startup)
            continue;
 
          set_current_program_space (pspace);
-         iterate_over_symtabs (file, add_symtabs_to_list, &collector);
+         iterate_over_symtabs (file, collector);
        }
     }
   else
     {
       set_current_program_space (search_pspace);
-      iterate_over_symtabs (file, add_symtabs_to_list, &collector);
+      iterate_over_symtabs (file, collector);
     }
 
-  return collector.symtabs;
+  return collector.release_symtabs ();
 }
 
 /* Return all the symtabs associated to the FILENAME.  If SEARCH_PSPACE is
@@ -3577,20 +3550,6 @@ linespec_parse_variable (struct linespec_state *self, const char *variable)
 }
 \f
 
-/* A callback used to possibly add a symbol to the results.  */
-
-static int
-collect_symbols (struct symbol *sym, void *data)
-{
-  struct collect_info *info = (struct collect_info *) data;
-
-  /* In list mode, add all matching symbols, regardless of class.
-     This allows the user to type "list a_global_variable".  */
-  if (SYMBOL_CLASS (sym) == LOC_BLOCK || info->state->list_mode)
-    VEC_safe_push (symbolp, info->result.symbols, sym);
-  return 1; /* Continue iterating.  */
-}
-
 /* We've found a minimal symbol MSYMBOL in OBJFILE to associate with our
    linespec; return the SAL in RESULT.  This function should return SALs
    matching those from find_function_start_sal, otherwise false
@@ -3858,8 +3817,8 @@ add_matching_symbols_to_info (const char *name,
       if (elt == NULL)
        {
          iterate_over_all_matching_symtabs (info->state, name, VAR_DOMAIN,
-                                            collect_symbols, info,
-                                            pspace, 1);
+                                            pspace, true, [&] (symbol *sym)
+           { return info->add_symbol (sym); });
          search_minsyms_for_name (info, name, pspace, NULL);
        }
       else if (pspace == NULL || pspace == SYMTAB_PSPACE (elt))
@@ -3870,8 +3829,8 @@ add_matching_symbols_to_info (const char *name,
             been filtered out earlier.  */
          gdb_assert (!SYMTAB_PSPACE (elt)->executing_startup);
          set_current_program_space (SYMTAB_PSPACE (elt));
-         iterate_over_file_blocks (elt, name, VAR_DOMAIN,
-                                   collect_symbols, info);
+         iterate_over_file_blocks (elt, name, VAR_DOMAIN, [&] (symbol *sym)
+           { return info->add_symbol (sym); });
 
          /* If no new symbols were found in this iteration and this symtab
             is in assembler, we might actually be looking for a label for
index 69668a297a97f5344893170a75f1425144b5627b..c390d636cf4047cae23573f3331dadc434ab80ae 100644 (file)
@@ -186,20 +186,6 @@ print_macro_definition (const char *name,
     fprintf_filtered (gdb_stdout, "=%s\n", d->replacement);
 }
 
-/* A callback function for usage with macro_for_each and friends.
-   If USER_DATA is null all macros will be printed.
-   Otherwise USER_DATA is considered to be a string, printing
-   only macros who's NAME matches USER_DATA.  Other arguments are
-   routed to print_macro_definition.  */
-static void
-print_macro_callback (const char *name, const struct macro_definition *macro,
-                  struct macro_source_file *source, int line,
-                  void *user_data)
-{
-  if (! user_data || strcmp ((const char *) user_data, name) == 0)
-    print_macro_definition (name, macro, source, line);
-}
-
 /* The implementation of the `info macro' command.  */
 static void
 info_macro_command (char *args, int from_tty)
@@ -248,7 +234,14 @@ info_macro_command (char *args, int from_tty)
   if (! ms)
     macro_inform_no_debuginfo ();
   else if (show_all_macros_named)
-    macro_for_each (ms->file->table, print_macro_callback, name);
+    macro_for_each (ms->file->table, [&] (const char *macro_name,
+                                         const macro_definition *macro,
+                                         macro_source_file *source,
+                                         int line)
+      {
+       if (strcmp (name, macro_name) == 0)
+         print_macro_definition (name, macro, source, line);
+      });
   else
     {
       struct macro_definition *d;
@@ -296,7 +289,7 @@ info_macros_command (char *args, int from_tty)
   if (! ms || ! ms->file || ! ms->file->table)
     macro_inform_no_debuginfo ();
   else
-    macro_for_each_in_scope (ms->file, ms->line, print_macro_callback, NULL);
+    macro_for_each_in_scope (ms->file, ms->line, print_macro_definition);
 
   do_cleanups (cleanup_chain);
 }
@@ -465,8 +458,7 @@ macro_undef_command (char *exp, int from_tty)
 
 static void
 print_one_macro (const char *name, const struct macro_definition *macro,
-                struct macro_source_file *source, int line,
-                void *ignore)
+                struct macro_source_file *source, int line)
 {
   fprintf_filtered (gdb_stdout, "macro define %s", name);
   if (macro->kind == macro_function_like)
@@ -486,7 +478,7 @@ print_one_macro (const char *name, const struct macro_definition *macro,
 static void
 macro_list_command (char *exp, int from_tty)
 {
-  macro_for_each (macro_user_macros, print_one_macro, NULL);
+  macro_for_each (macro_user_macros, print_one_macro);
 }
 
 \f
index 6b3ab6ba37b3f3faa9136ecf9ae1de79b67585d7..1b85c8c37c6f7226be5c993189bc7b245b820fb7 100644 (file)
@@ -965,8 +965,7 @@ macro_definition_location (struct macro_source_file *source,
    the FILE and LINE fields.  */
 struct macro_for_each_data
 {
-  macro_callback_fn fn;
-  void *user_data;
+  gdb::function_view<macro_callback_fn> fn;
   struct macro_source_file *file;
   int line;
 };
@@ -985,20 +984,18 @@ foreach_macro (splay_tree_node node, void *arg)
                          (struct macro_definition *) node->value);
   xfree (key_fullname);
 
-  (*datum->fn) (key->name, def, key->start_file, key->start_line,
-               datum->user_data);
+  datum->fn (key->name, def, key->start_file, key->start_line);
   return 0;
 }
 
 /* Call FN for every macro in TABLE.  */
 void
-macro_for_each (struct macro_table *table, macro_callback_fn fn,
-               void *user_data)
+macro_for_each (struct macro_table *table,
+               gdb::function_view<macro_callback_fn> fn)
 {
   struct macro_for_each_data datum;
 
   datum.fn = fn;
-  datum.user_data = user_data;
   datum.file = NULL;
   datum.line = 0;
   splay_tree_foreach (table->definitions, foreach_macro, &datum);
@@ -1024,20 +1021,18 @@ foreach_macro_in_scope (splay_tree_node node, void *info)
       && (!key->end_file
          || compare_locations (key->end_file, key->end_line,
                                datum->file, datum->line) >= 0))
-    (*datum->fn) (key->name, def, key->start_file, key->start_line,
-                 datum->user_data);
+    datum->fn (key->name, def, key->start_file, key->start_line);
   return 0;
 }
 
 /* Call FN for every macro is visible in SCOPE.  */
 void
 macro_for_each_in_scope (struct macro_source_file *file, int line,
-                        macro_callback_fn fn, void *user_data)
+                        gdb::function_view<macro_callback_fn> fn)
 {
   struct macro_for_each_data datum;
 
   datum.fn = fn;
-  datum.user_data = user_data;
   datum.file = file;
   datum.line = line;
   splay_tree_foreach (file->table->definitions,
index 0d06dde2f00ef06dba3b498db53ac74980d65b8e..16e959a1dd8222b4761309a84fcbdece5e92badd 100644 (file)
@@ -20,6 +20,8 @@
 #ifndef MACROTAB_H
 #define MACROTAB_H
 
+#include "common/function-view.h"
+
 struct obstack;
 struct bcache;
 struct compunit_symtab;
@@ -329,28 +331,23 @@ struct macro_source_file *(macro_definition_location
                             const char *name,
                             int *definition_line));
 
-/* Callback function when walking a macro table.  NAME is the name of
-   the macro, and DEFINITION is the definition.  SOURCE is the file at the
-   start of the include path, and LINE is the line number of the SOURCE file
-   where the macro was defined.  USER_DATA is an arbitrary pointer which is
-   passed by the caller to macro_for_each or macro_for_each_in_scope.  */
-typedef void (*macro_callback_fn) (const char *name,
-                                  const struct macro_definition *definition,
-                                  struct macro_source_file *source,
-                                  int line,
-                                  void *user_data);
-
-/* Call the function FN for each macro in the macro table TABLE.
-   USER_DATA is passed, untranslated, to FN.  */
-void macro_for_each (struct macro_table *table, macro_callback_fn fn,
-                    void *user_data);
-
-/* Call the function FN for each macro that is visible in a given
-   scope.  The scope is represented by FILE and LINE.  USER_DATA is
-   passed, untranslated, to FN.  */
+/* Prototype for a callback callable when walking a macro table.  NAME
+   is the name of the macro, and DEFINITION is the definition.  SOURCE
+   is the file at the start of the include path, and LINE is the line
+   number of the SOURCE file where the macro was defined.  */
+typedef void (macro_callback_fn) (const char *name,
+                                 const struct macro_definition *definition,
+                                 struct macro_source_file *source,
+                                 int line);
+
+/* Call the callable FN for each macro in the macro table TABLE.  */
+void macro_for_each (struct macro_table *table,
+                    gdb::function_view<macro_callback_fn> fn);
+
+/* Call FN for each macro that is visible in a given scope.  The scope
+   is represented by FILE and LINE.  */
 void macro_for_each_in_scope (struct macro_source_file *file, int line,
-                             macro_callback_fn fn,
-                             void *user_data);
+                             gdb::function_view<macro_callback_fn> fn);
 
 /* Return FILE->filename with possibly prepended compilation directory name.
    This is raw concatenation without the "set substitute-path" and gdb_realpath
index 6e42bc5ad58d6f15b8e72fc2b16096deb2e5612b..d98a4af0d97ff807055f4374a3d3fac119da27d7 100644 (file)
@@ -123,13 +123,12 @@ require_partial_symbols (struct objfile *objfile, int verbose)
 /* Helper function for psym_map_symtabs_matching_filename that
    expands the symtabs and calls the iterator.  */
 
-static int
+static bool
 partial_map_expand_apply (struct objfile *objfile,
                          const char *name,
                          const char *real_path,
                          struct partial_symtab *pst,
-                         int (*callback) (struct symtab *, void *),
-                         void *data)
+                         gdb::function_view<bool (symtab *)> callback)
 {
   struct compunit_symtab *last_made = objfile->compunit_symtabs;
 
@@ -145,20 +144,19 @@ partial_map_expand_apply (struct objfile *objfile,
      all of them.  */
   psymtab_to_symtab (objfile, pst);
 
-  return iterate_over_some_symtabs (name, real_path, callback, data,
-                                   objfile->compunit_symtabs, last_made);
+  return iterate_over_some_symtabs (name, real_path, objfile->compunit_symtabs,
+                                   last_made, callback);
 }
 
 /*  Psymtab version of map_symtabs_matching_filename.  See its definition in
     the definition of quick_symbol_functions in symfile.h.  */
 
-static int
-psym_map_symtabs_matching_filename (struct objfile *objfile,
-                                   const char *name,
-                                   const char *real_path,
-                                   int (*callback) (struct symtab *,
-                                                    void *),
-                                   void *data)
+static bool
+psym_map_symtabs_matching_filename
+  (struct objfile *objfile,
+   const char *name,
+   const char *real_path,
+   gdb::function_view<bool (symtab *)> callback)
 {
   struct partial_symtab *pst;
   const char *name_basename = lbasename (name);
@@ -177,8 +175,8 @@ psym_map_symtabs_matching_filename (struct objfile *objfile,
     if (compare_filenames_for_search (pst->filename, name))
       {
        if (partial_map_expand_apply (objfile, name, real_path,
-                                     pst, callback, data))
-         return 1;
+                                     pst, callback))
+         return true;
        continue;
       }
 
@@ -191,8 +189,8 @@ psym_map_symtabs_matching_filename (struct objfile *objfile,
     if (compare_filenames_for_search (psymtab_to_fullname (pst), name))
       {
        if (partial_map_expand_apply (objfile, name, real_path,
-                                     pst, callback, data))
-         return 1;
+                                     pst, callback))
+         return true;
        continue;
       }
 
@@ -205,14 +203,14 @@ psym_map_symtabs_matching_filename (struct objfile *objfile,
        if (filename_cmp (psymtab_to_fullname (pst), real_path) == 0)
          {
            if (partial_map_expand_apply (objfile, name, real_path,
-                                         pst, callback, data))
-             return 1;
+                                         pst, callback))
+             return true;
            continue;
          }
       }
   }
 
-  return 0;
+  return false;
 }
 
 /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
@@ -1291,17 +1289,15 @@ psym_map_matching_symbols (struct objfile *objfile,
     }
 }
 
-/* A helper for psym_expand_symtabs_matching that handles
-   searching included psymtabs.  This returns 1 if a symbol is found,
-   and zero otherwise.  It also updates the 'searched_flag' on the
+/* A helper for psym_expand_symtabs_matching that handles searching
+   included psymtabs.  This returns true if a symbol is found, and
+   false otherwise.  It also updates the 'searched_flag' on the
    various psymtabs that it searches.  */
 
-static int
-recursively_search_psymtabs (struct partial_symtab *ps,
-                            struct objfile *objfile,
-                            enum search_domain kind,
-                            expand_symtabs_symbol_matcher_ftype *sym_matcher,
-                            void *data)
+static bool
+recursively_search_psymtabs
+  (struct partial_symtab *ps, struct objfile *objfile, enum search_domain kind,
+   gdb::function_view<expand_symtabs_symbol_matcher_ftype> sym_matcher)
 {
   struct partial_symbol **psym;
   struct partial_symbol **bound, **gbound, **sbound;
@@ -1323,11 +1319,11 @@ recursively_search_psymtabs (struct partial_symtab *ps,
        continue;
 
       r = recursively_search_psymtabs (ps->dependencies[i],
-                                      objfile, kind, sym_matcher, data);
+                                      objfile, kind, sym_matcher);
       if (r != 0)
        {
          ps->searched_flag = PST_SEARCHED_AND_FOUND;
-         return 1;
+         return true;
        }
     }
 
@@ -1365,7 +1361,7 @@ recursively_search_psymtabs (struct partial_symtab *ps,
                   && PSYMBOL_CLASS (*psym) == LOC_BLOCK)
               || (kind == TYPES_DOMAIN
                   && PSYMBOL_CLASS (*psym) == LOC_TYPEDEF))
-             && (*sym_matcher) (SYMBOL_SEARCH_NAME (*psym), data))
+             && sym_matcher (SYMBOL_SEARCH_NAME (*psym)))
            {
              /* Found a match, so notify our caller.  */
              result = PST_SEARCHED_AND_FOUND;
@@ -1385,11 +1381,10 @@ recursively_search_psymtabs (struct partial_symtab *ps,
 static void
 psym_expand_symtabs_matching
   (struct objfile *objfile,
-   expand_symtabs_file_matcher_ftype *file_matcher,
-   expand_symtabs_symbol_matcher_ftype *symbol_matcher,
-   expand_symtabs_exp_notify_ftype *expansion_notify,
-   enum search_domain kind,
-   void *data)
+   gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
+   gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
+   gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
+   enum search_domain kind)
 {
   struct partial_symtab *ps;
 
@@ -1413,31 +1408,31 @@ psym_expand_symtabs_matching
 
       if (file_matcher)
        {
-         int match;
+         bool match;
 
          if (ps->anonymous)
            continue;
 
-         match = (*file_matcher) (ps->filename, data, 0);
+         match = file_matcher (ps->filename, false);
          if (!match)
            {
              /* Before we invoke realpath, which can get expensive when many
                 files are involved, do a quick comparison of the basenames.  */
              if (basenames_may_differ
-                 || (*file_matcher) (lbasename (ps->filename), data, 1))
-               match = (*file_matcher) (psymtab_to_fullname (ps), data, 0);
+                 || file_matcher (lbasename (ps->filename), true))
+               match = file_matcher (psymtab_to_fullname (ps), false);
            }
          if (!match)
            continue;
        }
 
-      if (recursively_search_psymtabs (ps, objfile, kind, symbol_matcher, data))
+      if (recursively_search_psymtabs (ps, objfile, kind, symbol_matcher))
        {
          struct compunit_symtab *symtab =
            psymtab_to_symtab (objfile, ps);
 
          if (expansion_notify != NULL)
-           expansion_notify (symtab, data);
+           expansion_notify (symtab);
        }
     }
 }
index 80039a015e729640d3ac65157db49d8876035cbe..5ca1fa73fff2d64755f89a09be7870caea9bcce7 100644 (file)
@@ -117,28 +117,23 @@ debug_qf_forget_cached_source_info (struct objfile *objfile)
   debug_data->real_sf->qf->forget_cached_source_info (objfile);
 }
 
-static int
-debug_qf_map_symtabs_matching_filename (struct objfile *objfile,
-                                       const char *name,
-                                       const char *real_path,
-                                       int (*callback) (struct symtab *,
-                                                        void *),
-                                       void *data)
+static bool
+debug_qf_map_symtabs_matching_filename
+  (struct objfile *objfile, const char *name, const char *real_path,
+   gdb::function_view<bool (symtab *)> callback)
 {
   const struct debug_sym_fns_data *debug_data
     = ((const struct debug_sym_fns_data *)
        objfile_data (objfile, symfile_debug_objfile_data_key));
-  int retval;
 
   fprintf_filtered (gdb_stdlog,
-                   "qf->map_symtabs_matching_filename (%s, \"%s\", \"%s\", %s, %s)\n",
+                   "qf->map_symtabs_matching_filename (%s, \"%s\", \"%s\", %s)\n",
                    objfile_debug_name (objfile), name,
                    real_path ? real_path : NULL,
-                   host_address_to_string (callback),
-                   host_address_to_string (data));
+                   host_address_to_string (&callback));
 
-  retval = debug_data->real_sf->qf->map_symtabs_matching_filename
-    (objfile, name, real_path, callback, data);
+  bool retval = (debug_data->real_sf->qf->map_symtabs_matching_filename
+                (objfile, name, real_path, callback));
 
   fprintf_filtered (gdb_stdlog,
                    "qf->map_symtabs_matching_filename (...) = %d\n",
@@ -291,29 +286,28 @@ debug_qf_map_matching_symbols (struct objfile *objfile,
 static void
 debug_qf_expand_symtabs_matching
   (struct objfile *objfile,
-   expand_symtabs_file_matcher_ftype *file_matcher,
-   expand_symtabs_symbol_matcher_ftype *symbol_matcher,
-   expand_symtabs_exp_notify_ftype *expansion_notify,
-   enum search_domain kind, void *data)
+   gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
+   gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
+   gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
+   enum search_domain kind)
 {
   const struct debug_sym_fns_data *debug_data
     = ((const struct debug_sym_fns_data *)
        objfile_data (objfile, symfile_debug_objfile_data_key));
 
   fprintf_filtered (gdb_stdlog,
-                   "qf->expand_symtabs_matching (%s, %s, %s, %s, %s, %s)\n",
+                   "qf->expand_symtabs_matching (%s, %s, %s, %s, %s)\n",
                    objfile_debug_name (objfile),
-                   host_address_to_string (file_matcher),
-                   host_address_to_string (symbol_matcher),
-                   host_address_to_string (expansion_notify),
-                   search_domain_name (kind),
-                   host_address_to_string (data));
+                   host_address_to_string (&file_matcher),
+                   host_address_to_string (&symbol_matcher),
+                   host_address_to_string (&expansion_notify),
+                   search_domain_name (kind));
 
   debug_data->real_sf->qf->expand_symtabs_matching (objfile,
                                                    file_matcher,
                                                    symbol_matcher,
                                                    expansion_notify,
-                                                   kind, data);
+                                                   kind);
 }
 
 static struct compunit_symtab *
index f2528fcea92b7edaa5d8fb1ddf8ad3cfb50439c3..8b795085437829b63424fddbb37bcff8b176249c 100644 (file)
@@ -3856,11 +3856,11 @@ symfile_free_objfile (struct objfile *objfile)
    See quick_symbol_functions.expand_symtabs_matching for details.  */
 
 void
-expand_symtabs_matching (expand_symtabs_file_matcher_ftype *file_matcher,
-                        expand_symtabs_symbol_matcher_ftype *symbol_matcher,
-                        expand_symtabs_exp_notify_ftype *expansion_notify,
-                        enum search_domain kind,
-                        void *data)
+expand_symtabs_matching
+  (gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
+   gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
+   gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
+   enum search_domain kind)
 {
   struct objfile *objfile;
 
@@ -3869,8 +3869,7 @@ expand_symtabs_matching (expand_symtabs_file_matcher_ftype *file_matcher,
     if (objfile->sf)
       objfile->sf->qf->expand_symtabs_matching (objfile, file_matcher,
                                                symbol_matcher,
-                                               expansion_notify, kind,
-                                               data);
+                                               expansion_notify, kind);
   }
 }
 
index 02aee8df7910a4af0070d4f76ecd18f3f903a021..c3e7a314c9cbcd930f17c6f88f12b7ec4b802aeb 100644 (file)
@@ -26,6 +26,7 @@
 #include "symfile-add-flags.h"
 #include "objfile-flags.h"
 #include "gdb_bfd.h"
+#include "common/function-view.h"
 
 /* Opaque declarations.  */
 struct target_section;
@@ -133,20 +134,18 @@ typedef void (symbol_filename_ftype) (const char *filename,
 /* Callback for quick_symbol_functions->expand_symtabs_matching
    to match a file name.  */
 
-typedef int (expand_symtabs_file_matcher_ftype) (const char *filename,
-                                                void *data, int basenames);
+typedef bool (expand_symtabs_file_matcher_ftype) (const char *filename,
+                                                 bool basenames);
 
 /* Callback for quick_symbol_functions->expand_symtabs_matching
    to match a symbol name.  */
 
-typedef int (expand_symtabs_symbol_matcher_ftype) (const char *name,
-                                                  void *data);
+typedef bool (expand_symtabs_symbol_matcher_ftype) (const char *name);
 
 /* Callback for quick_symbol_functions->expand_symtabs_matching
    to be called after a symtab has been expanded.  */
 
-typedef void (expand_symtabs_exp_notify_ftype) \
-  (struct compunit_symtab *symtab, void *data);
+typedef void (expand_symtabs_exp_notify_ftype) (compunit_symtab *symtab);
 
 /* The "quick" symbol functions exist so that symbol readers can
    avoiding an initial read of all the symbols.  For example, symbol
@@ -189,14 +188,11 @@ struct quick_symbol_functions
 
      If a match is found, the "partial" symbol table is expanded.
      Then, this calls iterate_over_some_symtabs (or equivalent) over
-     all newly-created symbol tables, passing CALLBACK and DATA to it.
+     all newly-created symbol tables, passing CALLBACK to it.
      The result of this call is returned.  */
-  int (*map_symtabs_matching_filename) (struct objfile *objfile,
-                                       const char *name,
-                                       const char *real_path,
-                                       int (*callback) (struct symtab *,
-                                                        void *),
-                                       void *data);
+  bool (*map_symtabs_matching_filename)
+    (struct objfile *objfile, const char *name, const char *real_path,
+     gdb::function_view<bool (symtab *)> callback);
 
   /* Check to see if the symbol is defined in a "partial" symbol table
      of OBJFILE.  BLOCK_INDEX should be either GLOBAL_BLOCK or STATIC_BLOCK,
@@ -272,30 +268,27 @@ struct quick_symbol_functions
   /* Expand all symbol tables in OBJFILE matching some criteria.
 
      FILE_MATCHER is called for each file in OBJFILE.  The file name
-     and the DATA argument are passed to it.  If it returns zero, this
-     file is skipped.  If FILE_MATCHER is NULL such file is not skipped.
-     If BASENAMES is non-zero the function should consider only base name of
-     DATA (passed file name is already only the lbasename part).
+     is passed to it.  If the matcher returns false, the file is
+     skipped.  If FILE_MATCHER is NULL the file is not skipped.  If
+     BASENAMES is true the matcher should consider only file base
+     names (the passed file name is already only the lbasename'd
+     part).
 
-     Otherwise, if KIND does not match this symbol is skipped.
+     Otherwise, if KIND does not match, this symbol is skipped.
 
-     If even KIND matches, then SYMBOL_MATCHER is called for each symbol
-     defined in the file.  The symbol "search" name and DATA are passed
-     to SYMBOL_MATCHER.
+     If even KIND matches, SYMBOL_MATCHER is called for each symbol
+     defined in the file.  The symbol "search" name is passed to
+     SYMBOL_MATCHER.
 
-     If SYMBOL_MATCHER returns zero, then this symbol is skipped.
+     If SYMBOL_MATCHER returns false, then the symbol is skipped.
 
-     Otherwise, this symbol's symbol table is expanded.
-
-     DATA is user data that is passed unmodified to the callback
-     functions.  */
+     Otherwise, the symbol's symbol table is expanded.  */
   void (*expand_symtabs_matching)
     (struct objfile *objfile,
-     expand_symtabs_file_matcher_ftype *file_matcher,
-     expand_symtabs_symbol_matcher_ftype *symbol_matcher,
-     expand_symtabs_exp_notify_ftype *expansion_notify,
-     enum search_domain kind,
-     void *data);
+     gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
+     gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
+     gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
+     enum search_domain kind);
 
   /* Return the comp unit from OBJFILE that contains PC and
      SECTION.  Return NULL if there is no such compunit.  This
@@ -565,10 +558,11 @@ void free_symfile_segment_data (struct symfile_segment_data *data);
 
 extern struct cleanup *increment_reading_symtab (void);
 
-void expand_symtabs_matching (expand_symtabs_file_matcher_ftype *,
-                             expand_symtabs_symbol_matcher_ftype *,
-                             expand_symtabs_exp_notify_ftype *,
-                             enum search_domain kind, void *data);
+void expand_symtabs_matching
+  (gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
+   gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher,
+   gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
+   enum search_domain kind);
 
 void map_symbol_filenames (symbol_filename_ftype *fun, void *data,
                           int need_fullname);
index ab50570b9610ca52952ed535ae03b7ad7d683208..32a53318a8c46d9e78522ab3cafcd5a6802db639 100644 (file)
@@ -937,37 +937,6 @@ maintenance_check_symtabs (char *ignore, int from_tty)
     }
 }
 
-/* Helper function for maintenance_expand_symtabs.
-   This is the name_matcher function for expand_symtabs_matching.  */
-
-static int
-maintenance_expand_name_matcher (const char *symname, void *data)
-{
-  /* Since we're not searching on symbols, just return TRUE.  */
-  return 1;
-}
-
-/* Helper function for maintenance_expand_symtabs.
-   This is the file_matcher function for expand_symtabs_matching.  */
-
-static int
-maintenance_expand_file_matcher (const char *filename, void *data,
-                                int basenames)
-{
-  const char *regexp = (const char *) data;
-
-  QUIT;
-
-  /* KISS: Only apply the regexp to the complete file name.  */
-  if (basenames)
-    return 0;
-
-  if (regexp == NULL || re_exec (filename))
-    return 1;
-
-  return 0;
-}
-
 /* Expand all symbol tables whose name matches an optional regexp.  */
 
 static void
@@ -1003,8 +972,20 @@ maintenance_expand_symtabs (char *args, int from_tty)
       if (objfile->sf)
        {
          objfile->sf->qf->expand_symtabs_matching
-           (objfile, maintenance_expand_file_matcher,
-            maintenance_expand_name_matcher, NULL, ALL_DOMAIN, regexp);
+           (objfile,
+            [&] (const char *filename, bool basenames)
+            {
+              /* KISS: Only apply the regexp to the complete file name.  */
+              return (!basenames
+                      && (regexp == NULL || re_exec (filename)));
+            },
+            [] (const char *symname)
+            {
+              /* Since we're not searching on symbols, just return true.  */
+              return true;
+            },
+            NULL,
+            ALL_DOMAIN);
        }
     }
 
index 2c141e5a59d51f22dce5762ffb0085a15b10ae68..b9f4f7747ad53227d14b7ce335d81122c4aa7aad 100644 (file)
@@ -382,23 +382,20 @@ compare_glob_filenames_for_search (const char *filename,
    If NAME is not absolute, then REAL_PATH is NULL
    If NAME is absolute, then REAL_PATH is the gdb_realpath form of NAME.
 
-   The return value, NAME, REAL_PATH, CALLBACK, and DATA
-   are identical to the `map_symtabs_matching_filename' method of
-   quick_symbol_functions.
+   The return value, NAME, REAL_PATH and CALLBACK are identical to the
+   `map_symtabs_matching_filename' method of quick_symbol_functions.
 
    FIRST and AFTER_LAST indicate the range of compunit symtabs to search.
    Each symtab within the specified compunit symtab is also searched.
    AFTER_LAST is one past the last compunit symtab to search; NULL means to
    search until the end of the list.  */
 
-int
+bool
 iterate_over_some_symtabs (const char *name,
                           const char *real_path,
-                          int (*callback) (struct symtab *symtab,
-                                           void *data),
-                          void *data,
                           struct compunit_symtab *first,
-                          struct compunit_symtab *after_last)
+                          struct compunit_symtab *after_last,
+                          gdb::function_view<bool (symtab *)> callback)
 {
   struct compunit_symtab *cust;
   struct symtab *s;
@@ -410,8 +407,8 @@ iterate_over_some_symtabs (const char *name,
        {
          if (compare_filenames_for_search (s->filename, name))
            {
-             if (callback (s, data))
-               return 1;
+             if (callback (s))
+               return true;
              continue;
            }
 
@@ -423,8 +420,8 @@ iterate_over_some_symtabs (const char *name,
 
          if (compare_filenames_for_search (symtab_to_fullname (s), name))
            {
-             if (callback (s, data))
-               return 1;
+             if (callback (s))
+               return true;
              continue;
            }
 
@@ -438,82 +435,59 @@ iterate_over_some_symtabs (const char *name,
              gdb_assert (IS_ABSOLUTE_PATH (name));
              if (FILENAME_CMP (real_path, fullname) == 0)
                {
-                 if (callback (s, data))
-                   return 1;
+                 if (callback (s))
+                   return true;
                  continue;
                }
            }
        }
     }
 
-  return 0;
+  return false;
 }
 
 /* Check for a symtab of a specific name; first in symtabs, then in
    psymtabs.  *If* there is no '/' in the name, a match after a '/'
    in the symtab filename will also work.
 
-   Calls CALLBACK with each symtab that is found and with the supplied
-   DATA.  If CALLBACK returns true, the search stops.  */
+   Calls CALLBACK with each symtab that is found.  If CALLBACK returns
+   true, the search stops.  */
 
 void
 iterate_over_symtabs (const char *name,
-                     int (*callback) (struct symtab *symtab,
-                                      void *data),
-                     void *data)
+                     gdb::function_view<bool (symtab *)> callback)
 {
   struct objfile *objfile;
-  char *real_path = NULL;
-  struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
+  gdb::unique_xmalloc_ptr<char> real_path;
 
   /* Here we are interested in canonicalizing an absolute path, not
      absolutizing a relative path.  */
   if (IS_ABSOLUTE_PATH (name))
     {
-      real_path = gdb_realpath (name);
-      make_cleanup (xfree, real_path);
-      gdb_assert (IS_ABSOLUTE_PATH (real_path));
+      real_path.reset (gdb_realpath (name));
+      gdb_assert (IS_ABSOLUTE_PATH (real_path.get ()));
     }
 
   ALL_OBJFILES (objfile)
-  {
-    if (iterate_over_some_symtabs (name, real_path, callback, data,
-                                  objfile->compunit_symtabs, NULL))
-      {
-       do_cleanups (cleanups);
+    {
+      if (iterate_over_some_symtabs (name, real_path.get (),
+                                    objfile->compunit_symtabs, NULL,
+                                    callback))
        return;
-      }
-  }
+    }
 
   /* Same search rules as above apply here, but now we look thru the
      psymtabs.  */
 
   ALL_OBJFILES (objfile)
-  {
-    if (objfile->sf
-       && objfile->sf->qf->map_symtabs_matching_filename (objfile,
-                                                          name,
-                                                          real_path,
-                                                          callback,
-                                                          data))
-      {
-       do_cleanups (cleanups);
+    {
+      if (objfile->sf
+         && objfile->sf->qf->map_symtabs_matching_filename (objfile,
+                                                            name,
+                                                            real_path.get (),
+                                                            callback))
        return;
-      }
-  }
-
-  do_cleanups (cleanups);
-}
-
-/* The callback function used by lookup_symtab.  */
-
-static int
-lookup_symtab_callback (struct symtab *symtab, void *data)
-{
-  struct symtab **result_ptr = (struct symtab **) data;
-
-  *result_ptr = symtab;
-  return 1;
+    }
 }
 
 /* A wrapper for iterate_over_symtabs that returns the first matching
@@ -524,7 +498,12 @@ lookup_symtab (const char *name)
 {
   struct symtab *result = NULL;
 
-  iterate_over_symtabs (name, lookup_symtab_callback, &result);
+  iterate_over_symtabs (name, [&] (symtab *symtab)
+    {
+      result = symtab;
+      return true;
+    });
+
   return result;
 }
 
@@ -2777,18 +2756,17 @@ basic_lookup_transparent_type (const char *name)
 }
 
 /* Iterate over the symbols named NAME, matching DOMAIN, in BLOCK.
-   
-   For each symbol that matches, CALLBACK is called.  The symbol and
-   DATA are passed to the callback.
-   
-   If CALLBACK returns zero, the iteration ends.  Otherwise, the
+
+   For each symbol that matches, CALLBACK is called.  The symbol is
+   passed to the callback.
+
+   If CALLBACK returns false, the iteration ends.  Otherwise, the
    search continues.  */
 
 void
 iterate_over_symbols (const struct block *block, const char *name,
                      const domain_enum domain,
-                     symbol_found_callback_ftype *callback,
-                     void *data)
+                     gdb::function_view<symbol_found_callback_ftype> callback)
 {
   struct block_iterator iter;
   struct symbol *sym;
@@ -2798,7 +2776,7 @@ iterate_over_symbols (const struct block *block, const char *name,
       if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
                                 SYMBOL_DOMAIN (sym), domain))
        {
-         if (!callback (sym, data))
+         if (!callback (sym))
            return;
        }
     }
@@ -4282,39 +4260,6 @@ sort_search_symbols_remove_dups (struct symbol_search *found, int nfound,
   xfree (symbols);
 }
 
-/* An object of this type is passed as the user_data to the
-   expand_symtabs_matching method.  */
-struct search_symbols_data
-{
-  int nfiles;
-  const char **files;
-
-  /* It is true if PREG contains valid data, false otherwise.  */
-  unsigned preg_p : 1;
-  regex_t preg;
-};
-
-/* A callback for expand_symtabs_matching.  */
-
-static int
-search_symbols_file_matches (const char *filename, void *user_data,
-                            int basenames)
-{
-  struct search_symbols_data *data = (struct search_symbols_data *) user_data;
-
-  return file_matches (filename, data->files, data->nfiles, basenames);
-}
-
-/* A callback for expand_symtabs_matching.  */
-
-static int
-search_symbols_name_matches (const char *symname, void *user_data)
-{
-  struct search_symbols_data *data = (struct search_symbols_data *) user_data;
-
-  return !data->preg_p || regexec (&data->preg, symname, 0, NULL, 0) == 0;
-}
-
 /* Search the symbol table for matches to the regular expression REGEXP,
    returning the results in *MATCHES.
 
@@ -4359,8 +4304,10 @@ search_symbols (const char *regexp, enum search_domain kind,
   enum minimal_symbol_type ourtype4;
   struct symbol_search *found;
   struct symbol_search *tail;
-  struct search_symbols_data datum;
   int nfound;
+  /* This is true if PREG contains valid data, false otherwise.  */
+  bool preg_p;
+  regex_t preg;
 
   /* OLD_CHAIN .. RETVAL_CHAIN is always freed, RETVAL_CHAIN .. current
      CLEANUP_CHAIN is freed only in the case of an error.  */
@@ -4375,7 +4322,7 @@ search_symbols (const char *regexp, enum search_domain kind,
   ourtype4 = types4[kind];
 
   *matches = NULL;
-  datum.preg_p = 0;
+  preg_p = false;
 
   if (regexp != NULL)
     {
@@ -4414,31 +4361,35 @@ search_symbols (const char *regexp, enum search_domain kind,
            }
        }
 
-      errcode = regcomp (&datum.preg, regexp,
+      errcode = regcomp (&preg, regexp,
                         REG_NOSUB | (case_sensitivity == case_sensitive_off
                                      ? REG_ICASE : 0));
       if (errcode != 0)
        {
-         char *err = get_regcomp_error (errcode, &datum.preg);
+         char *err = get_regcomp_error (errcode, &preg);
 
          make_cleanup (xfree, err);
          error (_("Invalid regexp (%s): %s"), err, regexp);
        }
-      datum.preg_p = 1;
-      make_regfree_cleanup (&datum.preg);
+      preg_p = true;
+      make_regfree_cleanup (&preg);
     }
 
   /* Search through the partial symtabs *first* for all symbols
      matching the regexp.  That way we don't have to reproduce all of
      the machinery below.  */
-
-  datum.nfiles = nfiles;
-  datum.files = files;
-  expand_symtabs_matching ((nfiles == 0
-                           ? NULL
-                           : search_symbols_file_matches),
-                          search_symbols_name_matches,
-                          NULL, kind, &datum);
+  expand_symtabs_matching ([&] (const char *filename, bool basenames)
+                          {
+                            return file_matches (filename, files, nfiles,
+                                                 basenames);
+                          },
+                          [&] (const char *symname)
+                          {
+                            return (!preg_p || regexec (&preg, symname,
+                                                        0, NULL, 0) == 0);
+                          },
+                          NULL,
+                          kind);
 
   /* Here, we search through the minimal symbol tables for functions
      and variables that match, and force their symbols to be read.
@@ -4470,8 +4421,8 @@ search_symbols (const char *regexp, enum search_domain kind,
            || MSYMBOL_TYPE (msymbol) == ourtype3
            || MSYMBOL_TYPE (msymbol) == ourtype4)
          {
-           if (!datum.preg_p
-               || regexec (&datum.preg, MSYMBOL_NATURAL_NAME (msymbol), 0,
+           if (!preg_p
+               || regexec (&preg, MSYMBOL_NATURAL_NAME (msymbol), 0,
                            NULL, 0) == 0)
              {
                /* Note: An important side-effect of these lookup functions
@@ -4514,8 +4465,8 @@ search_symbols (const char *regexp, enum search_domain kind,
                                       files, nfiles, 1))
                     && file_matches (symtab_to_fullname (real_symtab),
                                      files, nfiles, 0)))
-               && ((!datum.preg_p
-                    || regexec (&datum.preg, SYMBOL_NATURAL_NAME (sym), 0,
+               && ((!preg_p
+                    || regexec (&preg, SYMBOL_NATURAL_NAME (sym), 0,
                                 NULL, 0) == 0)
                    && ((kind == VARIABLES_DOMAIN
                         && SYMBOL_CLASS (sym) != LOC_TYPEDEF
@@ -4572,8 +4523,8 @@ search_symbols (const char *regexp, enum search_domain kind,
            || MSYMBOL_TYPE (msymbol) == ourtype3
            || MSYMBOL_TYPE (msymbol) == ourtype4)
          {
-           if (!datum.preg_p
-               || regexec (&datum.preg, MSYMBOL_NATURAL_NAME (msymbol), 0,
+           if (!preg_p
+               || regexec (&preg, MSYMBOL_NATURAL_NAME (msymbol), 0,
                            NULL, 0) == 0)
              {
                /* For functions we can do a quick check of whether the
@@ -5110,46 +5061,6 @@ completion_list_add_fields (struct symbol *sym, const char *sym_text,
     }
 }
 
-/* Type of the user_data argument passed to add_macro_name,
-   symbol_completion_matcher and symtab_expansion_callback.  */
-
-struct add_name_data
-{
-  /* Arguments required by completion_list_add_name.  */
-  const char *sym_text;
-  int sym_text_len;
-  const char *text;
-  const char *word;
-
-  /* Extra argument required for add_symtab_completions.  */
-  enum type_code code;
-};
-
-/* A callback used with macro_for_each and macro_for_each_in_scope.
-   This adds a macro's name to the current completion list.  */
-
-static void
-add_macro_name (const char *name, const struct macro_definition *ignore,
-               struct macro_source_file *ignore2, int ignore3,
-               void *user_data)
-{
-  struct add_name_data *datum = (struct add_name_data *) user_data;
-
-  completion_list_add_name (name,
-                           datum->sym_text, datum->sym_text_len,
-                           datum->text, datum->word);
-}
-
-/* A callback for expand_symtabs_matching.  */
-
-static int
-symbol_completion_matcher (const char *name, void *user_data)
-{
-  struct add_name_data *datum = (struct add_name_data *) user_data;
-
-  return compare_symbol_name (name, datum->sym_text, datum->sym_text_len);
-}
-
 /* Add matching symbols from SYMTAB to the current completion list.  */
 
 static void
@@ -5182,21 +5093,6 @@ add_symtab_completions (struct compunit_symtab *cust,
     }
 }
 
-/* Callback to add completions to the current list when symbol tables
-   are expanded during completion list generation.  */
-
-static void
-symtab_expansion_callback (struct compunit_symtab *symtab,
-                          void *user_data)
-{
-  struct add_name_data *datum = (struct add_name_data *) user_data;
-
-  add_symtab_completions (symtab,
-                         datum->sym_text, datum->sym_text_len,
-                         datum->text, datum->word,
-                         datum->code);
-}
-
 static void
 default_make_symbol_completion_list_break_on_1 (const char *text,
                                                const char *word,
@@ -5218,7 +5114,6 @@ default_make_symbol_completion_list_break_on_1 (const char *text,
   const char *sym_text;
   /* Length of sym_text.  */
   int sym_text_len;
-  struct add_name_data datum;
   struct cleanup *cleanups;
 
   /* Now look for the symbol we are supposed to complete on.  */
@@ -5292,12 +5187,6 @@ default_make_symbol_completion_list_break_on_1 (const char *text,
   completion_tracker = new_completion_tracker ();
   cleanups = make_cleanup_free_completion_tracker (&completion_tracker);
 
-  datum.sym_text = sym_text;
-  datum.sym_text_len = sym_text_len;
-  datum.text = text;
-  datum.word = word;
-  datum.code = code;
-
   /* At this point scan through the misc symbol vectors and add each
      symbol you find to the list.  Eventually we want to ignore
      anything that isn't a text symbol (everything else will be
@@ -5321,13 +5210,22 @@ default_make_symbol_completion_list_break_on_1 (const char *text,
     add_symtab_completions (cust, sym_text, sym_text_len, text, word,
                            code);
 
-  /* Look through the partial symtabs for all symbols which begin
-     by matching SYM_TEXT.  Expand all CUs that you find to the list.
-     symtab_expansion_callback is called for each expanded symtab,
-     causing those symtab's completions to be added to the list too.  */
-  expand_symtabs_matching (NULL, symbol_completion_matcher,
-                          symtab_expansion_callback, ALL_DOMAIN,
-                          &datum);
+  /* Look through the partial symtabs for all symbols which begin by
+     matching SYM_TEXT.  Expand all CUs that you find to the list.  */
+  expand_symtabs_matching (NULL,
+                          [&] (const char *name) /* symbol matcher */
+                            {
+                              return compare_symbol_name (name,
+                                                          sym_text,
+                                                          sym_text_len);
+                            },
+                          [&] (compunit_symtab *symtab) /* expansion notify */
+                            {
+                              add_symtab_completions (symtab,
+                                                      sym_text, sym_text_len,
+                                                      text, word, code);
+                            },
+                          ALL_DOMAIN);
 
   /* Search upwards from currently selected frame (so that we can
      complete on local vars).  Also catch fields of types defined in
@@ -5385,6 +5283,17 @@ default_make_symbol_completion_list_break_on_1 (const char *text,
     {
       struct macro_scope *scope;
 
+      /* This adds a macro's name to the current completion list.  */
+      auto add_macro_name = [&] (const char *macro_name,
+                                const macro_definition *,
+                                macro_source_file *,
+                                int)
+       {
+         completion_list_add_name (macro_name,
+                                   sym_text, sym_text_len,
+                                   text, word);
+       };
+
       /* Add any macros visible in the default scope.  Note that this
         may yield the occasional wrong result, because an expression
         might be evaluated in a scope other than the default.  For
@@ -5396,12 +5305,12 @@ default_make_symbol_completion_list_break_on_1 (const char *text,
       if (scope)
        {
          macro_for_each_in_scope (scope->file, scope->line,
-                                  add_macro_name, &datum);
+                                  add_macro_name);
          xfree (scope);
        }
 
       /* User-defined macros are always visible.  */
-      macro_for_each (macro_user_macros, add_macro_name, &datum);
+      macro_for_each (macro_user_macros, add_macro_name);
     }
 
   do_cleanups (cleanups);
index 88bdd27d60f370d06d64f3886746310917514a74..d8c665c82878c5059a9605a014e86f9b3cdc650a 100644 (file)
@@ -24,6 +24,7 @@
 #include "gdb_vecs.h"
 #include "gdbtypes.h"
 #include "common/enum-flags.h"
+#include "common/function-view.h"
 
 /* Opaque declarations.  */
 struct ui_file;
@@ -1607,35 +1608,29 @@ int compare_filenames_for_search (const char *filename,
 int compare_glob_filenames_for_search (const char *filename,
                                       const char *search_name);
 
-int iterate_over_some_symtabs (const char *name,
-                              const char *real_path,
-                              int (*callback) (struct symtab *symtab,
-                                               void *data),
-                              void *data,
-                              struct compunit_symtab *first,
-                              struct compunit_symtab *after_last);
+bool iterate_over_some_symtabs (const char *name,
+                               const char *real_path,
+                               struct compunit_symtab *first,
+                               struct compunit_symtab *after_last,
+                               gdb::function_view<bool (symtab *)> callback);
 
 void iterate_over_symtabs (const char *name,
-                          int (*callback) (struct symtab *symtab,
-                                           void *data),
-                          void *data);
+                          gdb::function_view<bool (symtab *)> callback);
+
 
 VEC (CORE_ADDR) *find_pcs_for_symtab_line (struct symtab *symtab, int line,
                                           struct linetable_entry **best_entry);
 
-/* Callback for LA_ITERATE_OVER_SYMBOLS.  The callback will be called
-   once per matching symbol SYM, with DATA being the argument of the
-   same name that was passed to LA_ITERATE_OVER_SYMBOLS.  The callback
-   should return nonzero to indicate that LA_ITERATE_OVER_SYMBOLS
-   should continue iterating, or zero to indicate that the iteration
-   should end.  */
+/* Prototype for callbacks for LA_ITERATE_OVER_SYMBOLS.  The callback
+   is called once per matching symbol SYM.  The callback should return
+   true to indicate that LA_ITERATE_OVER_SYMBOLS should continue
+   iterating, or false to indicate that the iteration should end.  */
 
-typedef int (symbol_found_callback_ftype) (struct symbol *sym, void *data);
+typedef bool (symbol_found_callback_ftype) (symbol *sym);
 
 void iterate_over_symbols (const struct block *block, const char *name,
                           const domain_enum domain,
-                          symbol_found_callback_ftype *callback,
-                          void *data);
+                          gdb::function_view<symbol_found_callback_ftype> callback);
 
 /* Storage type used by demangle_for_lookup.  demangle_for_lookup
    either returns a const char * pointer that points to either of the