From 6a3d403114ac013e8a5e9a8f9496b6d8fd6a8f99 Mon Sep 17 00:00:00 2001 From: Bryce McKinlay Date: Thu, 13 Sep 2001 23:20:19 +0000 Subject: Hashtable.java (Enumerator): Ensure that if hasMoreElements() returns true... * java/util/Hashtable.java (Enumerator): Ensure that if hasMoreElements() returns true, nextElement() will always return something even if the table has been modified. From-SVN: r45584 --- libjava/ChangeLog | 4 ++++ libjava/java/util/Hashtable.java | 47 +++++++++++++++++++++++++--------------- 2 files changed, 34 insertions(+), 17 deletions(-) (limited to 'libjava') diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 5530021..2278b73 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -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 * Makefile.in: Rebuilt. diff --git a/libjava/java/util/Hashtable.java b/libjava/java/util/Hashtable.java index 4475785..48939b2 100644 --- a/libjava/java/util/Hashtable.java +++ b/libjava/java/util/Hashtable.java @@ -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; } - } + } } -- cgit v1.1