[commit] Correct dict_hash to our most recent version.

Paul Hilfinger, :
2010-10-07T08:44:14Z

Sigh. I must stop working late at night. I have corrected my last
checkin of dictionary.c:dict_hash to include the code that the
comments in my commit message was actually discussing (deferring to
msymbol_hash_iw in a few more cases to avoid some nasty hash
collisions). While I should ask for another round of approval
technically, for expendience I'm going to go out on a limb and check
this in now, since it passes the testsuite, isn't likely to provoke
a violent reaction, given that my first version didn't, and is easily
undone in any case.

Paul Hilfinger

Changelog:

gdb/
* dictionary.c (dict_hash): Revert to msymbol_hash_iw in
more cases.
---
gdb/ChangeLog | 5 +++++
gdb/dictionary.c | 25 +++++++++++++++++--------
2 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/gdb/dictionary.c b/gdb/dictionary.c
index f3ac306..4f18e8c 100644
--- a/gdb/dictionary.c
+++ b/gdb/dictionary.c
@@ -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;
--
1.7.0.4

--
Paul N. Hilfinger
(Hilfinger@adacore.com)