From 8005788cd1953745d42217ff91b271b4d074d06f Mon Sep 17 00:00:00 2001 From: "K. Richard Pixley" Date: Fri, 4 Sep 1992 21:03:18 +0000 Subject: [PATCH] tab completion optimization --- gdb/ChangeLog | 7 +++++++ gdb/symtab.c | 49 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d903e3d6ad6..992dcebbf10 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -81,6 +81,13 @@ Fri Sep 4 00:34:30 1992 Per Bothner (bothner@rtl.cygnus.com) match "FOO". This allows 'break Foo' to work when Foo is a mangled C++ function. (See comment before function.) +Thu Sep 3 13:44:46 1992 K. Richard Pixley (rich@sendai.cygnus.com) + + * symtab.c (completion_list_add_symbol): restructured to optimize + for time. First clip names that cannot match. Then clip any + names we've already considered. Drop a redundant strncpy. Drop + a redundant malloc and associated free for demangled names. + Thu Sep 3 09:17:05 1992 Stu Grossman (grossman at cygnus.com) * a68v-xdep.c (store_inferior_registers): Define as type void. diff --git a/gdb/symtab.c b/gdb/symtab.c index cb97621d7a9..7146c35e64c 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -2482,35 +2482,50 @@ completion_list_add_symbol (symname, text, text_len) { char *demangled; int newsize; + int i; + + /* clip symbols that cannot match */ + + if (!cplus_match (symname, text, text_len)) { + return; + } + + /* matches mangled, may match unmangled. now clip any symbol names + that we've already considered. (This is a time optimization) */ - /* First see if SYMNAME is a C++ mangled name, and if so, use the - demangled name instead, including any parameters. */ + for (i = 0; i < return_val_index; ++i) { + if (strcmp (symname, return_val[i]) == 0) { + return; + } + } + + /* See if SYMNAME is a C++ mangled name, and if so, use the + demangled name instead, including any parameters. */ if ((demangled = cplus_demangle (symname, DMGL_PARAMS | DMGL_ANSI)) != NULL) { + if (strncmp (demangled, text, text_len) != 0) { + return; + } /* demangled, but didn't match so clip it */ + symname = demangled; + } else { + symname = savestring (symname, strlen (symname)); } /* If we have a match for a completion, then add SYMNAME to the current - list of matches. Note that we always make a copy of the string, even - if it is one that was returned from cplus_demangle and is already - in malloc'd memory. */ + list of matches. Note that the name is in freshly malloc'd space; + either from cplus_demangle or from savestring above. */ - if (strncmp (symname, text, text_len) == 0) + if (return_val_index + 3 > return_val_size) { - if (return_val_index + 3 > return_val_size) - { - newsize = (return_val_size *= 2) * sizeof (char *); - return_val = (char **) xrealloc ((char *) return_val, newsize); - } - return_val[return_val_index++] = savestring (symname, strlen (symname)); - return_val[return_val_index] = NULL; + newsize = (return_val_size *= 2) * sizeof (char *); + return_val = (char **) xrealloc ((char *) return_val, newsize); } + return_val[return_val_index++] = symname; + return_val[return_val_index] = NULL; - if (demangled != NULL) - { - free (demangled); - } + return; } /* Return a NULL terminated array of all symbols (regardless of class) which -- 2.30.2