OSDN Git Service

* java/util/Hashtable.java (Enumerator): Ensure that if
authorbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 13 Sep 2001 23:20:19 +0000 (23:20 +0000)
committerbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 13 Sep 2001 23:20:19 +0000 (23:20 +0000)
hasMoreElements() returns true, nextElement() will always return
something even if the table has been modified.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45584 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/java/util/Hashtable.java

index 5530021..2278b73 100644 (file)
@@ -3,6 +3,10 @@
        * java/io/File.java (normalizePath): Use equals() not '==' for string 
        comparison.
 
+       * java/util/Hashtable.java (Enumerator): Ensure that if 
+       hasMoreElements() returns true, nextElement() will always return
+       something even if the table has been modified.
+
 2001-09-12  Tom Tromey  <tromey@redhat.com>
 
        * Makefile.in: Rebuilt.
index 4475785..48939b2 100644 (file)
@@ -833,44 +833,57 @@ public class Hashtable extends Dictionary
     static final int VALUES = 1;
     
     int type;
-    // The total number of elements returned by nextElement(). Used to 
-    // determine if there are more elements remaining.
-    int count;
     // current index in the physical hash table.
     int idx;
-    // the last Entry returned.
+    // the last Entry returned by nextEntry().
     Entry last;
+    // Entry which will be returned by the next nextElement() call.
+    Entry next;
     
     Enumerator(int type)
     {
       this.type = type;
-      this.count = 0;
       this.idx = buckets.length;
     }
+    
+    private Entry nextEntry()
+    {
+      Entry e = null;
+
+      if (last != null)
+        e = last.next;
+
+      while (e == null && idx > 0)
+       {
+         e = buckets[--idx];
+       }
+      last = e;
+      return e;
+    }
 
     public boolean hasMoreElements()
     {
-      return count < Hashtable.this.size;    
+      if (next != null)
+        return true;
+      next = nextEntry();
+      return (next != null);
     }
 
     public Object nextElement()
     {
-      if (count >= size)
-        throw new NoSuchElementException();
-      count++;
       Entry e = null;
-      if (last != null)
-        e = last.next;
-
-      while (e == null)
+      if (next != null)
         {
-         e = buckets[--idx];
+          e = next;
+         next = null;
        }
-
-      last = e;
+      else
+        e = nextEntry();
+      if (e == null)
+        throw new NoSuchElementException("Hashtable Enumerator");
       if (type == VALUES)
         return e.value;
       return e.key;
     }
-  }  
+  }
 }