tab completion optimization
authorK. Richard Pixley <rich@cygnus>
Fri, 4 Sep 1992 21:03:18 +0000 (21:03 +0000)
committerK. Richard Pixley <rich@cygnus>
Fri, 4 Sep 1992 21:03:18 +0000 (21:03 +0000)
gdb/ChangeLog
gdb/symtab.c

index d903e3d6ad64dc3c3b21402e29b99f84ece0592c..992dcebbf105fd4ab6958a0b7b20588b002b7820 100644 (file)
@@ -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.
index cb97621d7a98114707dd1fe3be75f1bcc5294fe7..7146c35e64cd72b7166aca15b56abbe4357a39fc 100644 (file)
@@ -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