]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Split up a big 'if' in symtab.c
authorTom Tromey <tom@tromey.com>
Fri, 10 Mar 2023 18:48:25 +0000 (11:48 -0700)
committerTom Tromey <tom@tromey.com>
Sun, 28 Jan 2024 17:58:16 +0000 (10:58 -0700)
global_symbol_searcher::add_matching_symbols in symtab.c has a
gigantic 'if' statement -- 33 lines of conditional expression.  This
patch splits it up into a series of separate 'if's.

gdb/symtab.c

index b408941f998dc5e12ebb4e02be1951a2cd119853..2020210c5f41fc5a808948b951a189aced09fed3 100644 (file)
@@ -4855,39 +4855,56 @@ global_symbol_searcher::add_matching_symbols
              /* Check first sole REAL_SYMTAB->FILENAME.  It does
                 not need to be a substring of symtab_to_fullname as
                 it may contain "./" etc.  */
-             if ((file_matches (real_symtab->filename, filenames, false)
-                  || ((basenames_may_differ
-                       || file_matches (lbasename (real_symtab->filename),
-                                        filenames, true))
-                      && file_matches (symtab_to_fullname (real_symtab),
-                                       filenames, false)))
-                 && ((!preg.has_value ()
-                      || preg->exec (sym->natural_name (), 0,
-                                     NULL, 0) == 0)
-                     && ((kind == VARIABLES_DOMAIN
-                          && sym->aclass () != LOC_TYPEDEF
-                          && sym->aclass () != LOC_UNRESOLVED
-                          && sym->aclass () != LOC_BLOCK
-                          /* LOC_CONST can be used for more than
-                             just enums, e.g., c++ static const
-                             members.  We only want to skip enums
-                             here.  */
-                          && !(sym->aclass () == LOC_CONST
-                               && (sym->type ()->code ()
-                                   == TYPE_CODE_ENUM))
-                          && (!treg.has_value ()
-                              || treg_matches_sym_type_name (*treg, sym)))
-                         || (kind == FUNCTIONS_DOMAIN
-                             && sym->aclass () == LOC_BLOCK
-                             && (!treg.has_value ()
-                                 || treg_matches_sym_type_name (*treg,
-                                                                sym)))
-                         || (kind == TYPES_DOMAIN
-                             && sym->aclass () == LOC_TYPEDEF
-                             && sym->domain () != MODULE_DOMAIN)
-                         || (kind == MODULES_DOMAIN
-                             && sym->domain () == MODULE_DOMAIN
-                             && sym->line () != 0))))
+             if (!(file_matches (real_symtab->filename, filenames, false)
+                   || ((basenames_may_differ
+                        || file_matches (lbasename (real_symtab->filename),
+                                         filenames, true))
+                       && file_matches (symtab_to_fullname (real_symtab),
+                                        filenames, false))))
+               continue;
+
+             if (preg.has_value () && !preg->exec (sym->natural_name (), 0,
+                                                   nullptr, 0) == 0)
+               continue;
+
+             bool matches = false;
+             if (!matches && kind == VARIABLES_DOMAIN)
+               {
+                 if (sym->aclass () != LOC_TYPEDEF
+                     && sym->aclass () != LOC_UNRESOLVED
+                     && sym->aclass () != LOC_BLOCK
+                     /* LOC_CONST can be used for more than
+                        just enums, e.g., c++ static const
+                        members.  We only want to skip enums
+                        here.  */
+                     && !(sym->aclass () == LOC_CONST
+                          && (sym->type ()->code ()
+                              == TYPE_CODE_ENUM))
+                     && (!treg.has_value ()
+                         || treg_matches_sym_type_name (*treg, sym)))
+                   matches = true;
+               }
+             if (!matches && kind == FUNCTIONS_DOMAIN)
+               {
+                 if (sym->aclass () == LOC_BLOCK
+                     && (!treg.has_value ()
+                         || treg_matches_sym_type_name (*treg,
+                                                        sym)))
+                   matches = true;
+               }
+             if (!matches && kind == TYPES_DOMAIN)
+               {
+                 if (sym->aclass () == LOC_TYPEDEF
+                     && sym->domain () != MODULE_DOMAIN)
+                   matches = true;
+               }
+             if (!matches && kind == MODULES_DOMAIN)
+               {
+                 if (sym->domain () == MODULE_DOMAIN
+                     && sym->line () != 0)
+                   matches = true;
+               }
+             if (matches)
                {
                  if (result_set->size () < m_max_search_results)
                    {