(hash_delete): Step through the hash nodes versus using hash_next to
authorRichard Kenner <kenner@gcc.gnu.org>
Mon, 3 Feb 1997 00:42:48 +0000 (19:42 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 3 Feb 1997 00:42:48 +0000 (19:42 -0500)
increase efficiency.

From-SVN: r13593

gcc/objc/hash.c

index 4a1dca989d6fbe15922e602934cda8898c39a262..7534330fa1c786fc425f6c68d3c650f00a1e7092 100644 (file)
@@ -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);