Correct dict_hash to our most recent version.
authorPaul N. Hilfinger <hilfinger@adacore.com>
Thu, 7 Oct 2010 08:32:41 +0000 (08:32 +0000)
committerPaul N. Hilfinger <hilfinger@adacore.com>
Thu, 7 Oct 2010 08:32:41 +0000 (08:32 +0000)
Several changes to dict_hash from Adacore's local version were inadvertantly
left out of the last change to that function.  These changes conservatively
cause dict_hash to revert to msymbol_hash_iw in more cases where the symbol
being hashed is known not to be Ada-encoded.  This avoids a few cases where
the function hashes large groups of names with similar prefixes to the same
value.

Changelog:

gdb/
* dictionary.c (dict_hash): Revert to msymbol_hash_iw in
more cases.

gdb/ChangeLog
gdb/dictionary.c

index 803edfe6747c8e08f6af68cf8c0eeba71f543cfa..cb316143a5350bca5cacbb840a02e7d9f54b3989 100644 (file)
@@ -1,3 +1,8 @@
+2010-10-07  Paul Hilfinger  <hilfinger@adacore.com>
+
+       * dictionary.c (dict_hash): Revert to msymbol_hash_iw in
+       more cases.
+
 2010-10-07  Paul Hilfinger  <hilfinger@adacore.com>
 
         * ada-lang.c (full_match): Declare.
index f3ac3069adbea1cd70a7afca69ac4e0fdffbeb58..4f18e8c017962390a7a2f051baa91a447b3e1e3b 100644 (file)
@@ -786,7 +786,7 @@ expand_hashtable (struct dictionary *dict)
    comparison operators hash to the same value.  */
 
 static unsigned int
-dict_hash (const char *string)
+dict_hash (const char *string0)
 {
   /* The Ada-encoded version of a name P1.P2...Pn has either the form
      P1__P2__...Pn<suffix> or _ada_P1__P2__...Pn<suffix> (where the Pi
@@ -796,11 +796,18 @@ dict_hash (const char *string)
      does this for a superset of both valid Pi and of <suffix>, but 
      in other cases it simply returns msymbol_hash_iw(STRING0).  */
 
+  const char *string;
   unsigned int hash;
   int c;
 
-  if (*string == '_' && strncmp (string, "_ada_", 5) == 0)
-    string += 5;
+  string = string0;
+  if (*string == '_')
+    {
+      if (strncmp (string, "_ada_", 5) == 0)
+       string += 5;
+      else
+       return msymbol_hash_iw (string0);
+    }
 
   hash = 0;
   while (*string)
@@ -810,13 +817,15 @@ dict_hash (const char *string)
        case '$':
        case '.':
        case 'X':
-       case '(':
-         return hash;
+         if (string0 == string)
+           return msymbol_hash_iw (string0);
+         else
+           return hash;
        case ' ':
-         string += 1;
-         break;
+       case '(':
+         return msymbol_hash_iw (string0);
        case '_':
-         if (string[1] == '_')
+         if (string[1] == '_' && string != string0)
            {
              if (((c = string[2]) < 'a' || c > 'z') && c != 'O')
                return hash;