aboutsummaryrefslogtreecommitdiff
path: root/gcc/objc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1997-02-02 19:42:48 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1997-02-02 19:42:48 -0500
commit3cec07d501b9e0b836c8a7e9d709e7764aacf4e6 (patch)
tree845c31cfe2b7f3e331d782706f0d8c0ce1e43d80 /gcc/objc
parenteb0bc1e9b443cc206bff8d9a7d14c3fd38aca3b1 (diff)
downloadgcc-3cec07d501b9e0b836c8a7e9d709e7764aacf4e6.zip
gcc-3cec07d501b9e0b836c8a7e9d709e7764aacf4e6.tar.gz
gcc-3cec07d501b9e0b836c8a7e9d709e7764aacf4e6.tar.bz2
(hash_delete): Step through the hash nodes versus using hash_next to
increase efficiency. From-SVN: r13593
Diffstat (limited to 'gcc/objc')
-rw-r--r--gcc/objc/hash.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/gcc/objc/hash.c b/gcc/objc/hash.c
index 4a1dca9..7534330 100644
--- a/gcc/objc/hash.c
+++ b/gcc/objc/hash.c
@@ -1,5 +1,5 @@
/* Hash tables for Objective C internal structures
- Copyright (C) 1993, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1993, 1996, 1997 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -80,11 +80,24 @@ void
hash_delete (cache_ptr cache)
{
node_ptr node;
-
+ node_ptr next_node;
+ unsigned int i;
/* Purge all key/value pairs from the table. */
- while ((node = hash_next (cache, NULL)))
- hash_remove (cache, node->key);
+ /* Step through the nodes one by one and remove every node WITHOUT
+ using hash_next. this makes hash_delete much more efficient. */
+ for (i = 0;i < cache->size;i++) {
+ if ((node = cache->node_table[i])) {
+ /* an entry in the hash table has been found, now step through the
+ nodes next in the list and free them. */
+ while ((next_node = node->next)) {
+ hash_remove (cache,node->key);
+ node = next_node;
+ }
+
+ hash_remove (cache,node->key);
+ }
+ }
/* Release the array of nodes and the cache itself. */
objc_free(cache->node_table);
@@ -242,7 +255,7 @@ hash_value_for_key (cache_ptr cache, const void *key)
do {
if ((*cache->compare_func)(node->key, key)) {
retval = node->value;
- break;
+ break;
} else
node = node->next;
} while (!retval && node);